在最近的项目中,服务和微服务逐渐成为中大型分布式系统架构的主流方法,RPC正在发挥重要作用。我们在日常开发中或隐式或显式地使用RPC。一些刚进入该行业的程序员可能不了解RPC,即使他们有丰富的使用经验。原理不太清楚。缺乏原理层面的理解常常会导致开发过程中的误用。
本文分为《浅出篇》和《深入篇》两部分,其目的是对RPC的本质提供简单易懂的解析。我始终相信,只有理解了本质,应用才有可能。这样更好。
什么是RPC?
RPC,正式名称为Remote procedure Call,是一种进程间通信方式。这允许程序调用另一个地址空间(通常在共享网络的另一台机器上)中的过程或函数,而程序员无需显式编码此远程调用的详细信息。也就是说,无论程序员调用本地还是远程,程序员编写的调用代码本质上是相同的。
RPC 的起源
RPC这个概念术语是由Bruce Jay Nelson在20世纪80年代提出的。让我们回到开发RPC的最初动机是什么。 Nelson 的论文“实现远程过程调用”提出了几点:
1.简单性:RPC概念的语义非常清晰和简单,使得构建分布式计算变得很容易。
2.高效:过程调用显得非常简单、高效。
3.通用性:在独立计算中,进程往往是不同算法部分之间最重要的通信机制。
通俗地说,一般程序员都熟悉本地过程调用,因此让RPC与本地调用完全相似,更容易接受和使用,不会出现任何问题。 Nelson 的论文发表于30 年前,他的观点在今天看来确实具有先见之明,但今天使用的RPC 框架基本上实现了这一目标。
RPC的结构
Nelson 的论文指出,一个实现RPC 的程序由五个部分组成。
1. 用户
2.用户存根
3.RPCR运行时
4. 服务器存根
5、服务器
这五个部分之间的关系如下图所示。
这里的用户是在客户端。当用户想要发起远程调用时,他们实际上是在本地调用用户存根。用户存根负责通过商定的协议规范对被调用的接口、方法和参数进行编码,并通过本地RPCRuntime 实例发送到远程实例。远程RPCRuntime实例收到请求后,将其传递给服务器stub进行解码,发起本地调用,并将调用结果返回给用户。
RPC 实现
Nelson论文中提出的实现结构也成为了后续参考的标准模板。我大约10年前刚接触分布式计算时使用的CORBAR实现结构与此基本类似。为了解决不同平台上的RPC,CORBAR 使用IDL(接口定义语言)来定义远程接口并将其映射到特定的平台语言。此后,大多数跨语言平台RPC 本质上都采用了这种方式,包括大家熟悉的Web 服务(SOAP)和最近的开源Thrift。其中大部分是通过IDL定义的,IDL提供了映射和生成各种语言平台的用户和服务器存根的工具,并通过框架库提供RPCRuntime支持。然而,每个RPC框架都定义了自己不同的IDL格式,这似乎进一步增加了程序员的学习成本(和精力)。 Web服务努力建立行业标准,但标准规范复杂且低效。如果没有,Thrift 等人。不需要更高效的RPC 框架。
IDL 是RPC 最后手段的跨平台语言实现。解决更广泛的问题不可避免地会导致更复杂的解决方案。有了同一平台内的RPC,显然不需要开发Java原生的RMI等中间语言。这种语言对于Java程序员来说更加直接简单,降低了其使用的学习成本。目前市场上可用的RPC 框架被认为是多种多样的,据称有100 个流派。大家应该根据实际使用场景慎重选择型号,但我认为至少应该考虑以下几点:
1、性能指标
2. 我需要多语言平台吗?
3. 你的内网是开放的还是公网是开放的?
4、开源RPC框架本身的质量和社区活跃度
总结
《浅出篇》 这可能就到此结束了。《深入篇》 详细介绍了RPC 框架必须实现的基本功能及其可以实现的目标。我们还将以Java 平台上实现RPC 框架为例。分析您需要考虑的实现。
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/85066.html