
grpc 是一个高性能、通用的开源RPC框架,Google主要面向移动应用开发基于http/2协议标准而设计的,基于ProtoBuf(Protocl Buffers)序列化协议开发。grpc 提供一种简单的方法来精确地定义服务和ios、AndroID 和后台支持服务自动生成可靠性很强的客户端功能库。2 什么是 protobuf protobuf 是一个具有高效的协议数据交换格式工具库(类似Json),但是和Json相比,Protobuf有更高的转化效率,时间效率和空间效率都 Json 的3-5倍
具有跨语言性: python、go、java、c++ …
常用数据类型
| 类型 | 说明 |
|---|---|
| string | 要求 utf-8 或 7-bit 与ASCII编码的字符串 |
| bytes | / |
| bool | / |
| int32 | / |
| int64 | /(对于python,进入之后都是int64) |
| float | / |
| repeated | 数组(列表), repeated string data =1; (定义个元素都是 string 的数组) |
| map | 字典(Python), map <string, string> data = 1; |
特殊字符
| 类型 | 说明 |
|---|---|
| package | 报名 |
| Syntax | Protobuf 版本 |
| service | 定义服务 |
| rpc | 定义服务中的方法 |
| stream | 定义的方法传输为流传输 |
| message | 定义消息体 message User{} |
| extend | 扩展消息体 extend Uesr() |
| import | 导入一些插件 |
| // | 注释 |
生成文件
_pb2.py文件
_pb2_grpc.py 文件
service_name + Stub服务器名为:service_name + Servicer注册服务为:add_服务器端名_to_server如果 protobuf 文件中定义了多个服务,那么就会有多个函数 3 Demo3.1 PrerequisitesPython 3.5 or higherpip version 9.0.1 or higherpython -m pip install --upgrade pip3.1.1 gRPCInstall gRPC:python -m pip install grpcio3.1.2 gRPC toolsPython 的 gRPC tools包括协议缓冲区编译器 protoc 和用于从.proto 服务定义生成服务器和客户端代码的特殊插件。
python -m pip install grpcio-tools3.2 Project3.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 文件转化protobuf成 python 对应的服务端和客户端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) 启动服务
创建启动函数
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】(一)初体验所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)