protobuf官网-protocbuffer

文章介绍:

win7环境下 怎么安装protobuf-cpp-3.0.0

从官网下载protobuf :

window编译protobuf有两种方式:一个使用vs自带的msvc(环境测试vs开发者命令行工具),一种是用Cygwin 或者 MinGW。

此处使用msvc 进行编译。

使用vs开发者命令行工具,先测试cmake是否可用。

protobuf 支持惠普吗?

您好,欢迎您使用惠普产品~

这款protobuf全称是 protocolbuffer 是google 的一种数据交换的格式,这种格式适合的编译环境与是否是惠普产品没有关系的,需要按软件官网提供的创建编译环境操作,适合哪种系统及源码还需要查看软件官网了解查看,惠普官网没有这款软件信息记录的~

希望以上回复对您有所帮助

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结构,以下图所示:

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来完成表露给客户真个函数。


原文链接:https://671922.com/11866.html

相关文章

访客
访客
发布于 2022-07-07 02:35:09  回复
_init__() self.logger = LogManager.get_logger("MyRpcChannel") def CallMethod(self, me
访客
访客
发布于 2022-07-07 08:01:53  回复
Cygwin 或者 MinGW。此处使用msvc 进行编译。使用vs开发者命令行工具,先测试cmake是否可用。protobuf 支持惠普吗?您好,欢迎您使用惠普产品~

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

返回顶部