>

所生成的二进制文件在存储效率上比 XML 澳门博发

- 编辑:澳门博发娱乐官网 -

所生成的二进制文件在存储效率上比 XML 澳门博发

 

安装:

  1. gRPC 的安装:

$ pip install grpcio

  1. 安装 ProtoBuf 相关的 python 依赖库:

$ pip install protobuf

  1. 安装 python grpc 的 protobuf 编译工具:

$ pip install grpcio-tools

在配置好grpc的xxx.proto之后要保证java那边的这个文件要一样(并不是全部,service开始需要完全相同)

使用

  1. 创建 demo python 工程
![](https://upload-images.jianshu.io/upload_images/208550-efc7e919daa289de.png)

Paste_Image.png
  1. 在 example 包中编写 person.proto

    syntax = "proto3";
    package example;
    
    message person {   
        int32 id = 1;
        string name = 2;
    }
    
    message all_person {    
        repeated person Per = 1;
    }
    
  2. 进入 demo 工程的 example 目录,使用 protoc 编译 person.proto

$ protoc --python_out=. person.proto
就会生成 person_pb2.py 文件

  1. 在 python 工程中使用 protobuf 进行序列化与反序列化
    main.py:

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    from example import person_pb2
    
    # 为 all_person 填充数据
    pers = person_pb2.all_person()
    p1 = pers.Per.add()
    p1.id = 1
    p1.name = 'xieyanke'
    p2 = pers.Per.add()
    p2.id = 2
    p2.name = 'pythoner'
    
    # 对数据进行序列化
    data = pers.SerializeToString()
    
    # 对已经序列化的数据进行反序列化
    target = person_pb2.all_person()
    target.ParseFromString(data)
    print(target.Per[1].name)  #  打印第一个 person name 的值进行反序列化验证
    

  • 交流可以加 QQ 群:397234385
  • 或者 QQ 扫码入群:

澳门博发娱乐官网 1

qq群.jpg

mvn编译运行

服务端运行:

#  不需要参数
mvn exec:java -Dexec.mainClass="com.weibo.dorteam.grpc.helloServer"

# 需要参数
mvn exec:java -Dexec.mainClass="com.weibo.dorteam.grpc.helloServer" -Dexec.args="arg0 arg1 arg2"

# 传递classpath
mvn exec:java -Dexec.mainClass="com.weibo.dorteam.grpc.helloServer" -Dexec.classpathScope=runtime

客户端运行:

mvn exec:java -Dexec.mainClass="com.weibo.dorteam.grpc.helloClient"

 

gRPC 简介:

gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等),本篇只介绍 Python 的 gRPC 使用。因为 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具有良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP/2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等。

运行时只需要运行该脚本即可,django服务不必启用

安装:

  1. 安装 protoc :Protoc下载地址,可以根据自己的系统下载相应的 protoc,windows 用户统一下载 win32 版本。
  2. 配置 protoc 到系统的环境变量中,执行如下命令查看是否安装成功:

$ protoc --version
如果正常打印 libprotoc 的版本信息就表明 protoc 安装成功

  1. 安装 ProtoBuf 相关的 python 依赖库

$ pip install protobuf

遇到问题

I. pom execution报错:
感觉像是包依赖冲突的问题。。。未解

