亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python如何通過protobuf實現rpc

2020-01-04 17:39:19
字體:
來源:轉載
供稿:網友
這篇文章主要為大家詳細介紹了python通過protobuf實現rpc的方法,感興趣的朋友可以參考一下
 

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

python如何通過protobuf實現rpc

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

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

python如何通過protobuf實現rpc

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

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

下面直接給出demo描述PRC的proto文件,至于proto文件的編寫規則可以參考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中收發的消息;game_service.proto描述了服務器導出的connect_server函數,該函數接受RequestMessage對象作為參數,并返回RequestMessage對象。在使用PRC協議時,必須加上option py_generic_services  = true;可選項,要不然編譯器不會生成包含connect_server函數的GameService描述。

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

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 需要的函數,用來發送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('<I', total_len), pack('<H', cmd_index), data]))  def from_request(self):    """"從網絡解析出一個完整的請求之后調的函數"""    index_data = self.rpc_request.data[0:2]        cmd_index = unpack('<H', index_data)[0]      rpc_service = self.rpc_service    s_descriptor = rpc_service.GetDescriptor()    method = s_descriptor.methods[cmd_index]      try:      request = rpc_service.GetRequestClass(method)()      serialized = self.rpc_request.data[2:]          request.ParseFromString(serialized)        rpc_service.CallMethod(method, self.controller, request, None)    except:      self.logger.error("Call rpc method failed!")      self.logger.log_last_except()    return True

最后就是繼承GameService,并實現connect_server函數了。

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)

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美丰满老妇厨房牲生活| 欧美日韩国产一区二区三区| 中文字幕亚洲激情| 日韩中文字幕国产| 国产精品va在线播放我和闺蜜| 韩剧1988在线观看免费完整版| 91精品国产91久久久久久| 亚洲国产精品成人av| 亚洲少妇中文在线| 中文字幕国内精品| 欧美精品videos| 日本高清+成人网在线观看| 高潮白浆女日韩av免费看| 欧洲美女免费图片一区| 欧美影院久久久| 亚洲缚视频在线观看| 久久久久久久网站| 亚洲精品国产精品国产自| 亚洲第五色综合网| 欧美成人午夜激情在线| 国产精品久久久久久久久久久久久久| 日韩精品中文字幕有码专区| 成人激情视频小说免费下载| 91极品女神在线| 中文字幕九色91在线| 亚洲欧美国产制服动漫| 国产精品99久久99久久久二8| 亚洲男人的天堂网站| 91豆花精品一区| 伊人伊成久久人综合网小说| 国产亚洲免费的视频看| 日韩成人av一区| 国产精品亚洲аv天堂网| 日产日韩在线亚洲欧美| 日韩福利视频在线观看| 欧美日韩在线视频观看| 亚洲欧美中文在线视频| 中文字幕欧美在线| 中文字幕亚洲综合久久筱田步美| 在线免费看av不卡| 欧美疯狂做受xxxx高潮| 九色精品免费永久在线| 91精品久久久久久久久久| 亚洲福利视频网| 久久久av亚洲男天堂| 国产精品午夜一区二区欲梦| 国产精品人成电影在线观看| 国产成人综合精品| 精品福利樱桃av导航| 奇米四色中文综合久久| 亚洲第一区在线| 77777少妇光屁股久久一区| 亚洲www视频| 久久久久久久久爱| 久久亚洲欧美日韩精品专区| 欧美日韩在线视频一区| 色综合久久久888| 亚洲一区二区三区久久| 国产综合香蕉五月婷在线| 亚洲天堂av综合网| 欧美日韩亚洲国产一区| 在线观看亚洲视频| 久久久国产在线视频| 日韩亚洲国产中文字幕| 久久在精品线影院精品国产| 日本国产精品视频| 中文字幕av日韩| 欧美精品久久久久久久久久| 亚洲激情 国产| 欧美极品美女电影一区| 欧美一区二区三区精品电影| 欧美日韩午夜剧场| 成人国内精品久久久久一区| 欧美精品videosex极品1| 国产日本欧美在线观看| 日本午夜人人精品| 亚洲永久在线观看| 中文字幕不卡在线视频极品| **欧美日韩vr在线| 亚洲国产精品推荐| 日韩电影中文 亚洲精品乱码| 亚洲一级黄色片| 亚洲福利视频二区| 91视频88av| 亚洲福利视频在线| 欧美日本在线视频中文字字幕| 欧美极品少妇全裸体| 韩日精品中文字幕| 久久精品国产一区二区三区| 性亚洲最疯狂xxxx高清| 欧美成aaa人片在线观看蜜臀| 日韩av最新在线| 精品国偷自产在线视频99| 亚洲成色999久久网站| 国产精品久久久久久久app| 亚洲第一区中文字幕| 亚洲丁香婷深爱综合| 日韩欧美在线第一页| 久久久免费av| 日韩有码在线观看| 国产精品久久国产精品99gif| 2019中文字幕免费视频| 日韩欧美第一页| 亚洲天堂av综合网| 久久久国产一区二区三区| 最近2019中文字幕一页二页| 精品久久香蕉国产线看观看亚洲| 国产精品人成电影| 亚洲美女精品久久| 国产精品三级美女白浆呻吟| 91超碰caoporn97人人| 日韩精品在线免费播放| 欧美在线激情网| 91精品中国老女人| 欧美第一页在线| 国产在线视频欧美| 亚洲精品99久久久久中文字幕| 亚洲天堂网在线观看| 91po在线观看91精品国产性色| 国产丝袜一区二区| 国产一区二区动漫| 精品久久久香蕉免费精品视频| 亚洲欧洲午夜一线一品| 久久久日本电影| 亚洲风情亚aⅴ在线发布| 中文字幕无线精品亚洲乱码一区| 欧美日韩精品在线播放| 久久99热精品这里久久精品| 亚洲va久久久噜噜噜久久天堂| 日韩欧美亚洲国产一区| 尤物yw午夜国产精品视频| 亚洲人成毛片在线播放| 日韩av电影院| 国产91露脸中文字幕在线| 欧美精品精品精品精品免费| 在线日韩精品视频| 亚洲欧美一区二区三区四区| 久久99精品国产99久久6尤物| 亚洲欧美另类自拍| 欧美日韩国产精品一区二区三区四区| 亚洲成人黄色网址| 欧美情侣性视频| 日韩的一区二区| 国产精品国产亚洲伊人久久| 国产精品第一区| 亚洲а∨天堂久久精品9966| 日韩精品中文字幕在线观看| 日韩黄色在线免费观看| 国产成人av网| 久久久久久久激情视频| 日韩精品电影网| 95av在线视频| 久久精品视频中文字幕| 日韩一区二区三区xxxx| 国产综合久久久久| 亚洲香蕉成人av网站在线观看| 一本大道亚洲视频| 国产脚交av在线一区二区| 亚洲在线免费视频| 都市激情亚洲色图| 久久久噜噜噜久久中文字免| 亚洲一区二区福利| 欧美色图在线视频| 97在线免费观看视频|