【Python 上手 GRPC】(一)初体验

【Python 上手 GRPC】(一)初体验,第1张

概述1什么是grpcgrpc是一个高性能、通用的开源RPC框架,Google主要面向移动应用开发基于HTTP/2协议标准而设计的,基于ProtoBuf(ProtoclBuffers)序列化协议开发。grpc提供一种简单的方法来精确地定义服务和ios、Android和后台支持服务自动生成可靠性很强的客户端功能库。2什 1 什么是 grpcgrpc 是一个高性能、通用的开源RPC框架,Google主要面向移动应用开发基于http/2协议标准而设计的,基于ProtoBuf(Protocl Buffers)序列化协议开发。grpc 提供一种简单的方法来精确地定义服务和ios、AndroID 和后台支持服务自动生成可靠性很强的客户端功能库。2 什么是 protobuf

protobuf 是一个具有高效的协议数据交换格式工具库(类似Json),但是和Json相比,Protobuf有更高的转化效率,时间效率和空间效率都 Json 的3-5倍

具有跨语言性: pythongojavac++

常用数据类型

类型说明
string要求 utf-87-bitASCII编码的字符串
bytes/
bool/
int32/
int64/(对于python,进入之后都是int64)
float/
repeated数组(列表), repeated string data =1; (定义个元素都是 string 的数组)
map字典(Python), map <string, string> data = 1;

特殊字符

类型说明
package报名
SyntaxProtobuf 版本
service定义服务
rpc定义服务中的方法
stream定义的方法传输为流传输
message定义消息体 message User{}
extend扩展消息体 extend Uesr()
import导入一些插件
//注释

生成文件

_pb2.py文件

每个 message 对应的信息存储,比如我们的 request 与 response 在这里被定义 extension

_pb2_grpc.py 文件

用来存储每一个服务的 server 与客户端以及注册 server 的工具客户端名为:service_name + Stub服务器名为:service_name + Servicer注册服务为:add_服务器端名_to_server如果 protobuf 文件中定义了多个服务,那么就会有多个函数 3 Demo3.1 PrerequisitesPython 3.5 or higherpip version 9.0.1 or higher
python -m pip install --upgrade pip
3.1.1 gRPCInstall gRPC:
python -m pip install grpcio
3.1.2 gRPC tools

Python 的 gRPC tools包括协议缓冲区编译器 protoc 和用于从.proto 服务定义生成服务器和客户端代码的特殊插件。

To install gRPC tools, run:
python -m pip install grpcio-tools

3.2 Project

3.2.1 新建protobuf文件 hello.proto:

创建rpc服务函数:
service MyHello {   // 写服务器里面需要的服务    // 在里面写服务所拥有的函数, 类似于视图    /*    * 定义一个 rpc 函数        函数名: HelloHenry        request: HelloHenryReq        response: HelloHenryReply    */    rpc HelloHenry(HelloHenryReq) returns (HelloHenryReply){}}
创建请求和返回函数:
message HelloHenryReq{    string name = 1;  // 1 就是代表枚举的意思, 其实也用不上    int32 age = 2;}message HelloHenryReply{    // 服务实现的内容,把请求的内容格式化拼接一下    string result = 1;  }

3.2.2 protobuf 文件转化protobufpython 对应的服务端和客户端
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. hello.proto

转化生成成功:

3.2.3 创建 service

创建服务实例:

class MyHello(pb2_grpc.MyHelloServicer): # 传入参数    def HelloHenry(self, request, context):        """        :param request:  请求        :param context:  上下文        :return:        """        # request 即 HelloHenryReq 里的参数数据        name = request.name        age = request.age        result = f'my name is {name}, I am {age} years old.'        return pb2.HelloHenryReply(result=result)

创建启动函数:

# 启动服务函数def run():    grpc_server = grpc.server(        futures.ThreadPoolExecutor(max_workers=4)   # 定义线程数量    )    # 将 grpc 实例类注册到 grpc server,即定义的 grpc_server    pb2_grpc.add_MyHelloServicer_to_server(servicer=MyHello(), server=grpc_server)    # 绑定 grpc server 端口号    grpc_server.add_insecure_port(address='0.0.0.0:5000')    print("server will start at 0.0.0.0:5000")    grpc_server.start() # 启动 grpc    # 由于 python 中执行 start 只会启动一下, 所以加下面的语句一直执行,直至手动停止    try:        while 1:            time.sleep(3600)    except KeyboardInterrupt:        grpc_server.stop(0)

启动服务

@L_403_10@3.2.4 创建 clIEnt

创建启动函数

def run():    # Step 1. 定义一个通道    conn = grpc.insecure_channel('0.0.0.0:5000')    # Step 2. 创建 clIEnt    clIEnt = pb2_grpc.MyHelloStub(channel=conn)    response = clIEnt.HelloHenry(pb2.HelloHenryReq(        name='大保健',        age=33    ))    print(response.result)

启动客户端


常见错误:

1、错误分析:

service 代码类中创建的 rpc 服务函数函数名错误,该名字应该和 proto 文件中的 rpc 函数名一致

修改

2、错误分析:

AttributeError: module ‘Google.protobuf.descriptor‘ has no attribute ‘_internal_create_key‘

解决方案:

1. 查看protoc的版本,在命令行输入如下代码:

protoc --version

2. 查看protobuf版本:

pip show protobuf

如果两个版本不一致,那么请将两个的版本保持到一致。

可以使用如下pip安装命令对protobuf升级:

pip install --upgrade protobuf -i https://pypi.douban.com/simple

2. 查看protobuf版本:

pip show protobuf

如果两个版本不一致,那么请将两个的版本保持到一致。

可以使用如下pip安装命令对protobuf升级:

pip install --upgrade protobuf -i https://pypi.douban.com/simple
总结

以上是内存溢出为你收集整理的【Python 上手 GRPC】(一)初体验全部内容,希望文章能够帮你解决【Python 上手 GRPC】(一)初体验所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1185750.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存