概念
RPC(Remote Procedure Call):远程过程调用,让我们调用远程方法像调用本地方法一样。 典型 RPC 的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件。
RPC核心模块
1、传输层(Transport):传输层负责直接从网络中读取和写入数据,它定义了具体的网络传输
协议;比如netty等。
2、协议层(Protocol):协议层定义了数据传输格式,负责网络传输数据的序列化和反序列化;
比如说JSON、Protobuf等。
3、处理层(Processor):找到远程的服务地址,将数据组装好传输给服务端
RPC调用流程
1、 服务消费者(Client 客户端)通过本地调用的方式调用服务
2、客户端存根(Client Stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传
输的消息体
3、客户端存根(Client Stub)找到远程的服务地址,并且将消息通过网络发送给服务端
4、服务端存根(Server Stub)收到消息后进行解码(反序列化操作)
5、服务端存根(Server Stub)根据解码结果调用本地的服务进行相关处理
6、服务端(Server)本地服务业务处理
7、处理结果返回给服务端存根(Server Stub)
8、服务端存根(Server Stub)序列化结果
9、服务端存根(Server Stub)将结果通过网络发送给消费方
10、客户端存根(Client Stub)接收到消息,并进行解码(反序列化)
11、服务消费方得到最终结果
常用的RPC框架
gRPC
是一个高性能、开源RPC 框架,基于protobuf和HTTP2设计,提供 C、Java 和Go语言版本。
gRPC 使用http2 作为网络传输层、使用 protobuf 这个高性能的序列化协议,客户端和服务端可以在多种环境中运行和交互。
proto文件用来描述rpc请求体、响应体、以及rpc提供的服务。通过插件可以根据.proto文件生成Java类。
Thrift
是一个轻量级、跨语言的开源RPC框架,通过IDL中间语言生成各种语言代码。支持多种序列化方式,传输协议支持阻塞和非阻塞模式。通过 IDL文件,利用编译生成器自动生成服务端和客户端代码。
支持的序列化方式
TBinaryProtocol:二进制编码格式进行数据传输
TCompactProtocol:高效率的、密集的二进制编码格式进行数据传输 TJSONProtocol:
使用JSON文本的数据编码协议进行数据传输 TSimpleJSONProtocol:只提供JSON只写的协议,适用于通过脚本语言解析
支持的传输协议
TSocket:使用阻塞式I/O进行传输,是最常见的模式
TNonblockingTransport:使用非阻塞方式,用于构建异步客户端
TFramedTransport:使用非阻塞方式,按块的大小进行传输,类似于Java中的NIO
Dubbo
是一个高性能、轻量级的开源RPC框架,专注于两个服务之间的调用,支持多种通信协议(dubbo、dubbo2、rest、Triple)等。dubbo最新版本不在只关注RPC实现,而是致力于服务整个微服务的服务治理框架。
Dubbo2 协议是在 TCP 传输层协议之上设计的二进制通信协议。
Triple 则是基于 HTTP/2之上构建的支持流式模式的通信协议,并且 Triple 完全兼容 gRPC 但实现上做了更多的符合 Dubbo 框架特点的优化。
Feign
是一个轻量级restful的HTTP服务客户端,openfeign对Feign进行了增强,使其支持Spring MVC注解;另外还整合了Ribbon,支持负载均衡,从而使得Feign的使用更加方便。