RPC 框架有 Hession、Thrift、gRPC 等。
gRPC
gPRC:Google 开源的高性能的 RPC 框架,gRPC 是一个可在任何环境中运行的现代开源高性能远程过程调用(RPC)框架。它可以高效地连接数据中心内和数据中心间的服务,并为负载平衡、跟踪、健康检查和身份验证提供可插拔的支持。它还适用于分布式计算,将设备、移动应用程序和浏览器连接到后端服务。
gRPC 的核心设计思路:
- 网络通信:gPRC 自己封装的网络通信,提供多种语言的网络通信;
- 协议:采用 HTTP2.0 协议;
- 序列化:采用 protobuf(Protocol Buffers), Google 开源的一种序列化方式。
- 代理的创建:stub(存根/桩)调用者像调用本地方法一样调用远端的方法。
HTTP2 传输数据使用的二进制数据内容,传输体量较小,支持双向流(双工)
gRPC 与 Thrift 都是支持异构语言的 RPC。
区别 | Thrift | gRPC |
---|---|---|
网络通信 | TCP 专属协议(传输层协议,更快) | HTTP2.0(应用层协议,相对于 Thrift 的 TCP 慢) |
性能 | Thrift 性能高于 gRPC | - |
使用范围 | 社区活跃 | 大厂背书,云原生时代,与其它组件合作顺利,所以 gRPC 应用更广 |
gRPC 的优点:
- 高效的进行进程间通信;
- 支持多语言,原生支持 C、GO、Java 实现。C 语言版本上扩展 C++、C#、NodeJS、Python、Ruby、PHP;
- 支持多平台;
- gRPC 序列化采用 protobuf,效率高;
- 使用 HTTP2.0 协议;
HTTP 协议
HTTP1.x
- HTTP1.0:请求响应模式,短连接无状态协议;传输的数据主要是文本结构,单工协议(客户端请求服务端,服务端无法主动推送内容到客户端)
- HTTP1.1:请求响应模式,有限的连接(Connection:keep-alived),会保持一段时间,减少传输的数据(有时候刷新页面但是 SSL 并不刷新);升级的方式:WebScoket 协议实现双工,实现服务端向客户端推送。
HTTP1.x 主要有以下特点:
- 传输数据文本格式,可读性好但是效率差;
- 本质上 无法实现双工通信;
- 请求资源需要发送多次请求,建立多个连接;
HTTP 协议基于 TCP 协议(长连接),但是有自己的设计实现,响应之后会自己断掉,所以 HTTP 是短连接协议。
HTTP2.0
- 二进制协议,效率高于 HTTP1.x,可读性差;
- 可以实现双工通信;
- 采用多路复用技术,一个请求/连接可以请求多个数据;
HTTP2.0 协议的三个概念:
- 数据流(stream)
- 消息(message)
- 帧(frame)
如上图所示,一次连接发送多个流,流中带有消息,消息由帧组成,帧中包含了请求或者响应的数据。在 HTTP2.0 的设计中,可以通过为不同的 stream 设置权重,来限制不同流的传输顺序,比如先发送 css stream 还是 js stream;
并且,如果 Client 发送的数据太快,Server 处理不过来,则可以通知 Client 暂停数据的发送实现流控。
序列化
protobuf 是一种与编程语言无关,与具体的平台无关,定义的中间语言,可以在 client 和 server 中进行 RPC 的数据传输。protobuf 有两个版本,proto2、proto3,目前主流应用是 proto3。
使用 protobuf 需要安装对应的编译器,需要把 protouf 的 IDL 语言转换成具体的编程语言。