前言
上一小节我们讲到了 RPC 出现的原动力。其实对于 RPC 到底是什么还是有些模糊,本小节会详细描述在 RPC 中的一些概念。
RPC
RPC 这个概念术语在二十世纪 80 年代由 Bruce Jay Nelson 在论文 《Implementing Remote Procedure Calls》中提出。RPC 叫做远程过程调用,首先我们来肢解这个 “远程过程调用” 概念:
- 远程过程:它指把进程内的部分程序逻辑放到其它的机器上,也就是现在常说的业务拆解,让每个服务仅仅对单个业务负责,让每个服务具备独立的可扩展性、可升级性,易维护,在两台机器上的过程互相被称为远程过程,这个概念使正确的构建分布式计算更加容易,也为后续的服务化架构风格奠定了基础。
- 过程调用:它用于程序内的控制和数据的传输,这个机制很容易理解。
当 “过程调用” 遇到 “远程过程” 时,意味着过程调用可以跨越机器、网络来进行程序控制和数据的传输。
论文中提到,RPC 最基础的程序结构分为五个部分:
- User:可以看成是服务调用方,它的作用就是就是通过 User-stub 向服务提供方 Server 发起调用,并且接收从 User-stub 返回的调用结果。
- User-stub:服务调用方本地的存根对象,本地存根是一个可执行体。类似于反射获得的 invoke。它的作用是将需要远程调用的接口、方法以及参数通过约定好的协议进行序列化,并且将序列化的数据 RPCRuntime 对象进行传输,最后将服务提供方的返回值反序列化为 User 可以直接使用的对象。
- RPCRuntime:远程调用运行时的对象,可以把它理解为远程通信对象,它存在于服务提供方和服务调用方,作用是建立起调用方和提供方的连接,进行远程通信。
- Server-stub:服务提供方的本地存根,它的作用是把服务端的 RPCRuntime 中获得的数据进行反序列化,调用本地方法。把返回值进行序列化传输到 RPCRuntime 进行发送。
- Server:它是服务提供方的业务逻辑,Server-stub 调用的本地方法,执行的就是 Server 中对应方法的逻辑。
这是 RPC 最基础也是最关键的五部分,它奠定了后续各类 RPC 框架的基础。
在我看来 RPC 就好像是谈一场异地恋。两个服务之间的调用,就像是一对情侣分隔两地,只能靠着手机来保持联系,远程调用中的协议就像是情侣间的暗语,彼此约定,只有你们两个人才懂的交流方式,当然彼此也知道如何去编写消息以及解析对方的消息,这也就是 RPC 中的编解码。RPC 中的序列化方式就好比是你女朋友让你往东,你千万不能往西,或者她给你一个眼神,是告诉你她想吃东西,你千万不能误会成不想吃,必须要用相同的序列化方式,这样才不会导致服务调用出错,你的女朋友也就不会生气暴走。
在上一小节也略微提到了 RPC 并非完美,它的出现为分布式带来了便利,同时分布式本身的问题也被暴露出来:
- 通信的延迟:把一台机器内进程间通信变成跨机器、网络进行进程间通信,比如会因为网络延迟造成通信的延迟;
- 地址空间被隔离:在一台机器上可以通过共享内存来做到地址空间不被隔离,但是在跨网络是地址空间完全隔离的;
- 局部故障:如果在一台机器上,机器故障会导致全部出现故障,但是在分布式架构中,不同服务在不同的机器上,机器变多,出现故障的概率就增加,并且局部故障问题在定位问题上会变得复杂;
- 并发问题:在分布式架构中,必然会出现多个服务同时调用某个服务的并发问题,并发问题会导致各种意想不到的结果。
上面的问题都是分布式带来的问题,当然现在对应不同的问题也有了对应的解决方案。比如并发问题,现在有各种一致性协议算法。针对通信的延迟,也出现了异步通信的解决方案。有问题就要解决,不能逃避,逃避必然不会进步。
RPC 框架
从 RPC 概念被提出后,不断有基于该思想的项目产生,从 1991 年出现的 CORBA,再到后续的 ZeroC ICE、gRPC、Thrift、Dubbo、Motan、Hessian、Spring Cloud、Avro、Finagle 等各类框架的诞生,都表明了 RPC 被运用到越来越频繁和成熟。每个框架本身侧重点有所不同,比如 gRPC 侧重的是远程过程调用的性能,服务治理的能力相对比较薄弱,但是 Dubbo 就提供了很好的服务资源调度和服务治理能力。从服务框架等选型上需要从多个角度去对比,针对业务本身去做选择。
后续小节的内容会一点一点揭开 RPC 框架各部分组件。让读者能够清楚 RPC 框架内部基础构造是怎么样的,并且针对不同的组件,我会列举 2-3 个相关的主流技术来讲述。然后用一章来讲述实现一个简单的 RPC 框架,这是对前面各个组件讲解的实践。最后会拿 Dubbo 为例子,来讲述如何去看懂一个 RPC 框架。
后记
本文希望引用《Implementing Remote Procedure Calls》的概念来讲述 RPC 的部分概念,拿谈异地恋联系 RPC 各部分组件,为下文做一些铺垫。