RPC(4)

76 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 等序列化方式。
  • 消息长度
  • 版本号