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日

相关文章

  • React JSX深入浅出理解

    React JSX是JSX语法的一种实现,跟React组件息息相关,下面我将为你介绍React JSX深入浅出的完整攻略。 什么是JSX JSX即JavaScript XML的缩写,是一种在JavaScript代码中编写HTML的类 XML 语法,结合了 HTML 结构和 JavaScript 逻辑,用于在 React 应用中描述界面的“组件树”。下面是一个…

    html 2023年5月30日
    00
  • JS提交并解析后台返回的XML的代码

    首先,我们需要了解 XML 的概念和基本结构。XML 是可扩展标记语言,是一种用于存储和传输数据的标准语言,具有自我描述性和跨平台性。 XML 的基本结构是由标签和元素组成的,它们可以嵌套形成层级结构。每个元素可以有任意多个属性和子元素。 接下来,我们介绍如何使用 JavaScript 提交并解析后台返回的 XML。要实现这个功能,我们需要使用 XMLHtt…

    html 2023年5月30日
    00
  • javascript json 新手入门文档

    当您希望通过JavaScript处理和传输数据时,JSON(JavaScript Object Notation)是一种非常流行的格式。JSON是一种轻量级的数据交换格式,易于阅读和编写,同时还易于机器解析和生成。 什么是 JSON? JSON 是一种轻量级的数据交换格式,易于阅读和编写,同时还易于机器解析和生成。JSON是基于JavaScript语法标准的…

    html 2023年5月30日
    00
  • utf-8 网页不显示+utf-8网页乱码的通用解决方法

    我们来详细讲解一下“utf-8 网页不显示+utf-8网页乱码的通用解决方法”。 一、什么是 UTF-8 网页不显示和 UTF-8 网页乱码 UTF-8 是一种编码方式,它能够支持强大的字符集,包括世界上几乎所有的语言。然而,如果编码方式不正确,就会导致网页不显示或网页乱码。 UTF-8 网页不显示指的是网页的部分或全部内容无法显示。UTF-8 网页乱码指的…

    html 2023年5月31日
    00
  • iframe标签用法详解(属性、透明、自适应高度)

    本文将详细讲解iframe标签的用法,包括其属性、如何设置透明度、如何实现自适应高度等。下面我们将逐一介绍。 1. iframe标签的基本用法 iframe(内联框架)是HTML中的一种标签,用于在网页中嵌入其他网页或文档。使用iframe可以在页面中嵌套显示其他页面的内容,实现网页的框架分割、拉取外部数据等功能。 以下是iframe标签的基本语法: &lt…

    html 2023年5月30日
    00
  • XmlUtils JS操作XML工具类

    XmlUtils JS操作XML工具类 XmlUtils JS操作XML工具类是一个JavaScript库,用于简化在Web应用程序中处理XML数据的过程。本文将详细介绍该工具类的使用方法。 安装 可以通过npm安装XmlUtils工具库: npm install xml-utils-js 也可以直接将XmlUtils.js下载下来,放在项目中的相应位置,然…

    html 2023年5月30日
    00
  • HTML表格标记教程(35):跨列属性COLSPAN

    HTML表格标记教程(35):跨列属性COLSPAN的使用方法 什么是COLSPAN属性? 在HTML表格中,如果需要将一个单元格合并成多列,可以使用COLSPAN属性来实现。COLSPAN代表column span(列跨度)。 COLSPAN属性的语法 COLSPAN属性用于指定单元格所跨越的列数,其取值为大于或等于1的整数。COLSPAN属性必须在 或 …

    html 2023年5月30日
    00
  • vscode怎么使用? vscode基础使用和设置方法

    以下是关于VSCode的使用和设置方法的详细攻略: VSCode基础使用 安装VSCode:首先,您需要下载并安装VSCode。您可以从VSCode官网下载安装包,然后按照安装向导进行安装。 打开文件夹:在VSCode中,您可以通过“文件”菜单或者快捷键“Ctrl + O”打开文件夹。在打开的文件夹中,您可以创建、编辑和保存文件。 编辑文件:在VSCode中…

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