深入浅出 RPC - 浅出篇

原创 2014年09月22日 11:06:05

本文来自本人独立博客,为获得更佳阅读体验,请点击 这里

----------------------------------------------------------------------------------------------------


近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 RPC 在其中扮演着关键的作用。在平时的日常开发中我们都在隐式或显式的使用 RPC,一些刚入行的程序员会感觉 RPC 比较神秘,而一些有多年使用 RPC 经验的程序员虽然使用经验丰富,但有些对其原理也不甚了了。缺乏对原理层面的理解,往往也会造成开发中的一些误用。

本文分上下两篇《浅出篇》和《深入篇》,其目标就是想尝试深入浅出的分析下 RPC 本质,我总是这么认为理解了本质才能更好的应用。

RPC 是什么?

RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。

RPC 起源

RPC 这个概念术语在上世纪 80 年代由 Bruce Jay Nelson 提出。这里我们追溯下当初开发 RPC 的原动机是什么?在 Nelson 的论文 "Implementing Remote Procedure Calls" 中他提到了几点:

1. 简单:RPC 概念的语义十分清晰和简单,这样建立分布式计算就更容易。
2. 高效:过程调用看起来十分简单而且高效。
3. 通用:在单机计算中过程往往是不同算法部分间最重要的通信机制。

通俗一点说,就是一般程序员对于本地的过程调用很熟悉,那么我们把 RPC 作成和本地调用完全类似,那么就更容易被接受,使用起来毫无障碍。Nelson 的论文发表于 30 年前,其观点今天看来确实高瞻远瞩,今天我们使用的 RPC 框架基本就是按这个目标来实现的。

RPC 结构

Nelson 的论文中指出实现 RPC 的程序包括 5 个部分:

1. User
2. User-stub
3. RPCRuntime
4. Server-stub
5. Server

这 5 个部分的关系如下图所示

这里 user 就是 client 端,当 user 想发起一个远程调用时,它实际是通过本地调用 user-stub。user-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime 实例传输到远端的实例。远端 RPCRuntime 实例收到请求后交给 server-stub 进行解码后发起本地端调用,调用结果再返回给 user 端。

RPC 实现

Nelson 论文中给出的这个实现结构也成为后来大家参考的标准范本。大约 10 年前,我最早接触分布式计算时使用的 CORBAR 实现结构基本与此类似。CORBAR 为了解决异构平台的 RPC,使用了 IDL(Interface Definition Language)来定义远程接口,并将其映射到特定的平台语言中。后来大部分的跨语言平台 RPC 基本都采用了此类方式,比如我们熟悉的 Web Service(SOAP),近年开源的 Thrift 等。他们大部分都通过 IDL 定义,并提供工具来映射生成不同语言平台的 user-stub 和 server-stub,并通过框架库来提供 RPCRuntime 的支持。不过貌似每个不同的 RPC 框架都定义了各自不同的 IDL 格式,导致程序员的学习成本进一步上升(苦逼啊),Web Service 尝试建立业界标准,无赖标准规范复杂而效率偏低,否则 Thrift 等更高效的 RPC 框架就没必要出现了。

IDL 是为了跨平台语言实现 RPC 不得已的选择,要解决更广泛的问题自然导致了更复杂的方案。而对于同一平台内的 RPC 而言显然没必要搞个中间语言出来,例如 java 原生的 RMI,这样对于 java 程序员而言显得更直接简单,降低使用的学习成本。目前市面上提供的 RPC 框架已经可算是五花八门,百家争鸣了。需要根据实际使用场景谨慎选型,需要考虑的选型因素我觉得至少包括下面几点:

1. 性能指标
2. 是否需要跨语言平台
3. 内网开放还是公网开放
4. 开源 RPC 框架本身的质量、社区活跃度

总结

《浅出篇》大概就到这里结束了,《深入篇》会具体深入讲解一个 RPC 框架需要实现哪里基本功能,达到什么目标,并以在 java 平台上去具体实现一个 RPC 框架为例,分析其需要考虑的实现因素。

版权声明:本文为博主原创文章,未经博主允许不得转载。

RPC服务和HTTP服务对比

很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单...
  • wangyunpeng0319
  • wangyunpeng0319
  • 2017年11月28日 10:03
  • 4855

深入浅出 RPC - 深入篇

《深入篇》我们主要围绕 RPC 的功能目标和实现考量去展开,一个基本的 RPC 框架应该提供什么功能,满足什么要求以及如何去实现它? RPC 功能目标 RPC 的主要功能目标是让构建分布式计算(应用)...
  • mindfloating
  • mindfloating
  • 2014年09月22日 11:25
  • 222162

什么样的RPC才是好用的RPC

什么样的RPC才是好用的RPC现在RPC框架很多,但是真正好用的RPC却是少之又少。那么什么是好用的RPC,什么是不好用的RPC呢,有一个评判标准吗?下面是我列举出来的衡量RPC好用与否的几条标准: ...
  • qicosmos
  • qicosmos
  • 2016年08月31日 17:11
  • 8211

高效传输数据格式以及基于HTTP2的RPC框架---gRPC的使用

google有一款非常高效的数据传输格式框架ProtoBuffer。基于该数据传输的RPC框架会非常高效,如果再让该RPC在基于HTTP2.......
  • canot
  • canot
  • 2017年05月05日 15:48
  • 3464

rpc简介、原理、实例-缘于difx

今天稍微研究了一下关于rpc的东东,主要是因为Pro.Z碰到的问题,在解决了以后,对rpc产生了一些兴趣,考虑到我目前的程序也可以从比较底层的socket方式概率为rpc方式,看的过程中,看到了一个网...
  • l0605020112
  • l0605020112
  • 2013年11月14日 11:14
  • 44450

JAVA中几种常用的RPC框架介绍

RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展。Java中的RPC框架比较多,各有特色,广泛使用的有RMI、Hessian、Dubbo等。 1、R...
  • zhaowen25
  • zhaowen25
  • 2015年05月02日 23:17
  • 85978

Http与RPC通信协议的比较

OSI网络结构的七层模型各层的具体描述如下:  第七层:应用层     定义了用于在网络中进行通信和数据传输的接口 - 用户程式;提供标准服务,比如虚拟终端、文件以及任务的传输 和处理;   第六层:...
  • 21aspnet
  • 21aspnet
  • 2011年11月09日 10:51
  • 28442

远程过程调用(RPC)详解

本文介绍了什么是远程过程调用(RPC),RPC 有哪些常用的方法,RPC 经历了哪些发展阶段,以及比较了各种 RPC 技术的优劣。...
  • kkkloveyou
  • kkkloveyou
  • 2016年07月11日 00:12
  • 22431

rpc调用

RPC调用 rpc调用 类似C/S socket模式的编程,通过TCP或者UDP在客户端和服务端建立连接,客户端可以像本地调用一样 ,调用服务端的函数。 分为以下两种情况: ...
  • u010453363
  • u010453363
  • 2015年12月15日 09:48
  • 290

简单的分布式RPC框架 《blackRpc》 二

警告:本文仅仅适合初探RPC的小伙伴,对于业界老鸟的话,就不建议吐槽了。。。。 第一篇我们介绍了一个简单的远程调用模型,下面我们深入一点来说说服务注册与发现。 服务注册与发现这个概念我也是...
  • u012582756
  • u012582756
  • 2018年01月08日 11:28
  • 115
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入浅出 RPC - 浅出篇
举报原因:
原因补充:

(最多只允许输入30个字)