RPC 协议

301 阅读3分钟

概述

RPC 是什么

RPC(Remote Procedure Call Protocol)远程过程调用协议。通俗的描述是:客户端在不知道详细细节的情况下,调用远程服务的某个对象的能力跟调用本地对象的某个函数一样。 image.png

RPC 解决了什么问题

在几个进程内(应用分布在不同的机器上),无法共用内存空间,或者在一台机器内通过本地调用无法完成相关的需求,比如不同的系统之间的通讯,甚至不同组织之间的通信。此外由于机器的横向扩展,需要多台机器组成的集群上部署应用等等。

与HTTP 协议区别

协议定位要调用的服务消息前后兼容
HTTPURL开发者在消息里做兼容
RPC指定 service 和 Method 名IDL层做兼容

分层结构

image.png

  • RPC Client: PRC协议的调用方
  • RPC Server: 提供远程服务方法的具体实现
  • Stub/Proxy: RPC代理存在与客户端,因为要实现客户端对于RPC框架的无感知调用,则相关的消息格式管理、网络传输协议管理和调用异常处理则放到代理层进行处理
  • Message Protocol: client和service之间的交互需要约定共同的消息格式。RPC的消息管理层是对网络传输所承载的消息进行编号和解码擦操作
  • Transfer/Network Protocol: 传输协议层负责管理RPC框架所使用的网络协议、网络IO模型
  • Selector/Processor:存在RPC服务端,它负责管理RPC接口注册、鉴权和控制接口实现类的执行等工作
  • IDL:实际上IDL(接口定义语言)并不是RPC实现中所必须的。但是需要跨语言的RPC框架一定会有IDL部分的存在。这是因为要找到一个各种语言能够理解的消息结构、接口定义的描述形式。如果您的RPC实现没有考虑跨语言性,那么IDL部分就不需要包括

主流 RPC 框架

框架名公司应用场景
JAVA RMISUN不支持跨语言,使用起来也比较简单。如果您的业务需求中并不存在跨语言的考虑,并且基本上主要系统都是用JAVA实现,那么RMI绝对是您一个可以考虑的方案。
GRPCGoogle跨语言,高性能和通用的开源框架
ThriftFacebookThrift可以支持多种信息格式,除了Thrift私有的二进制编码规则和一种LVQ(类似于TLV消息格式)的消息格式,还有常规的JSON格式。Thrift的网络协议建立在TCP协议基础上,并且支持阻塞式IO模型和多路IO复用模型。Thrift也是目前最流行的RPC框架之一,从网络上各种性能测试情况开,Thrift的性能都是领先的
DubboAlibaba分布式服务框架