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

[refractor]update readme & some comment

上级 e42ce6a5
......@@ -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 个字节。这个魔数主要是为了筛选来到服务端的数据包,有了这个魔数之后,服务端首先取出前面四个字节进行比对,能够在第一时间识别出这个数据包并非是遵循自定义协议的,也就是无效数据包,为了安全考虑可以直接关闭连接以节省资源。
......
......@@ -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 |
* | 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数组转换为我们需要的对象
......
......@@ -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;
}
......@@ -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 內容
* 协议格式:
* <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 內容
* 自定义编码器。负责处理"出站"消息,将消息格式转换字节数组然后写入到字节数据的容器 ByteBuf 对象中。
* <p>
* 网络传输需要通过字节流来实现,ByteBuf 可以看作是 Netty 提供的字节数据的容器,使用它会让我们更加方便地处理字节数据。
......@@ -34,7 +34,7 @@ public class NettyKryoEncoder extends MessageToByteEncoder<Object> {
/**
* 将对象進行序列化然后写入到 ByteBuf 对象中
* 将对象序列化然后写入到 ByteBuf 对象中
*/
@Override
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.
先完成此消息的编辑!
想要评论请 注册