标签:初体验 protobuf name Python server GRPC pip python grpc
1 什么是 grpc
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
文件- 每个 message 对应的信息存储,比如我们的 request 与 response 在这里被定义 extension
-
_pb2_grpc.py
文件- 用来存储每一个服务的 server 与客户端以及注册 server 的工具
- 客户端名为:
service_name + Stub
- 服务器名为:
service_name + Servicer
- 注册服务为:
add_服务器端名_to_server
- 如果 protobuf 文件中定义了多个服务,那么就会有多个函数
-
3 Demo
3.1 Prerequisites
- Python 3.5 or higher
pip
version 9.0.1 or higher
python -m pip install --upgrade pip
3.1.1 gRPC
- Install 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 文件转化
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)
-
启动服务
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
标签:初体验,protobuf,name,Python,server,GRPC,pip,python,grpc 来源: https://blog.csdn.net/hongzhen91/article/details/118417017
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。