Protobuf简单介绍和Ubuntu 16.04环境下安装教程
Protobuf简介
Protocol Buffers (简称protobufs) 是 Google 开发的语言无关、平台无关、可扩展的序列化数据格式,常用于数据存储和通讯协议等场景。相比xml json等常见数据格式,他更加简单,更加高效。protobufs的作用是将数据从某个语言中的对象编码/解码到一个字节串中,或者反之。
protobufs的原理是基于描述文件来生成相关编解码代码,描述文件是一个类似IDL的东西,有自己的语法。可以快速描述数据结构,可以根据这些描述文件生成各种语言的代码。
Ubuntu 16.04上安装protobufs
首先,我们需要用apt-get命令安装protoc编译器:
sudo apt-get install protobuf-compiler
安装完成后,可以使用以下命令检查是否安装成功:
protoc --version
如果显示版本号,表示安装成功。
此时,我们可以创建一个简单的数据结构描述文件,比如.proto
后缀的文件:
syntax = "proto3";
message Person {
string name = 1;
int32 id = 2;
string email = 3;
}
接着,我们可以通过以下命令将这个文件编译为Python的模块:
protoc --python_out=. person.proto
这会在当前目录下生成person_pb2.py文件,内容如下:
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: person.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='person.proto',
package='',
...
此时,我们就可以使用这个模块来进行数据的编解码了:
import person_pb2
person = person_pb2.Person()
person.name = "John Doe"
person.id = 1234
person.email = "johndoe@example.com"
# 序列化
serialized_person = person.SerializeToString()
# 反序列化
deserialized_person = person_pb2.Person()
deserialized_person.ParseFromString(serialized_person)
assert person == deserialized_person
示例1: protobufs结合gRPC的使用
在实际项目中protobufs通常是与gRPC一起使用的,gRPC是谷歌开发的跨语言的高性能RPC系统。这里是一个简单的gRPC示例:
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
def run():
with grpc.insecure_channel('localhost:50051') as channel:
stub = helloworld_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
print("Greeter client received: " + response.message)
if __name__ == '__main__':
run()
import time
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
class Greeter(helloworld_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port('[::]:50051')
server.start()
try:
while True:
time.sleep(86400)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()
上面两段代码分别是gRPC的客户端和服务器端代码,通过protobufs的服务定义文件(hello_world.proto)来进行服务定义。
示例2: grpc-gateway的使用
除了使用gRPC之外,protobufs还可以与其他技术一起使用,比如grpc-gateway,它是一种使用反向代理方式将RESTful API转化为gRPC API的工具。
syntax = "proto3";
message EchoRequest {
string message = 1;
}
message EchoResponse {
string message = 1;
}
service EchoService {
rpc Echo(EchoRequest) returns (EchoResponse) {}
}
import grpc
import echoservice_pb2
import echoservice_pb2_grpc
def run():
with grpc.insecure_channel('localhost:8080') as channel:
stub = echoservice_pb2_grpc.EchoServiceStub(channel)
echo_request = echoservice_pb2.EchoRequest(message='hello')
response = stub.Echo(echo_request)
print(response.message)
if __name__ == '__main__':
run()
from concurrent import futures
import grpc
import echoservice_pb2
import echoservice_pb2_grpc
class EchoService(echoservice_pb2_grpc.EchoServiceServicer):
def Echo(self, request, context):
return echoservice_pb2.EchoResponse(message=request.message)
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
echoservice_pb2_grpc.add_EchoServiceServicer_to_server(EchoService(), server)
server.add_insecure_port('[::]:8080')
server.start()
try:
while True:
pass
except KeyboardInterrupt:
server.stop(0)
在这个示例中,我们使用echoservice.proto文件定义了一个EchoService服务,里面有一个Echo方法。我们将其处理方式写在了server.py中,然后启动服务器。客户端通过grpc-gateway转码器来向服务器发出RESTful API请求。
注意,我们需要先安装grpc-gateway:
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
然后,使用以下命令生成代码:
protoc --grpc-gateway_out=logtostderr=true:. echoservice.proto
以上就是protobufs的简单介绍和Ubuntu 16.04上的安装教程,同时也有两个示例:grpc服务和grpc-gateway的使用。更多的用法可以查看官方文档以及各种语言的相关实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:protobuf简单介绍和ubuntu 16.04环境下安装教程 - Python技术站