RPC框架及选型

1.RPC是什么?

RPC(Remote Procedure Call),即远程过程调用,允许一台计算机调用另一台远程计算机上的程序,就像在本地调用一样。

2.为什么需要RPC?

在单体应用时,使用本地方法调用,一次服务调用发生在同一台机器上的同一个进程内部。随着互联网应用的量级的不断增大,单台计算机的能力有限,在进行服务化拆分之后,在分布式或者微服务系统中,服务提供者和服务消费者运行在两台不同物理机上的不同进程内,可以借助RPC来完成远程计算机之间的服务调用。

3.RPC框架

完成一次 RPC 调用,首先需要建立网络连接。在建立连接后,双方需要按照约定的通信协议进行网络通信。双方能够正常通信后,服务端接收到请求时,需要以某种方式进行处理,处理成功后,把请求结果返回给客户端。为了减少传输的数据大小,还要对数据进行压缩,也就是对数据进行序列化。

因此,完整的 RPC 框架主要有三部分组成:通信框架通信协议序列化和反序列化格式

  • 通信框架:提供了基础的通信能力。主要解决客户端和服务端如何建立连接、管理连接以及服务端如何处理请求的问题。

  • 通信协议:主要解决客户端和服务端采用哪种数据传输协议的问题。

  • 序列化和反序列化:用于客户端和服务端采用数据编 / 解码。

RPC 框架负责屏蔽底层的传输方式、序列化方式和通信细节,目标就是让远程服务调用更加简单、透明。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。

4.常用的RPC框架

常用的RPC框架可以大致分为两种类型。一类是与语言无关即跨语言平台的,另一类是跟某种特定语言平台绑定的。

跨语言平台的开源 RPC 框架有:

  • gRPC:Google 于 2015 年对外开源的跨语言 RPC 框架。支持多种语言;基于 IDL 文件定义服务;基于 HTTP/2 设计,序列化支持 PB(Protocol Buffer)和 JSON。

  • Thrift:最初是由 Facebook 开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一,支持多种语言。Thrift 有一套自己的接口定义语言 IDL,可以通过代码生成器,生成各种编程语言的 Client 端和 Server 端的 SDK 代码;直接基于传输层的 TCP 协议来实现,省去了额外的应用层协议的开销。

跟语言平台绑定的开源 RPC 框架有:

  • Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。2017 年云栖大会,阿里宣布 Dubbo 被列为重点维护的开源项目。Dubbo默认采用了 Netty 作为通信框架;服务器通信协议:Dubbo协议、RMI协议、Hessian协议、HTTP协议、WebService协议、Thrift协议、Memcached协议;支持多种序列化格式:Hessian2、Java 二进制序列化、json等。

  • Motan:微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。

  • Tars:腾讯内部使用的 RPC 框架,于 2017 年对外开源,仅支持 C++ 语言。

  • Spring Cloud:国外 Pivotal 公司 2014 年对外开源的 RPC 框架,仅支持 Java 语言。

5.技术选型

涉及跨语言的服务调用场景:

  • 从成熟度上来讲,Thrift 因为诞生的时间要早于 gRPC,所以使用的范围要高于 gRPC,在 HBase、Hadoop、Scribe、Cassandra 等许多开源组件中都得到了广泛地应用。而且 Thrift 支持多达 25 种语言,这要比 gRPC 支持的语言更多,所以如果遇到 gRPC 不支持的语言场景下,选择 Thrift 更合适。

  • 但 gRPC 作为后起之秀,因为采用了 HTTP/2 作为通信协议、ProtoBuf 作为数据序列化格式,在移动端设备的应用以及对传输带宽比较敏感的场景下具有很大的优势,而且开发文档丰富,根据 ProtoBuf 文件生成的代码要比 Thrift 更简洁一些,从使用难易程度上更占优势。

限定语言的服务调用场景:

  • 语言平台是 C++,选择 Tars。

  • 语言平台是 Java,可以选择 Dubbo、Motan 或者 Spring Cloud。

    • Spring Cloud 不仅提供了基本的 RPC 框架功能,还提供了服务注册组件、配置中心组件、负载均衡组件、断路器组件、分布式消息追踪组件等一系列组件。

    • Dubbo、Motan 基本上只提供最基础的 RPC 框架的功能。

    • Spring Cloud 的 RPC 通信采用了 HTTP 协议,相比 Dubbo 和 Motan 所采用的私有协议来说,在高并发的通信场景下,性能相对要差一些,所以对性能有苛刻要求的情况下,可以考虑 Dubbo 和 Motan。

 

参考资料:https://time.geekbang.org/column/intro/115

RPC框架及选型

上一篇:深入浅出内存马(一)


下一篇:Vue2 使用Typescript 使用vue-property-decorator的简单介绍