前言
1.进程间通信的演化过程
什么是进程间通信
进程间通信,通常是指一个应用实例调用另外一个应用实例所提供的服务,而这两个应用都运行在自己独立的进程中,通过网络彼此交换信息的过程
传统RPC
介绍
Java远程方法调用(RMI),基于TCP通信实现远程调用,实现逻辑非常复杂
缺点
- 不能跨语言
- 实现复杂
SOAP协议
介绍
简单对象访问协议,通过HTTP协议上封装XML格式的SOAP数据包,实现跨进程通信,是早期WebService技术的底层实现,消息格式的复杂性与围绕SOAP所构建的各种规范的复杂性,妨碍了构建分布式应用程序的敏捷性,逐渐被REST架构风格的应用程序所替代
缺点
- 序列化使用XML方式,这就导致数据包过大,传递效率低下
- SOAP实现复杂
优点
- 跨语言
- 参数可读
RESTful架构
介绍
RESTful的通用实现是HTTP,通过HTTP,可以将RESTful Web应用程序建模为能够通过URI的资源集合。应用于资源的状态变更操作会采用HTTP动词(GET,POST,PUT,DELETE等)的形式,资源的状态会以文本的格式来表述,如JSON,XML等
优点
- JSON序列化比XML更紧凑,更小,传递效率比XML更高
- 跨语言
- 实现简单
- 参数可读
缺点
- 基于文本的低效消息协议
- 应用程序之间缺乏强类型接口
- RESTful架构风格难以强制实施
2.RPC介绍
在分布式系统中,远程过程调用协议(英语:Remote Procedure Call,缩写为RPC)是一种跨进程的方法调用形式,是一种进程间通信方式
3.本地方法调用与远程方法调用
- 本地方法调用:本地方法调用指的是进程内部的方法调用
- 远程方法调用:指的是两个进程内的方法调用,两个进程可以属于不同的服务器,这个就是RPC
4.RPC的作用
5.RPC与HTTP的区别
需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程。RPC的核心模块是通讯和序列化
RPC的目的是为了实现远程调用并不在意用什么协议,所以可以用于各种网络协议,比如基于HTTP协议的RPC,或其他形式的RPC
6.市面上的RPC框架
- Dubbo:国内最早开源的RPC框架,由阿里巴巴公司开发并于2011年末对外开源,仅支持Java语言(逐渐支持多语言)
- Motan:微博内部使用的RPC框架,于2016年对外开源,仅支持Java语言
- Tars:腾讯内部使用的RPC框架,于2017年对外开源,仅支持C++语言
- Spring Cloud OpenFeign:国外Pivotal公司2014年对外开源的RPC框架,提供了丰富的生态组件
- gRPC: Google于2015年对外开源的跨语言RPC框架,支持多种语言
- Thrift:最初是由Facebook开发的内部系统跨语言的RPC框架,2007年贡献给了Apache基金,成为Apache开源项目之一,支持多种语言
7.RPC的应用场景
需要远程通信的各类场景
8.以Java为例看RPC的工作流程
9.RPC架构
角色
- 客户端(Client):服务的调用方
- 客户端存根(Client Stub):存放服务端的地址信息,再将客户端的请求参数打包成网络信息,然后通过网络远程发送给服务方
- 服务端(Server):真正的服务提供者
- 服务端存根(Server Stub):接收客户端发送过来的消息,将消息解包,并调用本地的方法
架构图
10.一次RPC同步调用过程流程
调用流程
具体流程
- 服务消费方以本地调用方式调用客户端存根
- 服务端收到消息后,交给代理存根在服务器的部分后进行解码为实际的方法名和参数
- 服务端存根根据解码结果调用服务器上本地的实际服务
- 本地服务执行并将结果返回给服务端存根
- 服务端存根将返回结果打包成消息并发送至消费方
- 客户端存根接收到消息,并进行解码
- 服务消费方得到最终结果
目的
RPC的目标就是要中间步骤都封装起来,让我们进行远程方法调用的时候感觉到就像在本地调用一样
11.RPC框架高级特性
- 服务注册与发现:RPC框架需要通过ip和port连接服务提供者,这个ip和端口,需要注册中心之类的来维护
- 管理后台:可以通过管理后台管理服务提供者与服务消费者,比如下线某个服务提供者
- 容错策略:比如调用了一个服务提供者如果超时或出现错误该如何处理
- 服务路由/版本支持:某个服务提供者有多个版本,可以选择指定版本调用
- 负载均衡:服务提供者可能是集群,需要用负载均衡来选一个提供者
- 熔断限流:调用某个服务提供者可能一直失败,可能对这个提供者做一些熔断的机制或进行限流等等
12.RPC相比HTTP的优势
站在进程间通信的角度去对比基于HTTP1.1和RPC之间的对比
- RPC框架一般使用长连接,不必每次通信都要建立连接,减少网络开销
- 应用程序之间存在强类型约束
- RPC使用私有协议,私密安全性高
- 通常基于二进制格式进行传输效率更高
13.RPC与HTTP该如何选择
- 对内RPC:内部调用推荐采用RPC方式
- 对外REST:对外开放的服务推荐采用RESTful