什么是RPC?
RPC(Remote Procedure Call),即远程过程调用。它允许像调用本地服务一样调用远程服务。而无需了解网络的细节(不需要直接处理Socket通讯或Http通讯)。
RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个请求响应模型。客户端发起请求,服务器返回响应。
RPC可以分为两部分:用户调用接口 + 具体网络协议。前者为开发者需要关心的,后者由框架来实现。
大白话理解RPC就是:RPC让你用别人家的东西就像自己家的一样。
RPC 是1984年由 Andrew D. Birrell & Bruce Jay Nelson 提出的(二位大佬的论文《Implementing Remote Procedure Calls》),目的就是让分布式系统更加简单,让开发人员把精力放到业务上,并且提供高效安全的通信。
RFC:1831 | RFC:5531 RPC: Remote Procedure Call Protocol Specification Version 2
RPC的优缺点
优点:
帮助客户端通过高级语言中的传统过程调用与服务器通信。
可在分布式环境和本地环境中使用。
支持面向进程和面向线程的模型。
隐藏了用户对内部消息传递机制的了解。
重新编写和重新开发代码所需的工作量很小。
提供抽象,即网络通信的消息传递性质对用户而言是隐藏的。
省略了许多协议层以提高性能。
提升系统高可用,可扩展性、可维护性和持续交付能力。
缺点:
客户端和服务器使用不同的执行环境进行各自的例程,资源的使用更加复杂,因此RPC系统并不总是适用于大量数据的传输。
由于涉及通信系统、另一台机器和另一个进程,RPC非常容易出现故障。
RPC没有统一的标准,可以以多种方式实现。
RPC只是基于交互的,因此在硬件架构方面缺乏灵活性。
RPC典型系统架构及应用场景
在一个典型 RPC 的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件,其中“RPC协议”就指明了程序如何进行网络传输和序列化。
RPC的主要使用场景:
RPC 主要用于公司内部的服务调用(准确地说是大型系统内部各模块、子系统间的调用,而不是提供给外界调用),性能消耗低,传输效率高,实现复杂。
相对而言,HTTP 主要用于对外的异构环境,比如:浏览器接口调用、App 接口调用、第三方接口调用等。
RPC 的主要使用场景尤其是大型的网站的情况下,内部子系统较多、接口非常多的情况下适合使用 RPC。
RPC 的使用场景一般来说有以下特点:
1)长链接:不必每次通信都要像 HTTP 一样去 3 次握手,减少了网络开销;
2)注册发布机制:RPC 框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作;
3)安全性:没有暴露资源操作;
4)微服务支持:就是最近流行的服务化架构、服务化治理,RPC 框架是一个强力的支撑。
常见 RPC 技术和框架:
1)应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
2)远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
3)通信框架:MINA 和 Netty。
目前流行的开源 RPC 框架还是比较多的,有阿里巴巴的 Dubbo、Facebook 的 Thrift、Google 的 gRPC、Twitter 的 Finagle 等。
当前最流行的三种RPC框架主要特点:
1)gRPC:是 Google 公布的开源软件,基于最新的 HTTP 2.0 协议,并支持常见的众多编程语言。RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持;
2)Thrift:是 Facebook 的开源 RPC 框架,主要是一个跨语言的服务开发框架。用户只要在其之上进行二次开发就行,应用对于底层的 RPC 通讯等都是透明的。不过这个对于用户来说需要学习特定领域语言这个特性,还是有一定成本的;
3)Dubbo:是阿里集团开源的一个极为出名的 RPC 框架,在很多互联网公司和企业应用中广泛使用。协议和序列化框架都可以插拔是极其鲜明的特色。
RPC原理
一个 RPC 的核心功能主要有 5 个部分组成,分别是:客户端、客户端 Stub、网络传输模块、服务端 Stub、服务端等。
1)客户端(Client):服务调用方;
2)客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端;
3)服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理;
4)服务端(Server):服务的真正提供者;
5)Network Service:底层传输,可以是 TCP 或 HTTP。
RPC调用过程:
① 服务调用方(client)以本地调用方式调用服务;
② client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
③ client stub找到服务地址,并将消息发送到服务端;
④ server 端接收到消息;
⑤ server stub收到消息后进行解码;
⑥ server stub根据解码结果调用本地的服务;
⑦ 本地服务执行并将结果返回给server stub;
⑧ server stub将返回结果打包成能够进行网络传输的消息体;
⑨ 按地址将消息发送至调用方;
⑩ client 端接收到消息;
⑪ client stub收到消息并进行解码;
⑫ 调用方得到最终结果。
RPC的生命周期
RPC学习指南
图文整理自网络