<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        python如何通過protobuf實現(xiàn)rpc

        來源:懂視網 責編:小采 時間:2020-11-27 14:35:39
        文檔

        python如何通過protobuf實現(xiàn)rpc

        python如何通過protobuf實現(xiàn)rpc:由于項目組現(xiàn)在用的rpc是基于google protobuf rpc協(xié)議實現(xiàn)的,所以花了點時間了解下protobuf rpc。rpc對于做分布式系統(tǒng)的人來說肯定不陌生,對于rpc不了解的童鞋可以自行google,這里只是做個簡單的介紹。rpc的主要功能是讓分布式系統(tǒng)的實現(xiàn)更為簡單,為提供
        推薦度:
        導讀python如何通過protobuf實現(xiàn)rpc:由于項目組現(xiàn)在用的rpc是基于google protobuf rpc協(xié)議實現(xiàn)的,所以花了點時間了解下protobuf rpc。rpc對于做分布式系統(tǒng)的人來說肯定不陌生,對于rpc不了解的童鞋可以自行google,這里只是做個簡單的介紹。rpc的主要功能是讓分布式系統(tǒng)的實現(xiàn)更為簡單,為提供
        由于項目組現(xiàn)在用的rpc是基于google protobuf rpc協(xié)議實現(xiàn)的,所以花了點時間了解下protobuf rpc。rpc對于做分布式系統(tǒng)的人來說肯定不陌生,對于rpc不了解的童鞋可以自行google,這里只是做個簡單的介紹。rpc的主要功能是讓分布式系統(tǒng)的實現(xiàn)更為簡單,為提供強大的遠程調用而不損失本地調用語義的簡潔性。為了實現(xiàn)這個目標,rpc框架需要提供一種透明調用機制讓使用者不必顯示區(qū)分本地調用還是遠程調用。rpc架構涉及的組件如下:

        客戶方像調用本地方法一樣去調用遠程接口方法,RPC 框架提供接口的代理實現(xiàn),實際的調用將委托給代理RpcProxy 。代理封裝調用信息并將調用轉交給RpcInvoker 去實際執(zhí)行。在客戶端的RpcInvoker 通過連接器RpcConnector 去維持與服務端的通道RpcChannel,并使用RpcProtocol 執(zhí)行協(xié)議編碼(encode)并將編碼后的請求消息通過通道發(fā)送給服務方。RPC 服務端接收器 RpcAcceptor 接收客戶端的調用請求,同樣使用RpcProtocol 執(zhí)行協(xié)議解碼(decode)。解碼后的調用信息傳遞給RpcProcessor 去控制處理調用過程,最后再委托調用給RpcInvoker 去實際執(zhí)行并返回調用結果。

        protobuf rpc在上面組件中主要扮演RpcProtocol的角色,使得我們省去了協(xié)議的設計,并且protobuf協(xié)議在編碼和空間效率都是上非常高效的,這也是很多公司采用protobuf作為數(shù)據(jù)序列化和通信協(xié)議的原因。同時protobuf rpc定義了一個抽象的rpc框架,如下圖所示:

        RpcServiceStub和RpcService類是protobuf編譯器根據(jù)proto定義生成的類,RpcService定義了服務端暴露給客戶端的函數(shù)接口,具體實現(xiàn)需要用戶自己繼承這個類來實現(xiàn)。RpcServiceStub定義了服務端暴露函數(shù)的描述,并將客戶端對RpcServiceStub中函數(shù)的調用統(tǒng)一轉換到調用RpcChannel中的CallMethod方法,CallMethod通過RpcServiceStub傳過來的函數(shù)描述符和函數(shù)參數(shù)對該次rpc調用進行encode,最終通過RpcConnecor發(fā)送給服務方。對方以客戶端相反的過程最終調用RpcSerivice中定義的函數(shù)。事實上,protobuf rpc的框架只是RpcChannel中定義了空的CallMethod,所以具體怎樣進行encode和調用RpcConnector都要自己實現(xiàn)。RpcConnector在protobuf中沒有定義,所以這個完成由用戶自己實現(xiàn),它的作用就是收發(fā)rpc消息包。在服務端,RpcChannel通過調用RpcService中的CallMethod來具體調用RpcService中暴露給客戶端的函數(shù)。

        介紹了這么多,對于怎么樣用protobuf rpc來實現(xiàn)一個rpc肯定還是一頭霧水吧,下面就用protobuf rpc來實現(xiàn)一個簡單的python版rpc demo吧。

        下面直接給出demo描述PRC的proto文件,至于proto文件的編寫規(guī)則可以參考protobuf官網。

        common.proto文件:

        package game;
        
        message RequestMessage
        {
         required string message = 1;
        }
        
        message ResponseMessage
        {
         required string message = 1;
        }
        

        game_service.proto文件:

        package game;
        
        import "common.proto";
        option py_generic_services = true;
        
        service GameService
        {
         rpc connect_server(RequestMessage) returns(RequestMessage);
        }
        

        common.proto文件描述了RPC中收發(fā)的消息;game_service.proto描述了服務器導出的connect_server函數(shù),該函數(shù)接受RequestMessage對象作為參數(shù),并返回RequestMessage對象。在使用PRC協(xié)議時,必須加上option py_generic_services = true;可選項,要不然編譯器不會生成包含connect_server函數(shù)的GameService描述。

        使用編譯器protoc編譯proto文件,具體命令為:
        protoc.exe --python_out=. game_service.proto
        編譯后生成的文件為game_service_pb2.py,該文件主要是實現(xiàn)了GameService和GameService_Stub類。GameService_Stub類用于客戶端調用者來調用GameService的服務。
        前面已經說了,在客戶端,RpcChannel只實現(xiàn)了一個空的CallMethod,所以需要繼承RpcChannel重新這個函數(shù)來encode消息和發(fā)送消息。在服務端RpcChannel需要調用CallMethod來調用Service中的函數(shù)。具體實現(xiàn)如下:

        class MyRpcChannel(service.RpcChannel):
         def __init__(self, rpc_service, conn):
         super(MyRpcChannel, self).__init__()
         self.logger = LogManager.get_logger("MyRpcChannel")
        
         def CallMethod(self, method_descriptor, rpc_controller, request, response_class, done):
         """"protol buffer rpc 需要的函數(shù),用來發(fā)送rpc調用"""
         self.logger.info('CallMethod')
         cmd_index = method_descriptor.index
         assert(cmd_index < 65535)
         data = request.SerializeToString()
         total_len = len(data) + 2
         self.conn.send_data(''.join([pack('

        最后就是繼承GameService,并實現(xiàn)connect_server函數(shù)了。

        class GameService(game_service_pb2.GameService):
         def __init__(self):
         self.logger = LogManager.get_logger("GameService")
        
         def connect_server(self, rpc_controller, request, callback):
         self.logger.info('%s', request.message)
        

        至于用于網絡收發(fā)消息的RpcConnector,可以使用python的asyncore庫實現(xiàn),具體實現(xiàn)在這就不討論了。

        從上面的實現(xiàn)來看,protobuf rpc的實現(xiàn)主要包括編寫proto文件并編譯生成對應的service_pb2文件,繼承RpcChannel并實現(xiàn)CallMethod和調用Service的CallMethod,繼承Service來實現(xiàn)暴露給客戶端的函數(shù)。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        python如何通過protobuf實現(xiàn)rpc

        python如何通過protobuf實現(xiàn)rpc:由于項目組現(xiàn)在用的rpc是基于google protobuf rpc協(xié)議實現(xiàn)的,所以花了點時間了解下protobuf rpc。rpc對于做分布式系統(tǒng)的人來說肯定不陌生,對于rpc不了解的童鞋可以自行google,這里只是做個簡單的介紹。rpc的主要功能是讓分布式系統(tǒng)的實現(xiàn)更為簡單,為提供
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 色噜噜亚洲男人的天堂| 少妇中文字幕乱码亚洲影视| 亚洲一区免费在线观看| 久久大香香蕉国产免费网站 | 亚洲国产精品免费观看| 91大神免费观看| **毛片免费观看久久精品| 青青青免费国产在线视频小草| 亚洲中文字幕无码不卡电影 | 亚洲国产成人精品无码区二本 | 亚洲特级aaaaaa毛片| 精品亚洲AV无码一区二区三区| 最新亚洲卡一卡二卡三新区| 国产精品亚洲综合网站| 五月天国产成人AV免费观看| 久久精品国产免费| 欧洲黑大粗无码免费| 亚洲国产成人精品女人久久久 | 亚洲精品自产拍在线观看| 亚洲一区二区三区首页| 毛片在线播放免费观看| 亚洲成a人片77777老司机| 亚洲中文字幕精品久久| a级毛片毛片免费观看永久| 99爱在线精品免费观看| 亚洲中文字幕无码一久久区| 国产人成网在线播放VA免费| 99re热免费精品视频观看| 久久久久亚洲AV无码专区网站 | 久久久WWW免费人成精品| 激情97综合亚洲色婷婷五| 久久精品成人免费看| 亚洲免费观看网站| 色www永久免费| 亚洲第一福利网站| 波多野结衣免费在线| 最新亚洲人成无码网www电影| 在线人成精品免费视频| 亚洲成a人片在线不卡| 免费看国产曰批40分钟| 亚洲男人天堂2017|