?netty系列文章:
01-netty基礎-socket |
02-netty基礎-java四種IO模型 |
03-netty基礎-多路復用select、poll、epoll |
04-netty基礎-Reactor三種模型 |
05-netty基礎-ByteBuf數據結構 |
06-netty基礎-編碼解碼 |
07-netty基礎-自定義編解碼器 |
08-netty基礎-自定義序列化和反序列化 |
09-netty基礎-手寫rpc-原理-01 |
10-netty基礎-手寫rpc-定義協議頭-02 |
11-netty基礎-手寫rpc-支持多序列化協議-03 |
12-netty基礎-手寫rpc-編解碼-04 |
13-netty基礎-手寫rpc-消費方生成代理-05 |
14-netty基礎-手寫rpc-提供方(服務端)-06 |
1 自定義協議的形式
請求頭中包含:
- magic?魔數 short類型? 2字節
- serialType?序列化類型?byte類型 1字節
- reqType 消息類型?byte類型 1字節
- requestId 請求id long類型 8字節
- length 消息體長度 int類型 4字節
消息體content中分為請求類型是request、response的形式內容是不一樣的
- request請求
className?類名
methodName?請求目標方法
params 請求參數
parameterTypes?參數類型 - response響應
msg 響應結果? String類型 比如success? fail
data 響應數據? ?Object類型 比如方法的返回結果
2 具體的代碼
netty-protocol ?core包下
2.1?Header
package com.bonnie.protocol.core;import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** 協議頭*/
@Data
@NoArgsConstructor
public class Header implements Serializable {/*** 魔數 2字節*/private short magic;/*** 序列化類型 1個字節*/private byte serialType;/*** 消息類型 1個字節*/private byte reqType;/*** 請求id 8個字節*/private long requestId;/*** 消息體長度,4個字節*/private int length ;}
2.2?RpcProtocol
package com.bonnie.protocol.core;import lombok.Data;import java.io.Serializable;@Data
public class RpcProtocol <T> implements Serializable {/*** 請求頭*/private Header header;/*** 請求內容*/private T content;}
2.3?RpcRequest
package com.bonnie.protocol.core;import lombok.Data;import java.io.Serializable;@Data
public class RpcRequest implements Serializable {/*** 類名*/private String className;/*** 請求目標方法*/private String methodName;;/*** 請求參數*/private Object[] params;;/*** 參數類型*/private Class<?>[] parameterTypes;;}
2.4?RpcResponse
package com.bonnie.protocol.core;import lombok.Data;import java.io.Serializable;@Data
public class RpcResponse implements Serializable {private Object data;private String msg;}
?