现在分布式系统大行其道的年代,RPC 有着无足轻重的位置。风靡的 Duboo、Thrift、gRpc 等框架各领风骚,深刻理解RPC是老手也是老鸟的必修课。

RPC定义

近程服务调用(Remote procedure call)的概念历史已久,1981年就曾经被提出,最后的目标就是为了调用近程办法像调用本地办法一样简略,经验了四十多年的更新与迭代,RPC 的大体思路曾经趋于稳定,现在百家争鸣的 RPC 协定和框架,诸如 Dubbo (阿里)、Thrift(FaceBook)、gRpc(Google)、brpc (百度)等都在不同侧重点去解决最后的目标,有的想极致完满,有的谋求极致性能,有的偏差极致简略。

RPC原理

让咱们回到 RPC 最后的目标,要想实现调用近程办法像调用本地办法一样简略,至多要解决如下问题:

  1. 如何获取可用的近程服务器(服务注册与发现)
  2. 如何示意数据(序列化与反序列化)
  3. 如何传递数据(网络通讯)
  4. 服务端如何确定并调用指标办法(调用办法映射)

上述四点问题,都能与当初分布式系统炽热的术语一一对应,如何获取可用的近程服务器(服务注册与发现)、如何示意数据(序列化与反序列化)、如何传递数据(网络通讯)、服务端如何确定并调用指标办法(调用办法映射)。笔者将通过一个简略 RPC 我的项目来解决这些问题。

首先来看 RPC 的整体零碎架构图:

图中服务端启动时将本人的服务节点信息注册到注册核心,客户端调用近程办法时会订阅注册核心中的可用服务节点信息,拿到可用服务节点之后近程调用办法,当注册核心中的可用服务节点发生变化时会告诉客户端,防止客户端持续调用曾经生效的节点。那客户端是如何调用近程办法的呢,来看一下近程调用示意图:

  1. 客户端模块代理所有近程办法的调用
  2. 将指标服务、指标办法、调用指标办法的参数等必要信息序列化
  3. 序列化之后的数据包进一步压缩,压缩后的数据包通过网络通信传输到指标服务节点
  4. 服务节点将承受到的数据包进行解压
  5. 解压后的数据包反序列化成指标服务、指标办法、指标办法的调用参数
  6. 通过服务端代理调用指标办法获取后果,后果同样须要序列化、压缩而后回传给客户端

通过以上形容,置信读者应该大体上理解了 RPC 是如何工作的,接下来看如何应用代码具体实现上述的流程。鉴于篇幅笔者会抉择重要或者网络上介绍绝对较少的模块来讲述。

RPC与HTTP

先讲讲HTTP

HTTP:Hypertext Transfer Protocol即超文本传输协定。

HTTP协定在1990年才开始作为支流协定呈现;之所以被咱们所熟知,是因为通常HTTP用于web端,也就是web浏览器和web服务器交互。当ajax和json在前端大行其道的时候,json也开始施展其本身能力,简洁易用的个性让json成为前后端数据传输支流抉择。HTTP协定中以Restful标准为代表,其劣势很大。它可读性好,且能够失去防火墙的反对、跨语言的反对

HTTP的毛病也很快裸露:

  1. 有用信息占比少,HTTP在OSI的第七层,蕴含了大量的HTTP头等信息
  2. 效率低,因为第七层的缘故,两头有很多层传递
  3. HTTP协定调用近程办法简单,须要封装各种参数名和参数值以及加密通信等

所以RPC好在哪?

  1. 都是有用信息
  2. 效率高
  3. 调用简略
  4. 无需关怀网络传输或者通信问题

HTTP和RPC其实有分割

http也是rpc实现的一种形式。

RPC和HTTP一句话说不同

RPC就像地区方言,只有外部晓得,单方都须要晓得方言,不然没法沟通

HTTP就是普通话,根本都能懂,也会说

RPC个别用于什么中央?

微服务、分布式曾经成为日常的明天,服务通常都部署在不同的服务器,服务器也在不同地区,这时候就存在跨地区跨服务器调用问题,RPC即用于这样相似的状况

RPC实用于公司外部应用,性能耗费低,传输效率高,服务治理不便,然而不倡议传输较大的文本、视频等。