提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
借鉴文章
https://blog.csdn.net/bocai_xiaodaidai/article/details/103958468
一、grpc简介
gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等),本篇只介绍 Python 的 gRPC 使用。因为 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具有良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等
二、使用步骤
1.引入库
代码如下(示例):
pip install grpcio #gRPC 的安装
pip install protobuf #ProtoBuf 相关的 python 依赖库
pip install grpcio-tools #python grpc 的 protobuf 编译工具
2.项目目录
目录如下(示例):
3.创建文件
新建data.proto文件,定义传输的数据格式和grpc服务要实现的函数
grpc是一套传输协议,我们需要在底层实现这套传输协议.当然这些工作都已经被做完了,所以我们只要学会使用一个具有grpc传输协议的服务器和在客户端上调用grpc传输协议传输数据就可以了.
grpc传输协议传输的数据类型为protobuf数据.ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
所以grpc都是和protobuf一块使用。
syntax = "proto3";
package base_package;
service FormatData { //定义服务,用在rpc传输中
rpc DoFormat(actionrequest) returns (actionresponse){}
}
message actionrequest {
string text = 1;
}
message actionresponse{
string text=1;
}
4.生成proto数据的python调用格式和grpc服务接口
先创建 base_package目录
然后运行
python -m grpc_tools.protoc -I. --python_out=./base_package --grpc_python_out=./base_package ./data.proto
会生成:data_pb2.py 与 data_pb2_grpc.py, 其中data_pb2.py是数据格式调用的文件,data_pb2_grpc.py是grpc传输协议接口调用的文件.
5.创建服务端
在服务器端代码中需要实现proto文件中定义的服务接口(FormatData),并重写处理函数(DoFormat),将重写后的服务类实例化以后添加到grpc服务器中.
这是在服务器linux配置的。目录一样,复制就行,没办法把目录设置源,就自己用sys加
import grpc
import time
import os
import sys
import datetime
import json
sys.path.append("/home/写自己地址/Shanmh/grpc")
sys.path.append("/home/写自己地址/Shanmh/grpc/base_package")
from concurrent import futures
from base_package import data_pb2, data_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = '192.168.6.222'#linux ip 示例
_PORT = '8080'
class FormatData(data_pb2_grpc.FormatDataServicer):
# 重写接口函数
def DoFormat(self, request, context):
str = request.text
person=json.loads(str)
print("已经收到信息",person["name"])
return data_pb2.actionresponse(text="received") # 返回一个类实例
def serve():
# 定义服务器并设置最大连接数,corcurrent.futures是一个并发库,类似于线程池的概念
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:
print("runing!!")
time.sleep(3)
except KeyboardInterrupt:
grpcServer.stop(0) # 关闭服务器
if __name__ == '__main__':
serve()
6.客户端
```python
import grpc
from base_package import data_pb2, data_pb2_grpc
import os
import time
import json
_HOST = '192.168.6.222' #linux ip
_PORT = '8080'
person={"name":"zangsan","age":15}
def run():
while 1:
conn = grpc.insecure_channel(_HOST + ':' + _PORT) # 监听频道
client = data_pb2_grpc.FormatDataStub(channel=conn) # 客户端使用Stub类发送请求,参数为频道,为了绑定链接
response = client.DoFormat(data_pb2.actionrequest(text=json.dumps(person))) # 返回的结果就是proto中定义的类
print(response)
print("received: " + response.text)
time.sleep(5)
if __name__ == '__main__':
run()
可以看到是可以传送字典数据的
总结
先运行服务端,在运行客户端
本文借鉴后运行成功,留存备忘