什么是 RPC
RPC(Remote Procedure Call)— 远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的 webservice 架构。比如两个不同的服务 A、B 部署在两台不同的机器上,那么服务 A 如果想要调用服务 B 中的某个方法该怎么办呢?使用 HTTP 请求当然可以,但是可能会比较慢而且一些优化做的并不好。 RPC 的出现就是为了解决这个问题。
最终解决的问题:让分布式或者微服务系统中不同服务之间可以像本地服务一样调用。
RPC 原理
- client 以本地调用方式调用服务;
- client stub 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
- client stub 找到服务地址,并将消息发送到服务端;
- server stub 收到消息后进行解码;
- server stub 根据解码结果调用本地的服务;
- server 执行并将结果返回给 server stub;
- server stub 将返回结果打包成消息并发送至 client;
- client stub 接收到消息,并进行解码;
- client 得到最终结果
常用 RPC 框架
- Dubbo: Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。目前 Dubbo 已经成为 Spring Cloud Alibaba 中的官方组件。
- gRPC :gRPC 是可以在任何环境中运行的现代开源高性能 RPC 框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡、跟踪、运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备、移动应用程序和浏览器连接到后端服务。
- Hessian: Hessian是一个轻量级的 remoting-on-http 工具,使用简单的方法提供了 RMI 的功能。 相比 WebService,Hessian 更简单、快捷。采用的是二进制 RPC 协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
为什么用 RPC,不直接使用 HTTP
RPC 是 web service 的一种架构,HTTP 是指 HTTP 协议,事实上 RPC 也可以采用 HTTP 协议进行通信,例如 gRPC 就采用了 HTTP2。一般拿 RPC 和 HTTP 比较是将采用TCP(或UDP)协议的 RPC 和直接使用 HTTP 通信进行比较。
- 传输效率 RPC通常使用TCP协议,通过自定义上层协议可以让请求报文体积更小;基于 HTTP 1.1 的协议,请求可能会包含很多对业务无用的内容(毕竟HTTP是面向web应用的)
- 性能消耗 RPC在参数序列化上可以基于序列化框架进行,效率比较高;HTTP协议,参数大部分是通过 json 来实现的,字节更多,序列化耗时更多
- 跨平台 HTTP 协议可以运行在多种异构系统上,可移植性较好;RPC通常要求客户端和服务器为统一平台
基于以上特点考虑,使用基于 TCP 的 RPC 主要用于业务内部的服务调用,性能消耗低,传输效率高。