如何用Python搭建gRPC服务


Posted in Python onJune 30, 2021
目录
  • 一、概述
  • 二、安装python需要的库
  • 三、定义gRPC的接口
  • 四、使用 protoc 和相应的插件编译生成对应语言的代码
  • 五、编写grpc的服务端代码
  • 六、编写gRPC客户端的代码
  • 七、调用测试
  • 八、gRPC的使用总结

一、概述

一个gRPC服务的大体结构图为:

如何用Python搭建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 连接后,使用自动生成的代码调用函数
  • 编译、运行

以上就是如何用Python搭建gRPC服务的详细内容,更多关于Python搭建gRPC服务的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python新手经常遇到的17个错误分析
Jul 30 Python
利用python爬取软考试题之ip自动代理
Mar 28 Python
浅谈用VSCode写python的正确姿势
Dec 16 Python
Python实现ping指定IP的示例
Jun 04 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
python ChainMap的使用和说明详解
Jun 11 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
Python decimal模块使用方法详解
Jun 08 Python
pytorch  网络参数 weight bias 初始化详解
Jun 24 Python
python字典通过值反查键的实现(简洁写法)
Sep 30 Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 Python
python not运算符的实例用法
Jun 30 #Python
pycharm部署django项目到云服务器的详细流程
Python快速实现一键抠图功能的全过程
总结python多进程multiprocessing的相关知识
Jun 29 #Python
python 字典和列表嵌套用法详解
Jun 29 #Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
5行Python代码实现一键批量扣图
You might like
php生成WAP页面
2006/10/09 PHP
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
js document.write()使用介绍
2014/02/21 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
TensorFlow Session会话控制&amp;Variable变量详解
2018/07/30 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
详解python中@的用法
2019/03/27 Python
Python将string转换到float的实例方法
2019/07/29 Python
python支持多线程的爬虫实例
2019/12/21 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
2020/03/28 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
追悼会上的答谢词
2014/01/10 职场文书