当前位置 - 養生大全網 - 減肥食譜 - 從0到1:完全理解RPC遠程調用

從0到1:完全理解RPC遠程調用

作者| Python編程時間

編輯|胡瑋煒

RPC是什麽?百度百科給出的解釋是:“RPC(遠程過程調用協議)——在不了解底層網絡技術的情況下,通過網絡向遠程計算機程序請求服務的協議”。

這個概念聽起來還是很抽象,沒關系。繼續回頭看。我會把概念性的東西講得足夠清楚,讓妳完全掌握RPC的基本內容。

OpenStack的進程間通信主要有兩種方式,壹種是基於HTTP協議的RESTFul API,另壹種是RPC調用。

那麽這兩種方式在應用場景上有什麽區別呢?

有經驗的人會知道:

首先我會問妳兩個問題,然後跟著往下看:

1,RPC和REST有什麽區別?2.為什麽要采用RPC?

首先第壹個問題:RPC和REST有什麽區別?

妳壹定覺得這個問題很奇怪,是的,包括我在內,但是妳在網上搜索,會發現到處都是類似的對比文章。我在想,很多初學者因為基礎薄弱,可能會把不相幹的兩者進行比較。既然這樣,為了讓妳對奇怪的RPC有更多的了解,就從妳太熟悉的其余部分開始吧。

01,不同類別

REST是表象狀態轉移的簡稱,用中文描述表象狀態轉移(指某壹瞬間的資源數據快照,包括資源數據的內容和呈現格式(XML,JSON)等信息。)

REST是壹種軟件架構風格。這種風格的典型應用是HTTP。由於其簡單性和很強的可擴展性,受到了開發者的廣泛青睞。

RPC是Remote Procedure Call Protocol(遠程過程調用協議)的簡稱,在中文中是遠程過程調用,使客戶端可以像調用本地服務(方法)壹樣調用服務器的服務(方法)。

RPC可以基於TCP/UDP或HTTP協議傳輸。按理說RPC和REST不是壹回事,不應該放在壹起討論。但是誰讓REST這麽受歡迎呢?是目前互聯網應用最流行的API設計標準。某種意義上,我們說的REST,其實指的是HTTP協議。

02、不同方式的使用

03,不同的面向對象。

從設計上看,RPC,所謂的遠程過程調用,是面向方法的,REST,所謂的具象狀態轉移,是面向資源的,另外還有壹個所謂的SOA,所謂的面向服務的架構,是面向消息的,這個聯系我就不多說了。

04.序列化協議是不同的。

接口調用通常由兩部分組成,序列化和通信協議。

通信協議,如上所述,REST基於HTTP協議,而RPC可以基於TCP/UDP或HTTP協議傳輸。

常見的序列化協議有:json、xml、hession、protobuf、thrift、text、bytes等。REST通常使用JSON或XML,而RPC使用JSON-RPC或XML-RPC。

通過以上幾點,我們知道REST和RPC有明顯的區別。

那麽第二個問題:為什麽要用RPC?

那我們為什麽要用RPC呢?我們不能只依賴RESTful API嗎?為什麽要做那麽多復雜的協議?渣說妳真的學不會。

至此,以下幾點只是我個人的猜測,僅供交流:

說了這麽多,兩者應該如何選擇呢?我總結了以下兩點,供大家參考:

“遠程調用”是指被調用方法的具體實現不在本地程序中,而是在別的地方(分布到各個服務器)。調用者只想要函數運算的結果,而不需要實現函數的具體細節。

光說不練。接下來,我將通過三種不同的方式讓妳充分理解rpc遠程調用是如何實現的。

01,基於xml-rpc

Python可以通過使用標準庫中的SimpleXMLrpcServer來實現RPC,標準庫是基於XML-RPC協議的。

有了這個模塊,打開壹個rpc服務器變得非常簡單。執行以下代碼:

有了rpc服務器,下壹步就是rpc客戶端。因為上面用的是XML-RPC,所以rpc clinet需要使用xmlrpclib的庫。

然後,我們可以通過server_proxy對象遠程調用之前rpc服務器的功能。

SimpleXMLRPCServer是壹個單線程服務器。這意味著,如果幾個客戶端同時發出多個請求,其他請求必須等待第壹個請求完成後才能繼續。

使用SimpleXMLRPCServer實現多線程並發並不難。只需將代碼更改為以下內容。

02,基於json-rpc

SimpleXMLRPCServer是基於xml-rpc的遠程調用。如上所述,除了xml-rpc,還有json-rpc協議。

那麽python是如何實現json-rpc協議的呢?

