提交 0d7c7cdc 编写于 作者: G guide

[refractor]update readme & some comment

上级 e42ce6a5
...@@ -73,9 +73,10 @@ ...@@ -73,9 +73,10 @@
- [x] **客户端调用远程服务的时候进行负载均衡** :调用服务的时候,从很多服务地址中根据相应的负载均衡算法选取一个服务地址。ps:目前只实现了随机负载均衡算法。 - [x] **客户端调用远程服务的时候进行负载均衡** :调用服务的时候,从很多服务地址中根据相应的负载均衡算法选取一个服务地址。ps:目前只实现了随机负载均衡算法。
- [x] **处理一个接口有多个类实现的情况** :对服务分组,发布服务的时候增加一个 group 参数即可。 - [x] **处理一个接口有多个类实现的情况** :对服务分组,发布服务的时候增加一个 group 参数即可。
- [x] **集成 Spring 通过注解注册服务** - [x] **集成 Spring 通过注解注册服务**
- [x] **集成 Spring 通过注解进行服务消费** - [x] **集成 Spring 通过注解进行服务消费** 。参考: [PR#10](https://github.com/Snailclimb/guide-rpc-framework/pull/10)
- [x] **增加服务版本号** :建议使用两位数字版本,如:1.0,通常在接口不兼容时版本号才需要升级。为什么要增加服务版本号?为后续不兼容升级提供可能,比如服务接口增加方法,或服务模型增加字段,可向后兼容,删除方法或删除字段,将不兼容,枚举类型新增字段也不兼容,需通过变更版本号升级。 - [x] **增加服务版本号** :建议使用两位数字版本,如:1.0,通常在接口不兼容时版本号才需要升级。为什么要增加服务版本号?为后续不兼容升级提供可能,比如服务接口增加方法,或服务模型增加字段,可向后兼容,删除方法或删除字段,将不兼容,枚举类型新增字段也不兼容,需通过变更版本号升级。
- [x] **对 SPI 机制的运用** - [x] **对 SPI 机制的运用**
- [x] 扩充 rpc 协议,增加序列化协议字段,服务端可以根据消息体中的序列化协议动态选择序列化器。参考: [PR#14](https://github.com/Snailclimb/guide-rpc-framework/pull/14)
- [ ] **增加可配置比如序列化方式、注册中心的实现方式,避免硬编码** :通过 API 配置,后续集成 Spring 的话建议使用配置文件的方式进行配置 - [ ] **增加可配置比如序列化方式、注册中心的实现方式,避免硬编码** :通过 API 配置,后续集成 Spring 的话建议使用配置文件的方式进行配置
- [ ] **客户端与服务端通信协议(数据包结构)重新设计** ,可以将原有的 `RpcRequest``RpcReuqest` 对象作为消息体,然后增加如下字段(可以参考:《Netty 入门实战小册》和 Dubbo 框架对这块的设计): - [ ] **客户端与服务端通信协议(数据包结构)重新设计** ,可以将原有的 `RpcRequest``RpcReuqest` 对象作为消息体,然后增加如下字段(可以参考:《Netty 入门实战小册》和 Dubbo 框架对这块的设计):
- **魔数** : 通常是 4 个字节。这个魔数主要是为了筛选来到服务端的数据包,有了这个魔数之后,服务端首先取出前面四个字节进行比对,能够在第一时间识别出这个数据包并非是遵循自定义协议的,也就是无效数据包,为了安全考虑可以直接关闭连接以节省资源。 - **魔数** : 通常是 4 个字节。这个魔数主要是为了筛选来到服务端的数据包,有了这个魔数之后,服务端首先取出前面四个字节进行比对,能够在第一时间识别出这个数据包并非是遵循自定义协议的,也就是无效数据包,为了安全考虑可以直接关闭连接以节省资源。
......
...@@ -16,17 +16,17 @@ import java.util.List; ...@@ -16,17 +16,17 @@ import java.util.List;
/** /**
* 自定义解码器。负责处理"入站"消息,将消息格式转换为我们需要的业务对象 * 自定义解码器。负责处理"入站"消息,将消息格式转换为我们需要的业务对象
* 協議格式 * 协议格式:
* <p>
* | length | serializable id | body length | body data |
* | 1 | 2 | 3 | 4 |
* <p>
* 1、大端4字节整数,等于2、3、4长度总和
* 2、大端4字节整数,序列化方法的序号
* 3、body 长度 大端4字节整数,具体为4的长度
* 4、body 內容
* *
* | length | serializable id | body length | body data | * @author shuang.kou & tydhot(583125614@qq.com)
* | 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)
* @createTime 2020年05月25日 19:42:00 * @createTime 2020年05月25日 19:42:00
*/ */
@AllArgsConstructor @AllArgsConstructor
...@@ -76,7 +76,7 @@ public class DefaultDecoder extends ByteToMessageDecoder { ...@@ -76,7 +76,7 @@ public class DefaultDecoder extends ByteToMessageDecoder {
in.resetReaderIndex(); in.resetReaderIndex();
return; return;
} }
// 6.讀取選擇序列化方式 // 6.读取选择序列化方式
int serializableId = in.readInt(); int serializableId = in.readInt();
String serializerKey = SERIALIZABLE_MAP.get(serializableId); String serializerKey = SERIALIZABLE_MAP.get(serializableId);
// 7.不支持的序列化方式,返回 // 7.不支持的序列化方式,返回
...@@ -84,11 +84,11 @@ public class DefaultDecoder extends ByteToMessageDecoder { ...@@ -84,11 +84,11 @@ public class DefaultDecoder extends ByteToMessageDecoder {
in.resetReaderIndex(); in.resetReaderIndex();
return; return;
} }
// 8.選擇序列化器 // 8.选择序列化器
Serializer serializer = ExtensionLoader.getExtensionLoader(Serializer.class).getExtension(serializerKey); Serializer serializer = ExtensionLoader.getExtensionLoader(Serializer.class).getExtension(serializerKey);
// 9.開始讀取body長度 // 9.开始读取body長度
int dataLength = in.readInt(); int dataLength = in.readInt();
// 10.始序列化 // 10.始序列化
byte[] body = new byte[dataLength]; byte[] body = new byte[dataLength];
in.readBytes(body); in.readBytes(body);
// 将bytes数组转换为我们需要的对象 // 将bytes数组转换为我们需要的对象
......
...@@ -4,8 +4,8 @@ import lombok.AllArgsConstructor; ...@@ -4,8 +4,8 @@ import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
/** /**
* @author: tydhot (583125614@qq.com) * @author tydhot (583125614@qq.com)
* @date:2020/9/9 * @createTime 2020年09月9日
**/ **/
@AllArgsConstructor @AllArgsConstructor
@Getter @Getter
...@@ -13,8 +13,8 @@ public enum SerializableEnum { ...@@ -13,8 +13,8 @@ public enum SerializableEnum {
KYRO(1, "kyro"); KYRO(1, "kyro");
private Integer serializableId; private final Integer serializableId;
private String serializableKey; private final String serializableKey;
} }
...@@ -8,15 +8,15 @@ import io.netty.handler.codec.MessageToByteEncoder; ...@@ -8,15 +8,15 @@ import io.netty.handler.codec.MessageToByteEncoder;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
/** /**
* 協議格式 * 协议格式:
* * <p>
* | length | serializable id | body length | body data | * | length | serializable id | body length | body data |
* | 1 | 2 | 3 | 4 | * | 1 | 2 | 3 | 4 |
* * <p>
* 1、大端4字節整數,等于2、3、4长度总和 * 1、大端4字节整数,等于2、3、4长度总和
* 2、大端4字節整數,序列化方法的序號 * 2、大端4字节整数,序列化方法的序号
* 3、body 長度 大端4字節整數,具體為4的長 * 3、body 长度 大端4字节整数,具体为4的长
* 4、body 內容 * 4、body 內容
* 自定义编码器。负责处理"出站"消息,将消息格式转换字节数组然后写入到字节数据的容器 ByteBuf 对象中。 * 自定义编码器。负责处理"出站"消息,将消息格式转换字节数组然后写入到字节数据的容器 ByteBuf 对象中。
* <p> * <p>
* 网络传输需要通过字节流来实现,ByteBuf 可以看作是 Netty 提供的字节数据的容器,使用它会让我们更加方便地处理字节数据。 * 网络传输需要通过字节流来实现,ByteBuf 可以看作是 Netty 提供的字节数据的容器,使用它会让我们更加方便地处理字节数据。
...@@ -34,7 +34,7 @@ public class NettyKryoEncoder extends MessageToByteEncoder<Object> { ...@@ -34,7 +34,7 @@ public class NettyKryoEncoder extends MessageToByteEncoder<Object> {
/** /**
* 将对象進行序列化然后写入到 ByteBuf 对象中 * 将对象序列化然后写入到 ByteBuf 对象中
*/ */
@Override @Override
protected void encode(ChannelHandlerContext channelHandlerContext, Object o, ByteBuf byteBuf) { protected void encode(ChannelHandlerContext channelHandlerContext, Object o, ByteBuf byteBuf) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册