开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
服务器未处理的请求类UnprocessedRequests
用于存放未被服务端处理的请求(建议限制 map 容器大小,避免未处理请求过多 OOM)
有put和complete方法
其中put方法就是注册,complete就是删除
可以这样想,put就是来投案,那么put就需要登记你的个人消息和案件信息,complete则是案件得到了解决,你的个人信息和案件信息就解决了
处理服务器发送的数据NettyRpcClientHandler
有channelRead和userEventTriggered2个方法
channelRead用来读取从服务端返回的数据
注意:因为有2种不同响应分别为消息响应和心跳响应,因此记得加以区分
其中的unprocessedRequests.complete(rpcResponse);很重要,通过这个设置说明该信息已经得到了解决,调用了这个方法就会将rpcResponse存入类似ThrealLocal的东东中,那么我们就可以通过下述代码获取到响应
CompletableFuture<RpcResponse> completableFuture = (CompletableFuture<RpcResponse>) clientTransport.sendRpcRequest(rpcRequest);
rpcResponse = completableFuture.get();
一切的一切都将在后面的客户端代理类揭开面纱
userEventTriggered方法用来处理心跳请求,这里先放一放
ChannelProvider
用于存放channel(channel用于在客户端和服务端之间传数据)
有个map,用来当作注册中心,服务端地址为key,channel为value
服务端
NettyRpcServer
很简单
NettyRpcServerHandler
当客户端发的 rpc 请求(RpcRequest) 来了之后,服务端就会处理 rpc 请求(RpcRequest) ,处理完之后就把得到 rpc 相应(RpcResponse)传输给客户端。
传输协议
传输协议的作用在于用户自定义协议,以此来推断是否是自己想要接收的数据,当然你的要是给破解了,那你可能会遭受到一些非法攻击。
- 魔数:通常是 4 个字节。这个魔数主要是为了筛选来到服务端的数据包,有了这个魔数之后,服务端首先取出前面四个字节进行比对,能够在第一时间识别出这个数据包并非是遵循自定义协议的,也就是无效数据包,为了安全考虑可以直接关闭连接以节省资源。
- 序列化器类型:标识序列化的方式,比如是使用 Java 自带的序列化,还是 json,kyro 等序列化方式。
- 消息长度
- 版本号