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日

相关文章

  • springboot 中文件上传下载实例代码

    关于“springboot 中文件上传下载实例代码”,我们可以从以下几个方面进行介绍和实例演示: 一、上传文件实例代码 1.1 添加依赖 在 pom.xml 文件中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&…

    html 2023年5月31日
    00
  • PHP asXML()函数讲解

    当使用PHP操作XML文件时,asXML()函数是一个非常有用的函数。它可以将XML对象转换为XML文本格式的字符串,并返回转换后的结果。 1. asXML()函数的语法 asXML()函数的语法非常简单,其语法如下: string SimpleXMLElement::asXML( [ string $filename ] ) 该函数接受一个可选参数$fil…

    html 2023年5月30日
    00
  • 详解XMLHttpRequest(一)同步请求和异步请求

    详解XMLHttpRequest(一)同步请求和异步请求 前言 当我们在浏览器中使用AJAX技术的时候,需要用到XMLHttpRequest对象,也就是我们常说的XHR对象。XHR对象能够支持异步请求和同步请求。 接下来,我们将详细介绍XHR对象的异步和同步请求的区别。 异步请求 首先我们看一下如何使用XHR对象进行异步请求。 创建XHR对象 var xhr…

    html 2023年5月30日
    00
  • json跟xml的对比分析

    下面就为大家介绍一下“JSON跟XML的对比分析”。 什么是JSON? JSON,全称JavaScript Object Notation,是一种轻量级的数据交换格式。JSON以文本格式进行数据传输,具有易读性、易解析和易于结构化等特点。在前后端数据交互、API接口传输等方面使用广泛。 什么是XML? XML,全称Extensible Markup Lang…

    html 2023年5月30日
    00
  • python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池

    Python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池 在Python中,线程池和进程池是常用的并发编程工具。它们可以帮助我们更好地利用计算机的多核处理能力,提高程序的执行效率。下面是关于Python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池的详细讲解。 Thre…

    html 2023年5月18日
    00
  • Ajax异步加载解析

    Ajax异步加载解析攻略 在Web开发中,页面异步加载已经成为一种趋势,它不仅能够提高网站的性能,同时也可以提供更好的用户体验。其中,Ajax异步加载解析就是一种常见的技术方案,本攻略将带大家了解它的详细流程和示例说明。 前置知识 在掌握Ajax异步加载解析之前,需要掌握以下知识: HTML、CSS、JavaScript等前端基础知识 HTTP协议的相关概念…

    html 2023年5月30日
    00
  • Microsoft的XMLHTTP对象介绍

    Microsoft的XMLHTTP对象介绍 什么是XMLHTTP对象? XMLHTTP对象是指Microsoft.XMLHTTP或Microsoft.XMLHTTP.6.0。这是在Internet Explorer 5.5中引入的第一个版本。用于创建XMLHttpRequest对象,它是与服务器通信的基础。 如何创建XMLHTTP对象? 创建XMLHTTP对…

    html 2023年5月30日
    00
  • 解决Linux系统下终端setup显示乱码

    下面是详细的攻略步骤: 1. 确认终端编码 首先需要确认终端所使用的编码方式,可以使用以下命令查看: echo $LANG 该命令会输出一个类似于”en_US.UTF-8″的字符串,其中”.UTF-8″表示终端使用的编码方式为UTF-8。如果该值为其他编码方式,需要修改为UTF-8编码。 2. 修改终端编码 如果终端编码不是UTF-8,则需要修改编码方式。以…

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