RPC协议
RPC(Remote Procedure Call)协议,又称远程过程调用协议,是一种进程间通信方式。它允许程序调用另一台计算机上的子程序,而程序员无需显式编写这种远程交互的通信细节。
RPC协议的主要特征和工作原理如下:
- 采用客户端/服务器模式。请求程序作为客户端,服务提供程序作为服务器。客户端调用服务器执行某些代码,并等待响应。
- 参数打包与解包。调用参数在网络上传送前需要打包成网络可读格式,在接收端再解包成原始参数。这允许在程序之间传递任意数据结构。
- 基于传输协议。RPC协议本身不定义传输机制,需要依赖TCP/IP等底层传输协议进行数据传输。
- 隐藏细节。程序员写的代码基本无需区分子程序是本地的还是远程的,RPC处理底层的网络通信细节。
- 支持跨语言。客户端和服务器程序可以用不同语言开发,RPC实现了语言之间的互操作。
- 模块化和代码重用。通过RPC,可以跨网络调用已有的服务程序,大大提高了代码的可重用性。
- 常见实现包括gRPC、Thrift、Avro等。编程语言对RPC也存在广泛支持。
总之,RPC利用抽象容易使用的接口,允许程序员透明地调用远程子程序,而不必关注网络通信的复杂细节。这大大简化了分布式计算中的进程间通信和程序互操作。
RPC架构
RPC协议过程
- 客户端(Client)通过本地调用的方式调用服务(以接口方式调用)
- 客户端存根(Client Stub)接收到调用请求后负责将方法、入参等信息进行组装序列化成能够进行网络传输的消息体(将消息体对象序列化为二进制流)
- 客户端存根(Client Stub)找到远程的服务地址,并且将消息通过网络发送给服务端(通过sockets发送消息)
- 服务端存根(Server Stub)收到消息后进行反序列化操作,即解码(将二进制流反序列化为消息对象)
- 服务端存根(Server Stub)通过解码结果调用本地的服务进行相关处理
- 服务端(Server)本地服务业务处理
- 服务端(Server)将处理结果返回给服务端存根
- 服务端存根(Server Stub)序列化处理结果(将结果消息对象序列化为二进制流)
- 服务端存根(Server Stub)将序列化结果通过网络发送至客户端(通过sockets发送消息)
- 客户端存根(Server Stub)接收到消息,进行反序列化解码(将结果二进制流反序列化为消息对象) 客户端得到最终的结果。
核心功能
重要组成
- 客户端:Client,服务调用方
- 客户端存根:Client Stub,存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端
- 服务端存根:Server Stub,接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理
- 服务端:Server,服务的真正提供者
- newtwork service:底层传输,tcp或http
功能实现
- 服务寻址
- 序列化和反序列化
- 网络传输功能
gRPC
gRPC(gRPC Remote Procedure Call)是Google开源的一款高性能、开源的远程过程调用(RPC)系统。
gRPC的主要特点包括:
- 基于HTTP/2标准设计,支持双向流式传输、头部压缩、单TCP连接持续传输等特性,以实现高吞吐、低延迟。
- 使用Protocol Buffers作为接口描述语言,可选使用JSON编码,语言中立。
- 支持众多语言,包括C++, Java, Python, Go, Ruby, C#等。由语言主要贡献者维护各语言实现。
- 提供认证、授权、流控、负载均衡、日志等机制。
- 支持客户端、服务端、双向流式调用等模式。
- 基于IDL定义服务,支持自动生成客户端和服务器端代码框架。
- 与主流容器平台和云服务平台集成良好。
总体来说,gRPC是一个高性能、通用的开源RPC框架。它基于HTTP/2标准设计,提供了诸如流控、负载均衡、安全认证等机制。使用Protocol Buffers作为接口定义语言,支持主流语言。其高性能、跨平台、生态完善的特点,使其成为分布式系统互联的主流选择之一。
gRPC流程
gRPC的通信流程大致可以分为以下几个步骤:
- 接口定义:使用Protocol Buffers接口定义语言(IDL)定义服务接口及消息结构。IDL中定义了RPC服务的方法、参数、返回类型。
- 代码生成:根据IDL接口定义,通过protoc编译器自动生成客户端和服务器Stub代码。Stub代码中包含了接口、序列化/反序列化、通信等相关实现。
- 服务器实现:在服务器端用指定语言实现RPC接口,并绑定至一个端口提供服务。
- 客户端调用:客户端通过Stub代码发起RPC调用请求,将参数对象序列化打包(压缩)。
- 传输:底层通过HTTP/2标准传输请求消息至服务端。
- 服务器解码:服务器接收请求消息并解码,找到相应的服务方法。
- 服务器处理:服务器执行具体业务逻辑并将结果序列化。
- 返回结果:服务器向客户端返回处理结果。
- 客户端解码:客户端接收消息,通过Stub代码解码并反序列化为结果对象。
- 返回结果:客户端获得RPC调用结果。
客户端(gRPC Stub)调用A方法,发起RPC调用,对请求信息使用Protobuf进行对象序列化压缩(IDL);服务端(gPRC Server)接收到请求后,解码请求体,进行业务逻辑处理并返回。对响应结果使用Protobuf进行对象序列化压缩(IDL) 客户端接受到服务端响应,解码请求体。回调被调用的A方法,唤醒正在等待响应(阻塞)的客户端调用并返回响应结果