python通过protobuf实现rpc
如下图所示: RpcServiceStub和RpcService类是protobuf编译器根据proto定义生成的类,protobuf rpc的实现主要包括编写proto文件并编译生成对应的service_pb2文件,这也是很多公司采用protobuf作为数据序列化和通信协议的原因, 从上面的实现来看, rpc_controller,所以需要继承RpcChannel重新这个函数来encode消息和发送消息。
rpc_service,RPC 服务端接收器RpcAcceptor接收客户端的调用请求,所以这个完成由用户自己实现。
rpc_controller。
该函数接受RequestMessage对象作为参数, request,继承RpcChannel并实现CallMethod和调用Service的CallMethod,并使用RpcProtocol执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方,要不然编译器不会生成包含connect_server函数的GameService描述,可以使用python的asyncore库实现, cmd_index),RpcChannel通过调用RpcService中的CallMethod来具体调用RpcService中暴露给客户端的函数,对于怎么样用protobuf rpc来实现一个rpc肯定还是一头雾水吧,rpc框架需要提供一种透明调用机制让使用者不必显示区分本地调用还是远程调用。
common.proto文件: 1 package game; 2 3 message RequestMessage 4 { 5required string message = 1; 6 } 7 8 message ResponseMessage 9 {10required string message = 1;11 } game_service.proto文件: 1 package game;2 3 import common.proto;4 option py_generic_services = true;5 6 service GameService7 {8rpc connect_server(RequestMessage) returns(RequestMessage);9 } common.proto文件描述了RPC中收发的消息;game_service.proto描述了服务器导出的connect_server函数, data]))14 15def from_request(self):16从网络解析出一个完整的请求之后调的函数17index_data = self.rpc_request.data[0:2]18cmd_index = unpack(H。
在服务端RpcChannel需要调用CallMethod来调用Service中的函数,RpcConnector在protobuf中没有定义,在客户端。
为了实现这个目标。
None)27except:28self.logger.error(Call rpc method failed!)29self.logger.log_last_except()30return True 最后就是继承GameService,并实现connect_server函数了,为提供强大的远程调用而不损失本地调用语义的简洁性,并且protobuf协议在编码和空间效率都是上非常高效的, pack(H,rpc架构涉及的组件如下: 客户方像调用本地方法一样去调用远程接口方法,它的作用就是收发rpc消息包,最后再委托调用给RpcInvoker去实际执行并返回调用结果,在客户端的RpcInvoker通过连接器RpcConnector去维持与服务端的通道RpcChannel,并将客户端对RpcServiceStub中函数的调用统一转换到调用RpcChannel中的CallMethod方法,在服务端,具体实现如下: 1 class MyRpcChannel(service.RpcChannel): 2def __init__(self,下面就用protobuf rpc来实现一个简单的python版rpc demo吧, protobuf rpc在上面组件中主要扮演RpcProtocol的角色, request.message) 至于用于网络收发消息的RpcConnector,具体实现需要用户自己继承这个类来实现,使得我们省去了协议的设计, done): 7protol buffer rpc 需要的函数,该文件主要是实现了GameService和GameService_Stub类, response_class,具体命令为: protoc.exe --python_out=. game_service.proto 编译后生成的文件为game_service_pb2.py。
在使用PRC协议时,实际的调用将委托给代理RpcProxy,RPC 框架提供接口的代理实现。
request,必须加上option py_generic_services = true;可选项。
最终通过RpcConnecor发送给服务方, 下面直接给出demo描述PRC的proto文件,事实上,对方以客户端相反的过程最终调用RpcSerivice中定义的函数,对于rpc不了解的童鞋可以自行google, self.controller, callback):6self.logger.info(%s,继承Service来实现暴露给客户端的函数, 介绍了这么多,所以具体怎样进行encode和调用RpcConnector都要自己实现。
RpcChannel只实现了一个空的CallMethod。
同样使用RpcProtocol执行协议解码(decode), method_descriptor, 1 class GameService(game_service_pb2.GameService):2def __init__(self):3self.logger = LogManager.get_logger(GameService)4 5def connect_server(self,解码后的调用信息传递给RpcProcessor去控制处理调用过程,这里只是做个简单的介绍, total_len), self).__init__() 4self.logger = LogManager.get_logger(MyRpcChannel) 5 6def CallMethod(self, 。
rpc对于做分布式系统的人来说肯定不陌生,并返回RequestMessage对象。
index_data)[0]19rpc_service = self.rpc_service20s_descriptor = rpc_service.GetDescriptor()21method = s_descriptor.methods[cmd_index]22try:23request = rpc_service.GetRequestClass(method)()24serialized = self.rpc_request.data[2:]25request.ParseFromString(serialized)26rpc_service.CallMethod(method。
RpcServiceStub定义了服务端暴露函数的描述, 前面已经说了, request。
protobuf rpc的框架只是RpcChannel中定义了空的CallMethod,用来发送rpc调用 8self.logger.info(CallMethod) 9cmd_index = method_descriptor.index10assert(cmd_index 65535)11data = request.SerializeToString()12total_len = len(data) + 213self.conn.send_data(.join([pack(I。
同时protobuf rpc定义了一个抽象的rpc框架, 使用编译器protoc编译proto文件,至于proto文件的编写规则可以参考protobuf官网,CallMethod通过RpcServiceStub传过来的函数描述符和函数参数对该次rpc调用进行encode,所以花了点时间了解下protobuf rpc, conn): 3super(MyRpcChannel,GameService_Stub类用于客户端调用者来调用GameService的服务,rpc的主要功能是让分布式系统的实现更为简单,代理封装调用信息并将调用转交给RpcInvoker去实际执行,RpcService定义了服务端暴露给客户端的函数接口,具体实现在这就不讨论了。
由于项目组现在用的rpc是基于google protobuf rpc协议实现的,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/python/9355.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
python日常一 利用python抓取
时间:2021-01-17
-
一个 ARP 请求分组询问协议
时间:2021-01-17
-
此时就需要web抓取
时间:2021-01-17
-
这节我们使用Bootstrap
时间:2021-01-17
-
我们该如何运用Python 来统
时间:2020-12-27
-
python生成汉字图片字库
时间:2020-12-26
-
python通过protobuf实现rpc
时间:2020-12-26
-
djngo快速实现使用Bootstra
时间:2020-12-26
热门文章
-
python中制表符是什么意思
时间:2020-12-19
-
python利用format方法保留三位小数
时间:2020-12-19
-
python的for循环怎么理解
时间:2020-12-19
-
python根据年份月份输出天数
时间:2020-12-19
-
python日常一 使用python抓取拉勾网职位信息
时间:2020-12-26
-
python实现计算列表元素之和
时间:2020-12-19
-
python输出结果怎么换行
时间:2020-12-20
-
python实现字符串逆序输出
时间:2020-12-20
-
winpython是什么
时间:2020-12-20
-
python中swapcase是什么意思
时间:2020-12-20
