内容纲要
RPC
RPC(Remote Procedure Call)即远程过程调用。解决了不同物理机及进程之间的方法调用问题。
如何完成调用?
RPC 要解决的问题
客户端和服务端如何建立连接?
常用途径
- HTTP
- Socket
服务端如何处理请求
常用途径
- 同步阻塞(BIO)
- 原理:客户端每发起一次请求,服务端即开辟一个线程去处理请求
- 场景:连接数较小的业务场景
- 同步非阻塞(NIO)
- 原理:客户端每发起一次请求,服务端使用 I/O 多路复用技术处理请求
- 场景:连接数较多,且业务消耗较轻的业务场景
- 异步非阻塞(AIO)
- 原理:客户端发起请求随即返回,I/O 处理真正完成后,内核会通知客户端程序
- 场景:连接数较多,且业务消耗较重的业务场景
数据传输采用什么协议?
核心思想
“契约”,即服务端和客户端之间定义一个协议,使得他们达成共识。
常用途径
- HTTP
- gRPC 等
数据如何序列化和反序列化?
Q:为什么需要?
A:主要是为了解决内存中的数据和字节序列之间的映射过程,如何保持数据结构和字段之间的关系,以及减少数据传输量,部分数据安全问题等……
常用方式
- 文本(XML/JSON 等)
- 二进制数据(Thrift/PB 等)
协议选择考虑因素
- 支持的数据结构丰富度
- 适用最好,最符合自己项目的最好
- 不要一味求多,也要综合考虑其他因素
- 跨语言支持
- 适用最好,最符合自己项目的最好
- 不要一味求多,也要综合考虑其他因素
- 性能
- 压缩率高好
- 序列化、反序列化速度快好
- 还是要综合考虑其他因素
落地
分类
- 语言、平台绑定的 RPC 框架
- Dubbo(Java 限定)
- 通信框架:Netty
- 通信协议:Dubbo、RMI、Hession、HTTP、Thrift 等
- 序列化格式:Dubbo、Hession、JSON、Kryo、FST 等
- Motan(Java 限定)
- 通信框架:Netty
- 通信协议:Motan
- 序列化格式:Hession2
- Tars(C++、Java、Nodejs、PHP、GO)
- 通信框架:?
- 通信协议:几乎支持所有协议?
- 序列化格式:TUP?
- Spring Cloud(Java 限定)
- 通信框架:RestTemplate、Fengn
- 通信协议:RPC、HTTP……
- 序列化格式:Jackson?
- Dubbo(Java 限定)
- 跨语言、平台的 RPC 框架
- gRPC
- 通信协议:HTTP2
- IDL:ProtoBuf
- 序列化:ProtoBUF
- Thrift
- 通信协议:Socket、File 等
- IDL:Thrift
- 序列化:Binary、Compact、JSON 等
- gRPC
选型
考虑因素
- 是否真的需要跨语言?
- 是否需要支持多种通信协议、序列化方式等?
- 对效率、性能要求高不高?
总结
- 多种框架未来都往多语言支持的方向发展(Sidecar 方案)
- 目前几个知名的框架(除了 Thrift、gRPC)都有较成体系的服务注册、发现、治理等组件