文章介绍:
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来完成表露给客户真个函数。
发布于 2022-07-07 02:35:09 回复
发布于 2022-07-07 08:01:53 回复