如何用Python搭建gRPC服务
作者:华为云开发者社区 发布时间:2023-02-08 16:00:54
一、概述
一个gRPC服务的大体结构图为:
图一表明,grpc的服务是跨语言的,但需要遵循相同的协议(proto)。相比于REST服务,gPRC 的一个很明显的优势是它使用了二进制编码,所以它比 JSON/HTTP 更快,且有清晰的接口规范以及支持流式传输,但它的实现相比rest服务要稍微要复杂一些,下面简单介绍搭建gRPC服务的步骤。
二、安装python需要的库
pip install grpcio
pip install grpcio-tools
pip install protobuf
三、定义gRPC的接口
创建 gRPC 服务的第一步是在.proto 文件中定义好接口,proto是一个协议文件,客户端和服务器的通信接口正是通过proto文件协定的,可以根据不同语言生成对应语言的代码文件。这个协议文件主要就是定义好服务(service)接口,以及请求参数和相应结果的数据结构,下面是一个简单的例子。
syntax = "proto3";
option cc_generic_services = true;
//定义服务接口
service GrpcService {
rpc hello (HelloRequest) returns (HelloResponse) {} //一个服务中可以定义多个接口,也就是多个函数功能
}
//请求的参数
message HelloRequest {
string data = 1; //数字1,2是参数的位置顺序,并不是对参数赋值
Skill skill = 2; //支持自定义的数据格式,非常灵活
};
//返回的对象
message HelloResponse {
string result = 1;
map<string, int32> map_result = 2; //支持map数据格式,类似dict
};
message Skill {
string name = 1;
};
四、使用 protoc 和相应的插件编译生成对应语言的代码
python -m grpc_tools.protoc -I ./ --python_out=./ --grpc_python_out=. ./hello.proto
利用编译工具把proto文件转化成py文件,直接在当前文件目录下运行上述代码即可。
1.-I 指定proto所在目录
2.-m 指定通过protoc生成py文件
3.--python_out指定生成py文件的输出路径
4.hello.proto 输入的proto文件
执行上述命令后,生成hello_pb2.py 和hello_pb2_grpc.py这两个文件。
五、编写grpc的服务端代码
#! /usr/bin/env python
# coding=utf8
import time
from concurrent import futures
import grpc
from gRPC_example import hello_pb2_grpc, hello_pb2
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class TestService(hello_pb2_grpc.GrpcServiceServicer):
'''
继承GrpcServiceServicer,实现hello方法
'''
def __init__(self):
pass
def hello(self, request, context):
'''
具体实现hello的方法,并按照pb的返回对象构造HelloResponse返回
:param request:
:param context:
:return:
'''
result = request.data + request.skill.name + " this is gprc test service"
list_result = {"12": 1232}
return hello_pb2.HelloResponse(result=str(result),
map_result=list_result)
def run():
'''
模拟服务启动
:return:
'''
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
hello_pb2_grpc.add_GrpcServiceServicer_to_server(TestService(),server)
server.add_insecure_port('[::]:50052')
server.start()
print("start service...")
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
run()
在服务端侧,需要实现hello的方法来满足proto文件中GrpcService的接口需求,hello方法的传入参数,是在proto文件中定义的HelloRequest,context是保留字段,不用管,返回参数则是在proto中定义的HelloResponse,服务启动的代码是标准的,可以根据需求修改提供服务的ip地址以及端口号。
六、编写gRPC客户端的代码
#! /usr/bin/env python
# coding=utf8
import grpc
from gRPC_example import #! /usr/bin/env python
# coding=utf8
import grpc
from gRPC_example import hello_pb2_grpc, hello_pb2
def run():
'''
模拟请求服务方法信息
:return:
'''
conn=grpc.insecure_channel('localhost:50052')
client = hello_pb2_grpc.GrpcServiceStub(channel=conn)
skill = hello_pb2.Skill(name="engineer")
request = hello_pb2.HelloRequest(data="xiao gang", skill=skill)
respnse = client.hello(request)
print("received:",respnse.result)
if __name__ == '__main__':
run()
def run():
'''
模拟请求服务方法信息
:return:
'''
conn=grpc.insecure_channel('localhost:50052')
client = hello_pb2_grpc.GrpcServiceStub(channel=conn)
skill = hello_pb2.Skill(name="engineer")
request = hello_pb2.HelloRequest(data="xiao gang", skill=skill)
response = client.hello(request)
print("received:",response.result)
if __name__ == '__main__':
run()
客户端侧代码的实现比较简单,首先定义好访问ip和端口号,然后定义好HelloRequest数据结构,远程调用hello即可。需要强调的是,客户端和服务端一定要import相同proto文件编译生成的hello_pb2_grpc, hello_pb2模块,即使服务端和客户端使用的语言不一样,这也是grpc接口规范一致的体现。
七、调用测试
先启动运行服务端的代码,再启动运行客户端的代码即可。
八、gRPC的使用总结
定义好接口文档
工具生成服务端/客户端代码
服务端补充业务代码
客户端建立 gRPC 连接后,使用自动生成的代码调用函数
编译、运行
来源:https://www.cnblogs.com/huaweiyun/p/14948951.html
猜你喜欢
- 为了将excel数据自动转换成所需要的erlang数据,听同事说使用python会很方便简单,就自学了两天python,写了一个比较粗糙的p
- 实验介绍此次实验帮助大家利用 OpenCV 去读取摄像头的视频流,你可以直接使用笔记本本身的摄像头,也可以用 USB 连接直接的摄像头。如果
- 本文实例为大家分享了PHP文件打包下载zip的具体代码,供大家参考,具体内容如下<?php//获取文件列表function list_
- 场景应用老大我让爬取内部网站获取数据,插入到新建的表中,并每天进行爬取更新数据(后面做了定时任务)。然后根据该表统计每日的新增数量/更新数量
- 当然首先得去下载ASPupload 程序,安装后使用!官方网站下载:http://www.aspupload.com/使用ASP实现文件上载
- UserWarning: indexing with dtype torch.uint8 is now deprecated, please
- php redis断线重连,pconnect连接失败问题介绍在swoole ,workerman等cli长连接模式下,遇到Redis异常断开
- 索引类型聚簇索引: 叶子节点存储的是行记录,每个表必须要有至少一个聚簇索引。使用聚簇索引查询会很快,因为可以直接定位到行记录普通索引:二级索
- 声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移。通过傅里叶变换,可以将时间域的声音函数分解
- 介绍在本文中,云朵君将和大家一起了解装饰器的工作原理,如何将我们之前定义的定时器类 Timer 扩展为装饰器,以及如何简化计时功能。最后对
- 列表操作如此下:a = ["haha","xixi","baba"]增:a.ap
- 一个单步的动作,用了这个脚本,就可以重复执行100遍1000遍。上面就是一个路径描边100遍的效果,吼吼~ 不知道大家明白用处没有?(以前老
- 1、python多进程编程背景python中的多进程最大的好处就是充分利用多核cpu的资源,不像python中的多线程,受制于GIL的限制,
- 1、残差连接是目前常用的组件,解决了大规模深度学习模型梯度消失和瓶颈问题。通常,在10层以上的模型中追加残差连接可能有帮助。from ker
- .xls格式 Office2003及以下版本 .xlsx格式Offi
- 什么是索引拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为
- 我们知道,任何数据库系统都无法避免崩溃的状况,即使你使用了Clustered,双机热备……仍然无
- 8. 使用DECODE函数来减少处理时间使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. 例如: SELECT COUNT(
- 这段时间我一直在说设计需要有层次感,这种层次感可能有很多类型,比如色彩的层次感,或是元素的层次感。当一个设计缺乏层次感的时候页面所表现出来的
- python中最基本的数据类型如下:Number(数字)String(字符串)List(列表)Tuple(元组)Dictionary(字典)