rpc調用過程


在openstack中,各個組件之間的調用遵循RESTful風格,而組件內部各服務之間的相互調用采用rpc遠程調用,比如nova-conductor和nova-compute

rpc原理:

首先了解什么叫RPC,為什么要RPC,RPC是指遠程過程調用,也就是說兩台服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,由於不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的數據。比如說,一個方法可能是這樣定義的:
Employee getEmployeeByName(String fullName)那么:

  • 首先,要解決通訊的問題,主要是通過在客戶端和服務器之間建立TCP連接,遠程過程調用的所有交換的數據都在這個連接里傳輸。連接可以是按需連接,調用結束后就斷掉,也可以是長連接,多個遠程過程調用共享同一個連接。
  • 第二,要解決尋址的問題,也就是說,A服務器上的應用怎么告訴底層的RPC框架,如何連接到B服務器(如主機或IP地址)以及特定的端口,方法的名稱名稱是什么,這樣才能完成調用。比如基於Web服務協議棧的RPC,就要提供一個endpoint

         URI,或者是從UDDI服務上查找。如果是RMI調用的話,還需要一個RMI Registry來注冊服務的地址。

  • 第三,當A服務器上的應用發起遠程過程調用時,方法的參數需要通過底層的網絡協議如TCP傳遞到B服務器,由於網絡協議是基於二進制的,內存中的參數的值要序列化成二進制的形式,也就是序列化(Serialize)或編組(marshal),通過尋址和傳輸將序列化的二進制發送給B服務器。
  • 第四,B服務器收到請求后,需要對參數進行反序列化(序列化的逆操作),恢復為內存中的表達方式,然后找到對應的方法(尋址的一部分)進行本地調用,然后得到返回值。
  • 第五,返回值還要發送回服務器A上的應用,也要經過序列化的方式發送,服務器A接到后,再反序列化,恢復為內存中的表達方式,交給A服務器上的應用

 

rpc的簡單實現:

參考博文:https://www.jianshu.com/p/5b90a4e70783

 

OpenStack處理消息隊列的oslo-messaging依賴包

與RabbitMQ調用相關的類和方法:

Trove在M版本中使用OpenStack提供的oslo-messaging依賴包進行RPC調用,在oslo-messaging中與RPC調用相關的類和方法主要由以下幾個:
        1) Target類:該類主要用於描述客戶端發送的消息去哪兒和服務端接收什么消息。其主要成員變量有:
                exchange:將接收到的消息分類,並告知消息分發到何種路由何種隊列。
                topic:是RPC消息的唯一標識,客戶端發送topic的消息,服務端則接收處理對應topic的消息。
                namespace:服務端可以在一個topic上提供多個方法集合,這個集合通過namespace分開管理。
                fanout:如果為True,則將消息發送到所有滿足條件的server上,此時會忽略topic指定的內容。
                server:服務端標識。
                version:標識rpc api的版本。
        2) Transport類:實現監聽和發送消息的抽象層,具體實現則是由Transport成員變量_driver來定義的。
        3) RabbitDriver類:具體實現消息的監聽,發送等操作,在OpenStack Trove組件中使用的是RabbitMQ消息隊列,因此在調用時會匹配到RabbitDriver類。
        4) MassageHandlingServer類:監聽消息的服務端。將一個Transport和一個PRCDispatcher聯系起來,用於分發和處理消息。
        5) RPCDispatcher類:定義了具體的消息分發機制。
        6) RPCClient類:消息客戶端,利用一個可調用_CallContext對象發送消息。

OpenStack RPC處理流程:

在OpenStack使用RPC傳輸和處理消息時,首先會根據消息接收端的Target和endpoints初始化一個RPCDispatcher,然后會根據具體的Transport和定義的RPCDispatcher創建一個MessageHandlingServer接收並處理消息。
當實例化一個RPCClient之后,客戶端發送cast或call消息,最終會調用Transport中定義的RabbitDriver對應的send()方法發送消息。
當Server端接收到消息后,則會調用RPCDispatcher對象中的dispatch()方法定義的規則找到具體的Manager處理消息中對應的操作。
如果是call調用,則會監聽處理方法時候執行完成,當執行完成之后則返回相應的值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM