现在分布式系统大行其道的年代,RPC 有着无足轻重的位置。风靡的 Duboo、Thrift、gRpc 等框架各领风骚,深刻理解 RPC 是老手也是老鸟的必修课。
RPC 定义
近程服务调用(Remote procedure call)的概念历史已久,1981 年就曾经被提出,最后的目标就是为了 调用近程办法像调用本地办法一样简略,经验了四十多年的更新与迭代,RPC 的大体思路曾经趋于稳定,现在百家争鸣的 RPC 协定和框架,诸如 Dubbo(阿里)、Thrift(FaceBook)、gRpc(Google)、brpc(百度)等都在不同侧重点去解决最后的目标,有的想极致完满,有的谋求极致性能,有的偏差极致简略。
RPC 原理
让咱们回到 RPC 最后的目标,要想实现 调用近程办法像调用本地办法一样简略,至多要解决如下问题:
- 如何获取可用的近程服务器(服务注册与发现)
- 如何示意数据(序列化与反序列化)
- 如何传递数据(网络通讯)
- 服务端如何确定并调用指标办法(调用办法映射)
上述四点问题,都能与当初分布式系统炽热的术语一一对应,如何获取可用的近程服务器(服务注册与发现)、如何示意数据(序列化与反序列化)、如何传递数据(网络通讯)、服务端如何确定并调用指标办法(调用办法映射)。笔者将通过一个简略 RPC 我的项目来解决这些问题。
首先来看 RPC 的整体零碎架构图:
图中服务端启动时将本人的服务节点信息注册到注册核心,客户端调用近程办法时会订阅注册核心中的可用服务节点信息,拿到可用服务节点之后近程调用办法,当注册核心中的可用服务节点发生变化时会告诉客户端,防止客户端持续调用曾经生效的节点。那客户端是如何调用近程办法的呢,来看一下近程调用示意图:
- 客户端模块代理所有近程办法的调用
- 将指标服务、指标办法、调用指标办法的参数等必要信息序列化
- 序列化之后的数据包进一步压缩,压缩后的数据包通过网络通信传输到指标服务节点
- 服务节点将承受到的数据包进行解压
- 解压后的数据包反序列化成指标服务、指标办法、指标办法的调用参数
- 通过服务端代理调用指标办法获取后果,后果同样须要序列化、压缩而后回传给客户端
通过以上形容,置信读者应该大体上理解了 RPC 是如何工作的,接下来看如何应用代码具体实现上述的流程。鉴于篇幅笔者会抉择重要或者网络上介绍绝对较少的模块来讲述。
RPC 与 HTTP
先讲讲 HTTP
HTTP:Hypertext Transfer Protocol即超文本传输协定。
HTTP 协定在 1990 年才开始作为支流协定呈现;之所以被咱们所熟知,是因为通常 HTTP 用于 web 端,也就是 web 浏览器和 web 服务器交互。当 ajax 和 json 在前端大行其道的时候,json 也开始施展其本身能力,简洁易用的个性让 json 成为前后端数据传输支流抉择。HTTP 协定中以 Restful 标准为代表,其劣势很大。它 可读性好 ,且 能够失去防火墙的反对、跨语言的反对。
HTTP 的毛病也很快裸露:
- 有用信息占比少,HTTP 在 OSI 的第七层,蕴含了大量的 HTTP 头等信息
- 效率低,因为第七层的缘故,两头有很多层传递
- HTTP 协定 调用近程办法简单,须要封装各种参数名和参数值以及加密通信等
所以 RPC 好在哪?
- 都是有用信息
- 效率高
- 调用简略
- 无需关怀网络传输或者通信问题
HTTP 和 RPC 其实有分割
http 也是 rpc 实现的一种形式。
RPC 和 HTTP 一句话说不同
RPC 就像地区方言,只有外部晓得,单方都须要晓得方言,不然没法沟通
HTTP 就是普通话,根本都能懂,也会说
RPC 个别用于什么中央?
在 微服务、分布式 曾经成为日常的明天,服务通常都部署在不同的服务器,服务器也在不同地区,这时候就存在跨地区跨服务器调用问题,RPC 即用于这样相似的状况。
RPC 实用于公司外部应用,性能耗费低,传输效率高,服务治理不便,然而不倡议传输较大的文本、视频等。