RPC

参考

RPC 简介

RPC(Remote Procedure Call),远程过程调用,允许程序调用位于其他机器上的过程(也可以是同一台机器的不同进程),当 A(RPC Client) 调用 B(RPC Server) 时,A 会被挂起,等待 B 处理结束返回结果给 A,他屏蔽了复杂的序列化反序列化和通信细节,对于编程人员来说,就好像调用了本地的过程一样。随着 RPC 的发展,出现了大量的相关技术,比如 GRPC,Thrift,JSON-RPC,CORBA,Java RMI 等,一般 RPC 框架如 GRPC,Thrift 是跨语言的,但也有例外,比如 Java RMI,只局限于 Java。

当描述 RPC 协议的时候,需要明确清楚到底指的是哪种协议,RPC 框架相关的协议包含两种:

  • 序列化/反序列化协议:数据序列化/反序列化的协议。如 Protobuf、Avro、JSON。
  • 传输协议:数据传输使用的网络协议。如 HTTP、HTTP/2。

对于 RPC 框架来说,各自使用的序列化/反序列化协议和传输协议不同,甚至同一个框架也同时支持多种序列化/反序列化协议和传输协议。比如:

  • GRPC 框架默认序列化/反序列化协议是 Protobuf,默认传输协议是 HTTP/2。
  • Thrift 框架比较特殊,它提供了自己的序列化反序列化协议和传输协议,都叫 Thrift,所以提到 Thrift 的时候经常会被混淆。你只需要知道在当前语境下,Thrift 这个单词代表的是 RPC 框架,还是序列化/反序列化协议,又或者是传输协议就可以了。

Java 实现 RPC 底层用到的技术一般包含:

  • 序列化和反序列化
  • 网络传输
  • 动态代理
  • 动态加载
  • 反射

RPC 框架对比

Remote Process Call,远程过程调用,需要注意的是 RPC 并不是某个具体的协议,而是 RPC 框架去实现远程调用过程调用会依赖于一些协议,如传输协议(http2、tcp)和序列化协议(基于文本编码的 json、xml,二进制编码的 protobuf、thrift、avro)

分布式RPC框架性能大比拼

RPC简介及框架选择

gRPC

rpcx

motan

dubbo

thrift

通用应用层序列化协议对比

三种通用应用层协议 protobuf、thrift、avro

Google Protocol buffer

优点

  • 二进制消息,性能好/效率高(空间和时间效率都很不错)
  • proto文件生成目标代码,简单易用
  • 序列化反序列化直接对应程序中的数据类,不需要解析后在进行映射(XML,JSON都是这种方式)
  • 支持向前兼容(新加字段采用默认值)和向后兼容(忽略新加字段),简化升级
  • 支持多种语言(可以把proto文件看做IDL文件)
  • Netty等一些框架集成

缺点

  • 官方只支持C++,JAVA和Python语言绑定
  • 二进制可读性差(貌似提供了Text_Fromat功能)
  • 二进制不具有自描述特性
  • 默认不具备动态特性(可以通过动态定义生成消息类型或者动态编译支持)
  • 只涉及序列化和反序列化技术,不涉及RPC功能(类似XML或者JSON的解析器)

Apache Thrift

应用

  • Facebook的开源的日志收集系统(scribe: https://github.com/facebook/scribe)
  • 淘宝的实时数据传输平台(TimeTunnel http://code.taobao.org/p/TimeTunnel/wiki/index)
  • Evernote开放接口(https://github.com/evernote/evernote-thrift)
  • Quora(http://www.quora.com/Apache-Thrift)
  • HBase(http://abloz.com/hbase/book.html#thrift)

优点

  • 支持非常多的语言绑定
  • thrift 文件生成目标代码,简单易用
  • 消息定义文件支持注释
  • 数据结构与传输表现的分离,支持多种消息格式
  • 包含完整的客户端/服务端堆栈,可快速实现RPC
  • 支持同步和异步通信

缺点

  • 和 protobuf 一样不支持动态特性

avro

优点

  • 二进制消息,性能好/效率高
  • 使用JSON描述模式
  • 模式和数据统一存储,消息自描述,不需要生成stub代码(支持生成IDL)
  • RPC调用在握手阶段交换模式定义
  • 包含完整的客户端/服务端堆栈,可快速实现RPC
  • 支持同步和异步通信
  • 支持动态消息
  • 模式定义允许定义数据的排序(序列化时会遵循这个顺序)
  • 提供了基于Jetty内核的服务基于Netty的服务

缺点

  • 只支持Avro自己的序列化格式
  • 语言绑定不如Thrift丰富

参考附录

RPC

REST vs RPC

qin

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏

打开支付宝扫一扫,即可进行扫码打赏哦