论技术原理的相通性示例之一:RPC架构

我们在面试时,经常会被问到“RPC架构核心组件有哪些?”、“Dubbo框架的基本原理是怎么样的?”这样的问题。很多读者可能对这些问题有一定的了解,有些则可能没有什么思路。但对于那些能够回答这些问题的人而言,知道的可能也仅仅是针对这些问题的答案,也就是对于已经接触过或使用过的工具框架而言肯定多少能明白其中的原理,但是如果是那些没有用过的工具和框架呢?工具和框架发展日新月异,例如上面提到的Dubbo框架在2013年开始已经几乎不再更新,而在去年又重新启动维护工作。不难想象在不久的将来,我们还会出现第二个、第三个类似Dubbo这样的框架。我们知道Dubbo是阿里巴巴开源的一个分布式服务框架,其背后的核心原理就是实现了RPC和服务治理。对于任何一个分布式服务框架而言,RPC和服务治理都是不可缺少的组件,我们只要能够对RPC和服务治理有深刻的理解,对于Dubbo同类型的任何新框架,如果出现类似“RPC架构核心组件、Dubbo框架原理”这样的面试题,我们都应该有明确的回答思路和方法。为了达到这样的境界,这就要引出本文的核心主题,即我们认为技术知识体系之间存在一定的相通性。

关于RPC架构的组成有一定的固定结构,一般认为包括网络通信、序列化/反序列化、传输协议和服务调用等四个组件,而我们也知道RPC架构是构成分布式服务架构和微服务架构的基本结构。对于服务的提供者和调用者而言,RPC架构表现为一种对称结果(见下图)。

论技术原理的相通性示例之一:RPC架构

对于常见的分布式系统而言,RPC架构的应用非常常见。从技术原理的想通性上讲,我们这里要讲的是它在大数据体系中的应用。以Hadoop为代表的大数据生态系统中的大多数工具本质上也表现为一种分布式系统,也需要RPC架构这样的远程通信工具实现各个节点组件之间的协作和管理。

    我们来分析一下Hadoop中的RPC实现机制。Hadoop采用了RpcEngine接口封装了RPC的整个调用过程,RpcEngine接口提供了多个实现类,包括WritableRpcEngine(见下图中的左半部分)和ProtobufRpcEngine(见下图中的右半部分)。WritableRpcEngine使用Hadoop自带的Writable序列化机制实现远程调用过程中的序列化,包括Invoker类、Invocation类和Server类等三个核心类。Invoker是Java动态代理核心接口InvocationHandler的实现类,用于序列化并生成Invocation对象并将Invocation对象发送到远程服务器,同时获取响应并反序列化。而Invocation类代表RPC请求对象,包括方法、参数等调用信息。最后的Server类启动Socket监听RPC请求,调用WritableRpcInvoker响应请求。这里的WritableRpcInvoker负责响应远程客户端请求,发送序列化请求,并通过反射调用服务端程序并包装结果对象。另一方面,在ProtobufRpcEngine中,Invoker的序列化/反序列化工具使用Protobuf,并使用RPCRequest/ResponseWrapper包装RPC请求。而ProtobufRpcInvoker与WritableRpcInvoker的主要区别就是序列化/反序列化方式的不同。

论技术原理的相通性示例之一:RPC架构

Hadoop RPC客户端请求流程如下图所示,从下图中我们不难看到很多熟悉的名称,包括Proxy、Invoker、Protocol等,这些名词在RPC对称架构图中都有所体现。可以看到整个请求过程也是一个比较标准的动态代理实现方式,作为一种通用性实现机制,代理模式及其应用场景我们在后面的文章中也会有详细展开。

论技术原理的相通性示例之一:RPC架构

 在这个示例中,我们看到了动态代理、序列化、服务发布和引用等RPC架构中通用的技术体系,如果你已经掌握了这些知识点,那么就算没有具体分析过Hadoop中实现远程通信的过程,你也应该能够通过这些通用技术体系构建对Hadoop RPC的理解模型并在具体的面试过程中表现出对这块内容的理解程度。

更多内容可以关注我的公众号:程序员向架构师转型。

论技术原理的相通性示例之一:RPC架构