溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何實現(xiàn)一個XML-RPC server/client

發(fā)布時間:2022-01-15 10:06:56 來源:億速云 閱讀:293 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“如何實現(xiàn)一個XML-RPC server/client”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

從大數(shù)據(jù)部署系統(tǒng) Minos說起

Minos是小米2013年開源的針對海量服務(wù)節(jié)點無法高效操作及統(tǒng)一配置管理的痛點,全新探索并研發(fā)的一套大型分布式部署及監(jiān)控的系統(tǒng)。該系統(tǒng)基于supervisor XML-RPC實現(xiàn)分布式計算,支持跨地域、多節(jié)點部署服務(wù)。

如何實現(xiàn)一個XML-RPC server/client

上圖為Minos架構(gòu)圖,客戶端對task節(jié)點的操作通過supervisor的XML-RPC完成。接下來我們談?wù)勈裁词荴ML-RPC,它是如何工作的。

2  什么是XML-RPC?

XML-RPC是一個遠(yuǎn)程過程調(diào)用(遠(yuǎn)端程序呼叫)(remote procedure call,RPC)的分布式計算協(xié)議,通過XML將調(diào)用函數(shù)封裝,并使用HTTP協(xié)議作為傳送機(jī)制。

[1]可以用Perl, Java, Python, C, C++, PHP和許多編程語言實現(xiàn)。實現(xiàn)適用于Unix,Windows和Macintosh。

XML-RPC是受兩個早期協(xié)議的啟發(fā)。一個是由Dave Winer設(shè)計的匿名RPC協(xié)議。(這就是為什么XML-RPC服務(wù)器通常安裝在/RPC2下。)另一個更重要的是SOAP協(xié)議的初稿。Dave Winer提供了豐富的XML-RPC歷史淵源,對XML-RPC和SOAP之間的關(guān)系感興趣的可自行查閱資料。

3   XML-RPC如何工作的?

一個簡單的示例。

服務(wù)端代碼示例:(Python2.7 運行環(huán)境)

#-*- coding:utf-8 -*-
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
# 指定路徑
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# 構(gòu)建server
server = SimpleXMLRPCServer(("localhost", 8000),
                            requestHandler=RequestHandler)
server.register_introspection_functions()
# 注冊pow函數(shù)
# pow.__name__為 pow函數(shù)的名稱
server.register_function(pow)
# 注冊自定義函數(shù)
def adder_function(x,y):
    return x + y
server.register_function(adder_function, 'add')
# 注冊實例;
# 實例的方法均發(fā)布為 XML-RPC的方法
class MyFuncs:
    def div(self, x, y):
        return x // y
server.register_instance(MyFuncs())
# 啟動server
server.serve_forever()


接下來客戶端將調(diào)用服務(wù)端的方法:

#-*- coding:utf-8 -*-import xmlrpclib
s = xmlrpclib.ServerProxy('http://localhost:8000')
print s.pow(2,3)  # Returns 2**3 = 8print s.add(2,3)  # Returns 5print s.div(5,2)  # Returns 5//2 = 2# 打印服務(wù)端所有方法
print s.system.listMethods()


由此在部署系統(tǒng)中,構(gòu)建supervisor XML-RPC的服務(wù)端,封裝對節(jié)點操作的方法,由客戶端遠(yuǎn)程調(diào)用此方法,實現(xiàn)分布式部署。

不過,SimpleXMLRPCServer是一個單線程的服務(wù)器。這意味著,服務(wù)端同時收到多個客戶端發(fā)送的多個請求,必須等待第一個請求完成以后才能繼續(xù)。有個最直接的方法可以解決這個問題:

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SocketServer import ThreadingMixIn

# 新增構(gòu)建ThreadXMLRPCServer類
class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
    pass

# 重新構(gòu)建server
server = ThreadXMLRPCServer(("localhost", 8000), requestHandler=RequestHandler,allow_none=True)
#Forking and threading versions of each type of server can be created using the ForkingMixIn and ThreadingMixIn mix-in classes. For instance, a threading UDP server class is created as follows:[2]
class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass


閱讀ThreadingMixIn的源碼發(fā)現(xiàn),ThreadingMixIn重寫了server類中調(diào)用的process_request方法。因此實現(xiàn)了server端多線程處理。

4   鏈?zhǔn)绞褂肵ML-RPC時遇到的問題及解決方法


在我們實際應(yīng)用中,當(dāng)我們構(gòu)建多個XML-RPC server的client,進(jìn)行鏈?zhǔn)秸{(diào)用時,經(jīng)常遇到httplib.CannotSendRequest的報警。

調(diào)用過程:

client -- calls -- SimpleXMLRPCServer’s functions -- calls --SimpleXMLRPCServer's functions -- do finish task

記過排查CannotSendRequest發(fā)生在當(dāng)一個httplib.HTTPConnection被又一次新的“request”操作中斷。 所以,每個httplib.HTTPConnection.request必須以.getresponse()調(diào)用配對。 如果該配對被另一個請求操作中斷,第二請求將產(chǎn)生CannotSendRequest錯誤。 所以,類似如下請求,將會產(chǎn)生錯誤:

connection = httplib.HTTPConnection(...)
connection.request(...)
connection.request(...)


問題分析:

兩次調(diào)用都是serverproxy來構(gòu)建的。只有在同時多次請求的時候出現(xiàn)了這個問題,應(yīng)該是存在資源競爭條件。serverproxy在中間層被共享。

解決思路:

是讓每個線程創(chuàng)建自己的serverproxy。

解決方案:

在調(diào)用第一個SimpleXMLRPCServer的方法時構(gòu)建下一次調(diào)用的鏈接。確保每個線程維護(hù)自己的serverproxy。

“如何實現(xiàn)一個XML-RPC server/client”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI