0 前言
RPC 是 Remote Procedure Call 的縮寫,翻譯成中文為:遠程方法調用。
在 Python 中,我們可以使用 XML-RPC 協議創建自己的跨平台,獨立於語言的服務器。XML Remote Procedure Call,即 XML 遠程方法調用。
XML-RPC 發表於1998年,它是一套允許運行在不同操作系統、不同環境的程序實現基於 Internet 過程調用的規范和一系列的實現。這種遠程過程調用使用 http 作為傳輸協議,XML 作為傳送信息的編碼格式。
XML-RPC 的定義盡可能的保持了簡單,但同時能夠傳送、處理、返回復雜的數據結構。XML- RPC(http://www.xmlrpc.com)是由 UserLand Software(UserLand Software)的 Dave Winer 及 Microsoft 共同發表[2]。後來在新的功能不斷被引入下,這個標准慢慢演變成為今日的 SOAP 協定。XML-RPC 是一種遠程過程調用方法,它使用通過 HTTP 傳遞的 XML 作為載體。 有了它,客戶端可以在遠程服務器上調用帶參數的方法(服務器以 URI 命名)並獲取結構化的數據。
簡單的理解是:將數據定義為 XML 格式,通過 HTTP 協議進行遠程傳輸。
1 服務器
在 Python 中,
xmlrpc
模塊是一個集合了 XML-RPC 服務端與客戶端實現模塊的包。 這些模塊是:
我們使用
SimpleXMLRPCServer
來創建
SimpleXMLRPCSERVER
實例,並告訴它以偵聽傳入請求。接下來,我們將某些功能定義為服務的一部分並注冊這些功能,以便服務器知道如何調用它。
創建一個
xmlrpc_server.py
文件。下面的示例中,我們使用 SimpleXMLRPCServer 實例創建服務器,並注冊一些預定義和自定義功能。最後,我們將服務器放入無限的循環接收和響應請求中。
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
with SimpleXMLRPCServer(('localhost', 9000), requestHandler=RequestHandler) as server:
server.register_introspection_functions()
# Register len() function;
server.register_function(len)
# Register a function under a different name
@server.register_function(name='rmndr')
def remainder_function(x, y):
return x // y
# Register a function under function.__name__.
@server.register_function
def modl(x, y):
return x % y
server.serve_forever()
XML-RPC 可以讓我們很容易的構造一個簡單的遠程調用服務。你所需要做的僅僅是創建一個服務器實例, 通過它的方法
register_function()
來注冊函數,然後使用方法
serve_forever()
啟動它。
一旦啟動了上述服務器,就可以通過客戶端程序來調用,該程序可以參考函數並進行函數調用。
2 運行客戶端
創建一個
xmlrpc_client.py
文件:
import xmlrpc.client
s = xmlrpc.client.ServerProxy('http://localhost:9000')
print(s.len("Yuzhou1su"))
print(s.rmndr(1024,128))
print(s.modl(7,3))
# Print list of available methods
print(s.system.listMethods())
在終端中能看到如下輸出
$ python xmlrpc_client.py
9
8
1
['len', 'modl', 'rmndr', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']
- 第一個結果:字符串 Yuzhou1su 長度為 9
- 第二個結果:1024 除以 128 的整除結果為 8
總結
XML-RPC 的缺點:
- 不支持其他數據格式的傳輸。以及 XML-RPC 會將所有的數據序列化為 XML 格式,因此就會比其他的方法要慢一些
XML-RPC 的優點:
但是,這種簡單的編碼的優勢在於許多其他的編程語言都能夠理解。使用XML-RPC 的話,客戶端程序就可以采用 Python 之外的語言來編寫,同樣可以訪問你的服務。
拋開 XML-RPC 的局限性不說,如果需要以快速但並不完善(quick and dirty)的方式實現一個遠端過程調用系統,那麼了解一下 XML-RPC 還是很值得的。很多時候簡單的方案就已經足夠好了。另外,JSON-RPC 的原理與其類似。
- xmlrpc --- XMLRPC 服務端與客戶端模塊
- xmlrpc.client — XML-RPC 客戶端類庫