国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

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

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

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

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

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

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

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

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描述了服務(wù)器導(dǎo)出的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類用于客戶端調(diào)用者來調(diào)用GameService的服務(wù)。
前面已經(jīng)說了,在客戶端,RpcChannel只實現(xiàn)了一個空的CallMethod,所以需要繼承RpcChannel重新這個函數(shù)來encode消息和發(fā)送消息。在服務(wù)端RpcChannel需要調(diào)用CallMethod來調(diào)用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調(diào)用"""
 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)

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

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

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(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不了解的童鞋可以自行g(shù)oogle,這里只是做個簡單的介紹。rpc的主要功能是讓分布式系統(tǒng)的實現(xiàn)更為簡單,為提供
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产精品福利一区二区久久 | 日韩 欧美 中文 | 91精品国产9l久久久久 | 九九久久亚洲综合久久久 | 国内在线观看精品免费视频 | 毛片视频网址 | 国产91免费视频 | 亚洲欧美韩国 | 欧日韩一区二区三区 | 国内精品免费 | 国产高清美女一级a毛片久久 | 日韩精品亚洲电影天堂 | 99久久精品国产一区二区小说 | 国产精品ⅴ视频免费观看 | 国产九九精品 | 久久国产精品一区二区三区 | 美女一级a毛片免费观看 | 欧美在线视频免费观看 | 国产免费一区二区三区 | 国产91精品黄网在线观看 | 视频一区 中文字幕 | 日韩 亚洲 制服 欧美 综合 | 国产亚洲精品一品区99热 | 国产日韩欧美中文 | 在线v片 | 欧美视频二区 | 国产成人久久一区二区三区 | 欧美第1页 | 亚洲国产成人精品一区91 | 福利视频一区二区 | 中文字幕va一区二区三区 | 国内精品线在线观看 | 亚洲欧美日韩精品专区卡通 | 日韩视频一区二区在线观看 | 国产成人精品免费大全 | 国产亚洲欧美一区二区三区 | 91久久九九精品国产综合 | 亚洲精品成人 | 欧美综合国产精品日韩一 | 日本福利片国产午夜久久 | 日韩综合网|