protobuf简单介绍和ubuntu 16.04环境下安装教程

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技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • java读取解析xml文件实例

    下面我详细讲解一下“java读取解析xml文件实例”的完整攻略。 1. 了解XML 在学习Java读取解析XML文件之前,我们需要了解一些XML的基础知识。XML是一种标记语言,用于存储和传输数据。在XML文件中,数据被描述为标记和元素,这些标记和元素可以包含属性和值。XML文件的结构很像HTML,但它不是用于显示文本和图像的标记语言。 2. 导入相关的依赖…

    html 2023年5月30日
    00
  • Mybatis sql与xml文件读取方法详细分析

    “Mybatis sql与xml文件读取方法详细分析”是一个非常重要的话题,本文将从以下几个方面进行详细讲解。 Mybatis Sql与XML文件 在Mybatis框架中,Sql语句与XML文件是密切相关的。我们可以将SQL语句写在XML文件中,通过指定Mapper文件以及使用SqlSessionFactory进行读取和解析。根据Mybatis的规范,我们可…

    html 2023年5月30日
    00
  • java实现简单解析XML文件功能示例

    以下是“Java实现简单解析XML文件功能示例”的完整攻略,按照步骤依次执行即可实现: 准备工作 在开始实现之前,需要先下载并安装JDK,选择最新版本即可。在安装完成之后,还需下载XML解析器,一般选择使用dom4j,这也是本攻略的选择。 代码实现 首先,我们需要创建一个XML文件来做示例。具体内容如下: <?xml version="1.0…

    html 2023年5月30日
    00
  • CSS2快速参考

    CSS2快速参考是一份非常方便的CSS2属性手册,它包含了CSS2的所有属性及其用法,可随时作为查询工具来使用。下面是该手册的完整攻略: 1. 概述 CSS2是一种用于描述样式的标记语言。CSS2快速参考是一份方便的手册,提供CSS2属性的详细信息及用法。该手册的目的是作为CSS2开发及设计的参考工具。 2. 使用CSS2快速参考 在使用CSS2快速参考进行…

    html 2023年5月30日
    00
  • 网站怎么提高网页关键词排名的方法

    以下是“网站怎么提高网页关键词排名的方法”的完整攻略: 网站怎么提高网页关键词排名的方法 网站的关键词排名对于网站的流量和曝光度有着非常重要的影响。以下是一些提高网站关键词排名的方法,以便网站管理员更好地优化网站。 方法1:优化网站内容 网站的内容是影响关键词排名的最重要因素之一。以下是一些优化网站内容的方法: 确保网站内容与关键词相关,并且内容质量高。 使…

    html 2023年5月18日
    00
  • PHP截取汉字乱码问题解决方法mb_substr函数的应用

    下面是详细的“PHP截取汉字乱码问题解决方法mb_substr函数的应用”的攻略: 1. 问题背景 在使用PHP编写网页或者应用时,经常需要对字符串进行截取。但是对于包含中文字符的字符串,采用普通的截取方法会导致乱码的问题。这时可以使用PHP内置函数mb_substr()来解决这个问题。 2. mb_substr函数 mb_substr()函数是PHP中专门…

    html 2023年5月31日
    00
  • Linux系统部分软件中文显示乱码方框该怎么办?

    当 Linux 系统的部分软件中文显示乱码方框时,很可能是由于系统缺少中文字符集或者软件对中文字符集的支持不够。以下是针对这个问题的完整攻略: 第一步:检查系统中是否已经安装中文字符集 在命令行输入以下代码,检查系统中是否已经有需要的中文字符集: $ locale -a | grep zh_CN 如果有输出,说明已经安装了中文字符集。如果没有输出,则需要安装…

    html 2023年5月31日
    00
  • Android Studio怎么解决导入项目的中文注释乱码的问题?

    下面是针对“Android Studio怎么解决导入项目的中文注释乱码的问题”的完整攻略。 确认编码格式为UTF-8 首先要确定代码和注释的编码格式是否为UTF-8,如果不是,则会导致中文注释乱码。具体步骤如下: 打开Android Studio,选择File > Settings > Editor > File Encodings。 将全…

    html 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部