rpc核心
被面试官问过这样一个问题:“假如要你实现一个rpc框架,客户端和服务端你要考虑哪些东西?”
rpc框架负责屏蔽底层的传输方式(tcp或者udp)、序列化方式(xml/json/二进制)和通信细节,服务调用者可以像调用本地接口一样调用远程服务,而不需要关心底层通信细节和调用过程。
rpc的组件一般有服务注册与发现、负载均衡、序列化/反序列化、编解码、网络传输、线程池、动态代理、连接池等。
服务注册与发现,可以采用Eureka或者Nacos。
自定义协议、编解码
所谓协议,就是通信双方事先商量好规则,服务端知道发送过来的数据将如何解析。
网络传输协议
tcp、udp、http、http2.0
成熟的rpc框架一般会提供四种调用方式,分别是同步阻塞、异步非阻塞、
rpc一般是长连接。
在回调的时候,需要用到上下文管理器
1、客户端生成请求id
2、客户端生成请求上下文,上下文中包含发送时间、回调函数等信息
3、上下文管理器记录请求id与上下文的映射关系
4、将请求id打在请求包里发给服务端
5、服务端将请求id打在响应包里返回
6、客户端根据响应包中的请求id,通过上下文管理器找到原来的上下文
7、从上下文中拿到回调函数
8、执行回调函数。
除了上下文管理器,还有一个超时管理器,用于实现请求包超时的回调处理。
超时管理器会对上下文管理器中的上下文进行扫描,看上下文中请求等待回包是否过长,如果过长,就不再等待回包,直接超时回调,并将上下文从上下文管理器中删掉。