diff --git a/README.md b/README.md index cf645da1cbd018835c7e0f7dba32d4c4187d3da4..6aecce85e15ab03cdd77c277ea3a9a6fb517d781 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,10 @@ - [x] **客户端调用远程服务的时候进行负载均衡** :调用服务的时候,从很多服务地址中根据相应的负载均衡算法选取一个服务地址。ps:目前只实现了随机负载均衡算法。 - [x] **处理一个接口有多个类实现的情况** :对服务分组,发布服务的时候增加一个 group 参数即可。 - [x] **集成 Spring 通过注解注册服务** -- [x] **集成 Spring 通过注解进行服务消费** +- [x] **集成 Spring 通过注解进行服务消费** 。参考: [PR#10](https://github.com/Snailclimb/guide-rpc-framework/pull/10) - [x] **增加服务版本号** :建议使用两位数字版本,如:1.0,通常在接口不兼容时版本号才需要升级。为什么要增加服务版本号?为后续不兼容升级提供可能,比如服务接口增加方法,或服务模型增加字段,可向后兼容,删除方法或删除字段,将不兼容,枚举类型新增字段也不兼容,需通过变更版本号升级。 - [x] **对 SPI 机制的运用** +- [x] 扩充 rpc 协议,增加序列化协议字段,服务端可以根据消息体中的序列化协议动态选择序列化器。参考: [PR#14](https://github.com/Snailclimb/guide-rpc-framework/pull/14) - [ ] **增加可配置比如序列化方式、注册中心的实现方式,避免硬编码** :通过 API 配置,后续集成 Spring 的话建议使用配置文件的方式进行配置 - [ ] **客户端与服务端通信协议(数据包结构)重新设计** ,可以将原有的 `RpcRequest`和 `RpcReuqest` 对象作为消息体,然后增加如下字段(可以参考:《Netty 入门实战小册》和 Dubbo 框架对这块的设计): - **魔数** : 通常是 4 个字节。这个魔数主要是为了筛选来到服务端的数据包,有了这个魔数之后,服务端首先取出前面四个字节进行比对,能够在第一时间识别出这个数据包并非是遵循自定义协议的,也就是无效数据包,为了安全考虑可以直接关闭连接以节省资源。 diff --git a/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/DefaultDecoder.java b/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/DefaultDecoder.java index b01bee1bc9b8b98960ef1821ff0d8b67a21a8736..bfc85fed883fcd024d813f59b73af347bc31e75b 100644 --- a/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/DefaultDecoder.java +++ b/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/DefaultDecoder.java @@ -16,17 +16,17 @@ import java.util.List; /** * 自定义解码器。负责处理"入站"消息,将消息格式转换为我们需要的业务对象 - * 協議格式 + * 协议格式: + *

+ * | length | serializable id | body length | body data | + * | 1 | 2 | 3 | 4 | + *

+ * 1、大端4字节整数,等于2、3、4长度总和 + * 2、大端4字节整数,序列化方法的序号 + * 3、body 长度 大端4字节整数,具体为4的长度 + * 4、body 內容 * - * | length | serializable id | body length | body data | - * | 1 | 2 | 3 | 4 | - * - * 1、大端4字節整數,等于2、3、4长度总和 - * 2、大端4字節整數,序列化方法的序號 - * 3、body 長度 大端4字節整數,具體為4的長度 - * 4、body 內容 - * @author shuang.kou - * @author: tydhot (583125614@qq.com) + * @author shuang.kou & tydhot(583125614@qq.com) * @createTime 2020年05月25日 19:42:00 */ @AllArgsConstructor @@ -76,7 +76,7 @@ public class DefaultDecoder extends ByteToMessageDecoder { in.resetReaderIndex(); return; } - // 6.讀取選擇序列化方式 + // 6.读取选择序列化方式 int serializableId = in.readInt(); String serializerKey = SERIALIZABLE_MAP.get(serializableId); // 7.不支持的序列化方式,返回 @@ -84,11 +84,11 @@ public class DefaultDecoder extends ByteToMessageDecoder { in.resetReaderIndex(); return; } - // 8.選擇序列化器 + // 8.选择序列化器 Serializer serializer = ExtensionLoader.getExtensionLoader(Serializer.class).getExtension(serializerKey); - // 9.開始讀取body長度 + // 9.开始读取body長度 int dataLength = in.readInt(); - // 10.開始序列化 + // 10.开始序列化 byte[] body = new byte[dataLength]; in.readBytes(body); // 将bytes数组转换为我们需要的对象 diff --git a/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/enums/SerializableEnum.java b/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/enums/SerializableEnum.java index 0f078e8894a2b33c051a5b1d94ec7ef2ffc9be55..45968d93e17d5bc3e9fb32c1ff000b74e16a9c8b 100644 --- a/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/enums/SerializableEnum.java +++ b/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/enums/SerializableEnum.java @@ -4,8 +4,8 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * @author: tydhot (583125614@qq.com) - * @date:2020/9/9 + * @author tydhot (583125614@qq.com) + * @createTime 2020年09月9日 **/ @AllArgsConstructor @Getter @@ -13,8 +13,8 @@ public enum SerializableEnum { KYRO(1, "kyro"); - private Integer serializableId; + private final Integer serializableId; - private String serializableKey; + private final String serializableKey; } diff --git a/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/kyro/NettyKryoEncoder.java b/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/kyro/NettyKryoEncoder.java index 35a7626509829cbe0235b1fe3e8a313750c23644..b91be7ee422b8a2458a50383da25ae2bd5ebb2c4 100644 --- a/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/kyro/NettyKryoEncoder.java +++ b/rpc-framework-simple/src/main/java/github/javaguide/remoting/transport/netty/codec/kyro/NettyKryoEncoder.java @@ -8,15 +8,15 @@ import io.netty.handler.codec.MessageToByteEncoder; import lombok.AllArgsConstructor; /** - * 協議格式 - * - * | length | serializable id | body length | body data | - * | 1 | 2 | 3 | 4 | - * - * 1、大端4字節整數,等于2、3、4长度总和 - * 2、大端4字節整數,序列化方法的序號 - * 3、body 長度 大端4字節整數,具體為4的長度 - * 4、body 內容 + * 协议格式: + *

+ * | length | serializable id | body length | body data | + * | 1 | 2 | 3 | 4 | + *

+ * 1、大端4字节整数,等于2、3、4长度总和 + * 2、大端4字节整数,序列化方法的序号 + * 3、body 长度 大端4字节整数,具体为4的长度 + * 4、body 內容 * 自定义编码器。负责处理"出站"消息,将消息格式转换字节数组然后写入到字节数据的容器 ByteBuf 对象中。 *

* 网络传输需要通过字节流来实现,ByteBuf 可以看作是 Netty 提供的字节数据的容器,使用它会让我们更加方便地处理字节数据。 @@ -34,7 +34,7 @@ public class NettyKryoEncoder extends MessageToByteEncoder { /** - * 将对象進行序列化然后写入到 ByteBuf 对象中 + * 将对象序列化然后写入到 ByteBuf 对象中 */ @Override protected void encode(ChannelHandlerContext channelHandlerContext, Object o, ByteBuf byteBuf) {