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;
}