Multiple annotations found at this line:
    - Execution default of goal org.xolstice.maven.plugins:protobuf-maven-plugin:0.5.0:compile-custom failed: An API 
     incompatibility was encountered while executing org.xolstice.maven.plugins:protobuf-maven-plugin:0.5.0:compile-custom: 
     java.lang.NoSuchMethodError: org.codehaus.plexus.util.DirectoryScanner.setupMatchPatterns()V 
     ----------------------------------------------------- realm = plugin>org.xolstice.maven.plugins:protobuf-maven-plugin:
     0.5.0--726595060 strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy urls[0] = file:/Users/liuyu9/.m2/
     repository/org/xolstice/maven/plugins/protobuf-maven-plugin/0.5.0/protobuf-maven-plugin-0.5.0.jar urls[1] = file:/Users/
     liuyu9/.m2/repository/org/sonatype/sisu/sisu-inject-bean/1.4.2/sisu-inject-bean-1.4.2.jar urls[2] = file:/Users/liuyu9/.m2/
     repository/org/sonatype/sisu/sisu-guice/2.1.7/sisu-guice-2.1.7-noaop.jar urls[3] = file:/Users/liuyu9/.m2/repository/com/
     google/guava/guava/18.0/guava-18.0.jar urls[4] = file:/Users/liuyu9/.m2/repository/org/apache/maven/plugin-tools/
     maven-plugin-annotations/3.4/maven-plugin-annotations-3.4.jar urls[5] = file:/Users/liuyu9/.m2/repository/org/codehaus/
     plexus/plexus-utils/3.0.22/plexus-utils-3.0.22.jar urls[6] = file:/Users/liuyu9/.m2/repository/org/codehaus/plexus/plexus-
     component-annotations/1.6/plexus-component-annotations-1.6.jar urls[7] = file:/Users/liuyu9/.m2/repository/org/
     sonatype/aether/aether-util/1.7/aether-util-1.7.jar urls[8] = file:/Users/liuyu9/.m2/repository/org/codehaus/plexus/plexus-
     interpolation/1.14/plexus-interpolation-1.14.jar urls[9] = file:/Users/liuyu9/.m2/repository/org/sonatype/plexus/plexus-
     sec-dispatcher/1.3/plexus-sec-dispatcher-1.3.jar urls[10] = file:/Users/liuyu9/.m2/repository/org/sonatype/plexus/plexus-
     cipher/1.4/plexus-cipher-1.4.jar Number of foreign imports: 4 import: Entry[import org.sonatype.plexus.build.incremental 
     from realm ClassRealm[plexus.core, parent: null]] import: Entry[import org.codehaus.plexus.util.Scanner from realm 
     ClassRealm[plexus.core, parent: null]] import: Entry[import org.codehaus.plexus.util.AbstractScanner from realm 
     ClassRealm[plexus.core, parent: null]] import: Entry[import from realm ClassRealm[project>grpcTest:grpcTest:0.0.1-
     SNAPSHOT, parent: ClassRealm[maven.api, parent: null]]] ----------------------------------------------------- 
     (org.xolstice.maven.plugins:protobuf-maven-plugin:0.5.0:compile-custom:default:generate-sources)
    - Execution default of goal org.xolstice.maven.plugins:protobuf-maven-plugin:0.5.0:compile failed: An API 
     incompatibility was encountered while executing org.xolstice.maven.plugins:protobuf-maven-plugin:0.5.0:compile: 
     java.lang.NoSuchMethodError: org.codehaus.plexus.util.DirectoryScanner.setupMatchPatterns()V 
     ----------------------------------------------------- realm = plugin>org.xolstice.maven.plugins:protobuf-maven-plugin:
     0.5.0--726595060 strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy urls[0] = file:/Users/liuyu9/.m2/
     repository/org/xolstice/maven/plugins/protobuf-maven-plugin/0.5.0/protobuf-maven-plugin-0.5.0.jar urls[1] = file:/Users/
     liuyu9/.m2/repository/org/sonatype/sisu/sisu-inject-bean/1.4.2/sisu-inject-bean-1.4.2.jar urls[2] = file:/Users/liuyu9/.m2/
     repository/org/sonatype/sisu/sisu-guice/2.1.7/sisu-guice-2.1.7-noaop.jar urls[3] = file:/Users/liuyu9/.m2/repository/com/
     google/guava/guava/18.0/guava-18.0.jar urls[4] = file:/Users/liuyu9/.m2/repository/org/apache/maven/plugin-tools/
     maven-plugin-annotations/3.4/maven-plugin-annotations-3.4.jar urls[5] = file:/Users/liuyu9/.m2/repository/org/codehaus/
     plexus/plexus-utils/3.0.22/plexus-utils-3.0.22.jar urls[6] = file:/Users/liuyu9/.m2/repository/org/codehaus/plexus/plexus-
     component-annotations/1.6/plexus-component-annotations-1.6.jar urls[7] = file:/Users/liuyu9/.m2/repository/org/
     sonatype/aether/aether-util/1.7/aether-util-1.7.jar urls[8] = file:/Users/liuyu9/.m2/repository/org/codehaus/plexus/plexus-
     interpolation/1.14/plexus-interpolation-1.14.jar urls[9] = file:/Users/liuyu9/.m2/repository/org/sonatype/plexus/plexus-
     sec-dispatcher/1.3/plexus-sec-dispatcher-1.3.jar urls[10] = file:/Users/liuyu9/.m2/repository/org/sonatype/plexus/plexus-
     cipher/1.4/plexus-cipher-1.4.jar Number of foreign imports: 4 import: Entry[import org.sonatype.plexus.build.incremental 
     from realm ClassRealm[plexus.core, parent: null]] import: Entry[import org.codehaus.plexus.util.Scanner from realm 
     ClassRealm[plexus.core, parent: null]] import: Entry[import org.codehaus.plexus.util.AbstractScanner from realm 
     ClassRealm[plexus.core, parent: null]] import: Entry[import from realm ClassRealm[project>grpcTest:grpcTest:0.0.1-
     SNAPSHOT, parent: ClassRealm[maven.api, parent: null]]] ----------------------------------------------------- 
     (org.xolstice.maven.plugins:protobuf-maven-plugin:0.5.0:compile:default:generate-sources)

原因:M2E的bug eclipse版本过低


更新eclipse为最新版,删除所有.project文件夹,重新更新project

II. 编译protoc-gen-grpc-java插件时报错:

fatal error: ‘google/protobuf/io/zero_copy_stream.h’ file not found

原因:找不到头文件,因为macos系统没有将/usr/local作为搜索头文件和库的默认路径
解决:export CXXFLAGS=”-I/usr/local/include” LDFLAGS=”-L/usr/local/lib”

III. 生成的grpc通讯代码GreeterGrpc编译报错

报错内容:

Multiple markers at this line
    - Method breakpoint:GreeterGrpc$GreeterImplBase [entry] - bindService()
    - The method bindService() of type GreeterGrpc.GreeterImplBase must override a superclass 
     method
    - implements io.grpc.BindableService.bindService

