01.前言

81 阅读5分钟

前言

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框架

  1. Dubbo:国内最早开源的RPC框架,由阿里巴巴公司开发并于2011年末对外开源,仅支持Java语言(逐渐支持多语言)
  2. Motan:微博内部使用的RPC框架,于2016年对外开源,仅支持Java语言
  3. Tars:腾讯内部使用的RPC框架,于2017年对外开源,仅支持C++语言
  4. Spring Cloud OpenFeign:国外Pivotal公司2014年对外开源的RPC框架,提供了丰富的生态组件
  5. gRPC: Google于2015年对外开源的跨语言RPC框架,支持多种语言
  6. Thrift:最初是由Facebook开发的内部系统跨语言的RPC框架,2007年贡献给了Apache基金,成为Apache开源项目之一,支持多种语言

7.RPC的应用场景

需要远程通信的各类场景

8.以Java为例看RPC的工作流程

9.RPC架构

角色

  1. 客户端(Client):服务的调用方
  2. 客户端存根(Client Stub):存放服务端的地址信息,再将客户端的请求参数打包成网络信息,然后通过网络远程发送给服务方
  3. 服务端(Server):真正的服务提供者
  4. 服务端存根(Server Stub):接收客户端发送过来的消息,将消息解包,并调用本地的方法

架构图

10.一次RPC同步调用过程流程

调用流程

具体流程

  1. 服务消费方以本地调用方式调用客户端存根
  2. 服务端收到消息后,交给代理存根在服务器的部分后进行解码为实际的方法名和参数
  3. 服务端存根根据解码结果调用服务器上本地的实际服务
  4. 本地服务执行并将结果返回给服务端存根
  5. 服务端存根将返回结果打包成消息并发送至消费方
  6. 客户端存根接收到消息,并进行解码
  7. 服务消费方得到最终结果

目的

RPC的目标就是要中间步骤都封装起来,让我们进行远程方法调用的时候感觉到就像在本地调用一样

11.RPC框架高级特性

  • 服务注册与发现:RPC框架需要通过ip和port连接服务提供者,这个ip和端口,需要注册中心之类的来维护
  • 管理后台:可以通过管理后台管理服务提供者与服务消费者,比如下线某个服务提供者
  • 容错策略:比如调用了一个服务提供者如果超时或出现错误该如何处理
  • 服务路由/版本支持:某个服务提供者有多个版本,可以选择指定版本调用
  • 负载均衡:服务提供者可能是集群,需要用负载均衡来选一个提供者
  • 熔断限流:调用某个服务提供者可能一直失败,可能对这个提供者做一些熔断的机制或进行限流等等

12.RPC相比HTTP的优势

站在进程间通信的角度去对比基于HTTP1.1和RPC之间的对比

  • RPC框架一般使用长连接,不必每次通信都要建立连接,减少网络开销
  • 应用程序之间存在强类型约束
  • RPC使用私有协议,私密安全性高
  • 通常基于二进制格式进行传输效率更高

13.RPC与HTTP该如何选择

  • 对内RPC:内部调用推荐采用RPC方式
  • 对外REST:对外开放的服务推荐采用RESTful

14.RPC与REST的对比