接觸背景
因為工作上某項目的需要設計一種分布式處理耗時的運算,每個節點然后將運算結果返回給中心服務器,而最初未了解RPC這部分之前我的設計是在每一個RPC服務器上搭建一個webserver,然后部署運算的service在上面,用json的方式通訊,這樣肯定是可以實現的,但是部署極其麻煩又讓webserver大材小用還會增加其它腳本語言或者框架的依賴。
之前也是有聽說RPC,我當初也只是以為是一種概念,且需要自己實現的一種遠程過程調用,沒想到發現有大量現成的庫已經做好了包裝,讓你遠程調用就像本地一樣使用那么方便。
RPC介紹
RPC全稱叫Remote Procedure Call,中文叫遠程過程調用,它是一種通過網絡從一台計算機向另一台遠程計算機上所寫的模塊上請求服務,一般是函數調用形式,而不需要自己實現底層變量類型轉換數據再傳輸等網絡技術的協議。
優點
使用者無需關注各個服務器之間調用所需的網絡協議部分(比如tcp分包重傳、http的參數協議制定),可以把更多的精力花在業務功能邏輯上,特別適合應用在分布式服務器上。
缺點
安全性一直是RPC的弊病,因為此協議一般沒有用於驗證調用者機制,如果把它直接替代簡單的CURD並暴露給外部用戶使用可能會很快被黑客利用。所以一般應用在企業內網或者設定防火牆ACL或者由遠程計算機自行判斷IP。
RPC實例(Python)
各種不同的語言對此都有自己的不同解決方案。比如Unix下,C可以用SUNRPC,Java則可使用RMI來處理。
Python同樣也提供了一個基於XMLRPC的解決方案,用法非常簡單:
首先,就像在編寫普通的程序那樣子編寫你的模塊或函數。
接着使用xmlrpc.server模塊運行XMLRPC服務器,並且設定綁定IP和Port,以及注冊服務器暴露出去的函數。
最后,在客戶端內使用xmlrpc.client連接到服務器,想要調用服務器的函數像在本地的函數一樣直接調用注冊過的函數名即可。
XMLRPC server code:
# -*- coding:utf-8 -*- from xmlrpc.server import SimpleXMLRPCServer from socketserver import ThreadingMixIn class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer): pass def add(x, y): return x + y if __name__ == '__main__': #rpc_server = SimpleXMLRPCServer(('0.0.0.0', 8848)) #使用這個會讓add函數始終只能同時處理一件事,必須等前一件事情做完才能接新任務 rpc_server = ThreadXMLRPCServer(('0.0.0.0', 8848)) #支持異步並行接受任務 rpc_server.register_function(add, "add") rpc_server.serve_forever()
XML RPC client code:
# -*- coding:utf-8 -*- import xmlrpc.client if __name__ == '__main__': rpc_client = xmlrpc.client.ServerProxy("http://127.0.0.1:8848") print( rpc_client.add(3,4) ) print( rpc_client.add("a+","b=c") )
首先啟動Server端代碼,再啟動Client代碼,即可得到輸出的7、a+b=c結果,說明成功透過RPC遠程調用add函數。
到此一個遠程調用就完成了。感謝閱讀,望能對讀者有幫助。