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

yizhihongxing

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日

相关文章

  • C#写入XML文档

    下面就分享一下C#写入XML文档的完整攻略,包括几个方面: 引用命名空间 首先需要引用System.Xml命名空间,它包含了C#中使用XML的基本类和方法。 using System.Xml; 创建XML文档对象 在C#中,可以通过XmlDocument类创建一个XML文档对象。创建文档对象的代码如下: XmlDocument xmlDoc = new Xm…

    html 2023年5月30日
    00
  • 您的连接不是私密连接怎么解决?浏览器提示私密连接解决方法

    以下是“您的连接不是私密连接怎么解决?浏览器提示私密连接解决方法”的完整攻略: 您的连接不是私密连接怎么解决?浏览器提示私密连接解决方法 当用户在浏览网页时,有时会遇到“您的连接不是私密连接”的提示。这是因为浏览器检测到网站的安全证书存在问题,无法保证用户的连接是私密的。下面是解决这个问题的详细攻略。 您的连接不是私密连接解决方法 检查网络连接:用户需要检查…

    html 2023年5月18日
    00
  • ps怎么使用蒙版工具快速抠图?

    PS怎么使用蒙版工具快速抠图?完整攻略 Photoshop是一款功能强大的图像处理软件,以下是使用蒙版工具快速抠图的详细攻略: 步骤1:打开图像 打开Photoshop。 打开要抠图的图像。 步骤2:创建蒙版 在图层面板中,复制要抠图的图层。 选择复制的图层。 单击“添加蒙版”按钮。 在蒙版上绘制要保留的区域。 在蒙版上绘制要删除的区域。 调整蒙版,直到达到…

    html 2023年5月17日
    00
  • Mac系统新建TXT文档以及出现乱码的解决办法

    下面是详细讲解Mac系统新建TXT文档以及出现乱码的解决办法的攻略: 1. Mac系统新建TXT文档的方法 Mac系统中新建TXT文档有两种方法: 方法一:使用Finder 打开Finder; 在Finder的顶部菜单栏上选择文件 > 新建文件; 文件名后缀名为txt(例如”test.txt”),然后按下回车键; 双击文件名,即可在TextEdit中打…

    html 2023年5月31日
    00
  • phpmyadmin显示utf8_general_ci中文乱码的问题终级篇

    下面是关于解决phpmyadmin显示utf8_general_ci中文乱码的问题的完整攻略。 问题描述 在使用phpmyadmin管理MySQL数据库时,可能会出现中文数据显示乱码的情况,尤其是在使用utf8_general_ci字符集时。这主要是由于phpmyadmin对字符集的处理出现了问题。 解决方法 1. 修改php.ini配置文件 在php.in…

    html 2023年5月31日
    00
  • 使用PYTHON创建XML文档

    使用Python创建XML文档的攻略,一般可分为以下几步: 导入xml.etree.ElementTree模块 创建根节点 创建子节点并添加到根节点 给节点添加属性 给节点添加文本或子元素 将节点写入文件 下面我们通过两个示例来详细讲解如何使用Python创建XML文档。 示例一: import xml.etree.ElementTree as ET #创建…

    html 2023年5月30日
    00
  • Dom 是什么的详细说明

    DOM(Document Object Model)即文档对象模型,是指在浏览器中网页文档的表示方式。通俗的说,DOM可以把网页文档看作是由节点(node)组成的树形结构,每个节点可以包含文本、属性等信息,通过DOM可以对这些节点进行创建、访问、修改和删除等操作。 DOM模型分为三个层次: 核心DOM:为XML和HTML文档提供通用的表示和操作方式; HTM…

    html 2023年5月30日
    00
  • java是什么文件格式?.java文件怎么打开?

    java是什么文件格式?.java文件怎么打开? Java是一种编程语言,它的源代码文件通常以.java为扩展名。以下是关于如何打开.java文件的攻略,包括以下几个步骤: 步骤1:安装Java开发工具包 在打开.java文件之前,您需要安装Java开发工具包(JDK)。以下是安装JDK的步骤: 打开Java官方网站。 下载适用于您的操作系统的JDK。 双击…

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