論技術原理的相通性示例之一:RPC架構

我們在面試時,經常會被問到“RPC架構核心組件有哪些?”、“Dubbo框架的基本原理是怎麼樣的?”這樣的問題。很多讀者可能對這些問題有一定的瞭解,有些則可能沒有什麼思路。但對於那些能夠回答這些問題的人而言,知道的可能也僅僅是針對這些問題的答案,也就是對於已經接觸過或使用過的工具框架而言肯定多少能明白其中的原理,但是如果是那些沒有用過的工具和框架呢?工具和框架發展日新月異,例如上面提到的Dubbo框架在2013年開始已經幾乎不再更新,而在去年又重新啓動維護工作。不難想象在不久的將來,我們還會出現第二個、第三個類似Dubbo這樣的框架。我們知道Dubbo是阿里巴巴開源的一個分佈式服務框架,其背後的核心原理就是實現了RPC和服務治理。對於任何一個分佈式服務框架而言,RPC和服務治理都是不可缺少的組件,我們只要能夠對RPC和服務治理有深刻的理解,對於Dubbo同類型的任何新框架,如果出現類似“RPC架構核心組件、Dubbo框架原理”這樣的面試題,我們都應該有明確的回答思路和方法。爲了達到這樣的境界,這就要引出本文的核心主題,即我們認爲技術知識體系之間存在一定的相通性。

關於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的主要區別就是序列化/反序列化方式的不同。

Hadoop RPC客戶端請求流程如下圖所示,從下圖中我們不難看到很多熟悉的名稱,包括Proxy、Invoker、Protocol等,這些名詞在RPC對稱架構圖中都有所體現。可以看到整個請求過程也是一個比較標準的動態代理實現方式,作爲一種通用性實現機制,代理模式及其應用場景我們在後面的文章中也會有詳細展開。

 在這個示例中,我們看到了動態代理、序列化、服務發佈和引用等RPC架構中通用的技術體系,如果你已經掌握了這些知識點,那麼就算沒有具體分析過Hadoop中實現遠程通信的過程,你也應該能夠通過這些通用技術體系構建對Hadoop RPC的理解模型並在具體的面試過程中表現出對這塊內容的理解程度。

更多內容可以關注我的公衆號:程序員向架構師轉型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章