在大型互联网公司,RPC技术是远程调用的通用技术栈,常见的如Dubbo、Grpc等。
RPC通讯协议主要基于TCP/IP协议,而HTTP调用是基于HTTP协议的,相较于RPC多了一层,所以RPC协议请求通常会高效一些。
RPC框架,需要包括:服务发现机制、负载均衡策略、容错降级、调用重试、异步队列、事件解耦等,通过手写,才能更好地掌握其中的细节。
1 RPC核心组件:
最核心的四大组件:服务端、客户端、服务端代理、客户端代理。
首先本地的客户端需要通知到一个本地的存根(stub),接着本地存根需要进行一些数据格式的包装,网络请求的封装,按照一定的规则将这个数据包发送到指定的目标机器上。然后服务端收到数据包之后,按照约定好的规则进行解码,识别数据包中的信息,并发送到本地服务中对应的函数中进行处理,处理完毕后,返回给调用方。
2 RPC各个部分需要完成的工作
- 代理层 :面对发送端,或接收端,设计一个代理层,统一将内布的细节都屏蔽起来,实现无感调用 。起到一个保护目标对象、扩展功能、降低耦合度的作用。
- 路由层 : 当目标服务众多的时候,客户端如何确定最终的服务提供者呢 ?此时,需要考虑如何获得provider的服务地址?如何筛选服务?如何兼容后期的路由扩展功能? 服务下线,如何通知到路由层?
- 协议层 :如何对数据进行统一的封装?序列化与反序列化
- 可插拔组件的设计与开发 留下接口,等待二次扩展,比如自定义条件的过滤、服务分组等操作
- 注册中心的实现 :第三方管理者,服务提供者将自己的地址,接口,分组等详细信息都上报到注册中心模块,并且当服务上线、下线都会通知到注册中心。然后服务调用方只需要订阅注册中心即可。常见有Zookeeper 、 Redis 等。此处需要关注 如何实现基本链接? 如何监听服务数据的实时变化? 如果出现异常了 ,该如何处理?
- 容错层设计 :超时重传、快速失败、无限重试等
- 线程池的设计 io线程与工作线程的拆分、调用结果与客户端请求的唯一匹配、客户端请求后的同步转异步处理、单一请求队列和多请求队列的设计差异性
- 接入层设计 :和springboot链接起来!
接下来就是详细实现了 ,敬请期待~~~