上一篇文章《手把手教你写rpc框架系列(九)关于服务端网络通信框架的选型》我们介绍了网络通信这块,那么接下来我们需要做的就是需要定义一个网络通信模块的二进制协议,这里定义二进制协议其实逻辑比较简单,主要是定义request应该是什么样子的,response应该是什么样子的,所以这里还是比较简单,我们结合http的模式来定义这里的二进制协议即可,所以request里面,我们需要定义以下几个指标:
servicename method headers parameters parameterTypes
结合这几个参数,我们定义的request就是:
package org.wz.rpc.framework.protocol; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.ToString; @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @ToString @Builder public class MessageRequest implements Serializable{ /** * */ private static final long serialVersionUID = -8810490758663025700L; private String serviceName; private String method; private Map<String, String> headers = new HashMap<String, String>(); private Class<?>[] parameterTypes; private Object[] parameters; }
request定义好了之后,接下来我们就定义response即可,response的话,我们也结合http来考虑以下的几个要素,分别是:
status headers returnValue exception
所以这里我们的response代码是:
package org.wz.rpc.framework.protocol; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.ToString; @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @ToString @Builder public class MessageResponse implements Serializable{ /** * */ private static final long serialVersionUID = 69429744975615692L; private MessageStatus status; private Map<String, String> headers = new HashMap<String, String>(); private Object returnValue; private Exception exception; }
集合这里的request和response,我们就可以很容易的封装这里的通信协议。通信协议这里主要重在以下几个点,分别是:
编组消息体 解组消息体 编组响应 解组响应
因为我们来定制下这里的二进制协议:MessageProtocol,完整代码如下:
package org.wz.rpc.framework.protocol; /** * 消息协议,定义编组请求、解组请求、编组响应、解组响应规范 * */ public interface MessageProtocol { /** * 编组请求 * * @param req 请求信息 * @return 请求字节数组 * @throws Exception 编组请求异常 */ byte[] marshallingRequest(MessageRequest req) throws Exception; /** * 解组请求 * * @param data 请求字节数组 * @return 请求信息 * @throws Exception 解组请求异常 */ MessageRequest unmarshallingRequest(byte[] data) throws Exception; /** * 编组响应 * * @param rsp 响应信息 * @return 响应字节数组 * @throws Exception 编组响应异常 */ byte[] marshallingResponse(MessageResponse rsp) throws Exception; /** * 解组响应 * * @param data 响应字节数组 * @return 响应信息 * @throws Exception 解组响应异常 */ MessageResponse unmarshallingResponse(byte[] data) throws Exception; }
以上我们就实现了这里的二进制通信协议的定义了。看起来是不是很简单。这篇文章所涉及的代码块比较少,如下图:
最后附上本案例的源码,登录后即可下载。
还没有评论,来说两句吧...