Multiple markers at this line
    - The method invoke(Req, StreamObserver<Resp>) of type GreeterGrpc.MethodHandlers<Req,Resp> 
     must override a superclass method
    - implements io.grpc.stub.ServerCalls.UnaryRequestMethod<Req,Resp>.invoke

Multiple markers at this line
    - implements io.grpc.stub.ServerCalls.StreamingRequestMethod<Req,Resp>.invoke
    - The method invoke(StreamObserver<Resp>) of type GreeterGrpc.MethodHandlers<Req,Resp> must 
     override a superclass method

原因:同问题I,由于M2E插件版本过低有bug
解决办法:更新M2E,或者更新eclipse为最新版

pip install grpcio

实践:

下面我们使用 gRPC 定义一个接口,该接口实现对传入的数据进行大写的格式化处理。

  • 创建项目 python demo 工程:
![](https://upload-images.jianshu.io/upload_images/208550-bd34d08e0c12cdeb.png)

Paste_Image.png
  1. client目录下的 main.py 实现了客户端用于发送数据并打印接收到 server 端处理后的数据
  1. server 目录下的 main.py 实现了 server 端用于接收客户端发送的数据,并对数据进行大写处理后返回给客户端
  2. example 包用于编写 proto 文件并生成 data 接口
  • 定义 gRPC 接口:
syntax = "proto3";
package example;
service FormatData {
  rpc DoFormat(Data) returns (Data){}
}
message Data {
  string text = 1;
}
  • 编译 protobuf:

$ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./data.proto #在 example 目录中执行编译,会生成:data_pb2.py 与 data_pb2_grpc.py

  • 实现 server 端:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
import time
from concurrent import futures
from example import data_pb2, data_pb2_grpc

_ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = 'localhost'
_PORT = '8080'

class FormatData(data_pb2_grpc.FormatDataServicer):
    def DoFormat(self, request, context):
        str = request.text
        return data_pb2.Data(text=str.upper())

def serve():
    grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
    data_pb2_grpc.add_FormatDataServicer_to_server(FormatData(), grpcServer)
    grpcServer.add_insecure_port(_HOST + ':' + _PORT)
    grpcServer.start()
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        grpcServer.stop(0)

if __name__ == '__main__':
    serve()
  • 实现 client 端:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
from example import data_pb2, data_pb2_grpc

_HOST = 'localhost'
_PORT = '8080'

def run():
    conn = grpc.insecure_channel(_HOST + ':' + _PORT)
    client = data_pb2_grpc.FormatDataStub(channel=conn)
    response = client.DoFormat(data_pb2.Data(text='hello,world!'))
    print("received: " + response.text)

if __name__ == '__main__':
    run()
  • 执行验证结果:
  1. 先启动 server,之后再执行 client
  1. client 侧控制台如果打印的结果为:“received: HELLO,WORLD!” ,证明 gRPC 接口定义成功

  • 交流可以加 QQ 群:397234385
  • 或者 QQ 扫码入群:

澳门博发娱乐官网 2

qq群.jpg

我既想用django的model又想用grpc该怎么办呢,django是一个服务,grpc是一个服务,直接暴力把grpc代码加入django是没办法使用models和views的。

ProtoBuf: 是一套完整的 IDL(接口描述语言),出自Google,基于 C++ 进行的实现,开发人员可以根据 ProtoBuf 的语言规范生成多种编程语言(Golang、Python、Java 等)的接口代码,本篇只讲述 Python 的基础操作。据说 ProtoBuf 所生成的二进制文件在存储效率上比 XML 高 3~10 倍,并且处理性能高 1~2 个数量级,这也是选择 ProtoBuf 作为序列化方案的一个重要因素之一。

环境准备

  1. 下载protobuf
  2. 新建maven项目

 

  • grpcio==1.4.0
  • grpcio-tools==1.4.0
  • xxx.proto 没错,只需要这么一个文件
  • 编译xxx.proto的命令

使用protoc命令行生成类文件

 

这里解释一下,python(不解释) -m(也不解释) grpc_tools.protoc(上面安装的三方)
-I./protos(标识当前目录下的protos文件夹,xxx.proto需要在这个文件夹中) --python_out=.(当前目录生成输出文件) --grpc_python_out=.(当前目录生成grpc文件) ./protos/xxx.proto(xxx.proto的相对路径)

编辑客户端文件

同上

pip install protobuf

运行命令后会生成xxx_pb2.py 和 xxx_pb2_grpc.py两个文件,接下来重点来了(拍桌子)

编辑服务端文件

同上

protobuf内容示例:

初步尝试是在python脚本中与java对接接口,经常官方文档的一顿学习,成功调通了接口

安装protocbuf

安装步骤略

会生成:data_pb2.py 与 data_pb2_grpc.py

python -m grpc_tools.protoc -I./protos --python_out=. --grpc_python_out=. ./protos/xxx.proto

参考文献:


本文由胜博发-编程发布,转载请注明来源:所生成的二进制文件在存储效率上比 XML 澳门博发