答案是很多。許多web框架已經自己實現了json-rpc,但是我們必須獨立於這些框架尋求壹個更幹凈的解決方案。我發現了兩個選擇。

第壹個是jsonrpclib。

第二個是python-jsonrpc。

我們先來看第壹個jsonrpclib。

和Python標準庫中的SimpleXMLRPCServer很像(因為它的類名是SimpleJSONRPCServer,不明真相的人還真以為是兄弟)。可以說jsonrpclib是在SimpleXMLRPCServer標準庫之後編寫的。

它的導入與SimpleXMLRPCServer略有不同,因為SimpleJSONRPCServer分布在jsonrpclib庫中。

計算機網絡服務器

客戶

我們來看第二個python-jsonrpc,寫起來好像有點復雜。

計算機網絡服務器

客戶

調用過程如下

我還記得上面說的zabbix API,因為壹直在接觸,所以也拿出來說說。Zabbix API也是基於json-rpc 2.0協議實現的。

因為內容很多,所以我只給大家展示壹下zabbix是怎麽調用的:直接指明調用zabbix服務器的方法,以及給這個方法傳遞什麽參數。

03,基於zerorpc

上面提到的兩種rpc遠程調用方法,如果妳足夠細心的話,可以發現兩者都是),我會更新補充notify的內容。

OpenStack RPC模塊提供了三種RPC調用方法,rpc.call,RPC。Cast和RPC。Fanout _ cast,用於發送和接收RPC請求。

Rpc.call和。rpc.cast在實現代碼上差別不大,就是調用時會取wait_for_reply=True參數,而cast不會。

要理解rpc的調用機制,首先要知道oslo_messaging的幾個概念。有四種主要方法:

傳輸:RPC函數的底層實現方法。下面是rabbitmq的消息隊列的訪問路徑。

傳輸就是定義如何訪問消息中間件。比如妳用Rabbitmq,nova.conf裏面應該有壹行transport_url配置可以清楚的看到rabbitmq被指定為消息中間件,配置了連接rabbitmq的用戶、passwd、主機和端口。

Target用於表示RPC服務器是否監聽主題、服務器名稱和服務器監控的交換,或者是否廣播扇出。

為了獲得消息,rpc服務器需要定義目標,就像門牌號壹樣。

為了發送消息,rpc客戶端還需要壹個目標,指示消息要發送到哪裏。

端點:是可以被其他人遠程調用的對象。

RPC服務器公開端點,每個端點包含壹系列可由遠程客戶端通過傳輸調用的方法。直觀上可以參考nova-conductor創建rpc服務器的代碼,這裏的端點是nova/Manager . py:Conductor Manager。

Dispatcher: Dispatcher,這只是rpc server的壹個概念。

只有通過它,服務器才能知道誰來處理收到的rpc請求,以及如何處理。

在客戶端,這指定了調用哪個方法。

在服務器端,妳如何知道執行這個方法?這就是調度員的工作。它從端點找到這個方法,執行它,最後返回。

Serializer:用於在python對象和消息(通知)之間序列化或反序列化數據的基類。

有四種主要方法:

每個通知偵聽器都綁定到壹個執行器,以控制接收到的通知是如何分發的。默認情況下,使用阻塞執行器(具體特性請參考執行部分)。

模仿是壹種非常有效的學習方法。這裏我根據OpenStack的調用方法,提取核心內容,寫壹個簡單的demo。對OpenStack感興趣的可以了解壹下,大部分人可以直接跳過這壹章。

註意下面的代碼不能直接運行,需要配置rabbitmq的連接方式。妳可以把它寫在配置文件中,從cfg中讀取。CONF通過get_transport,也可以直接寫成url格式作為參數傳遞給get_transport。而且在nova或其他openstack組件的環境中(因為需要環境變量ctxt)

簡單rpc客戶端

簡單rpc服務器

結束

熱門文章推薦

?臉書發行金錢天秤座;;谷歌十億美元為窮人建房子;第四代樹莓Pi 4發布|開發者周刊

?WebRTC將統壹實時音視頻世界?

?小米崔寶秋:小米AIoT深度擁抱開源

?華為在美國的R&D機構Futurewei打算分拆?

?老司機教妳怎麽寫沒人敢維護的代碼!

?Python有什麽技術優勢?比其他語言好的是什麽?

?如果去不了北大的圖靈,清華的姚班,AI專業還能去哪裏?

?公鏈史記|從鴻蒙系統開始到萬物生長的十年激蕩...

?邊緣計算有必要容器化嗎?

?馬雲曾經是偶像,最後失去了阿裏留下的1400億!

妳點的每壹個“看”,我都當真當成了最愛。