用Python编写简单的gRPC服务的详细过程


Posted in Python onJuly 04, 2021

gRPC 是可以在任何环境中运行的现代开源高性能 RPC 框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。

用Python编写简单的gRPC服务

grpc官网python参考:https://www.grpc.io/docs/languages/python/quickstart/
http://grpc.github.io/grpc/python/grpc.html

  • Python 3.5 or higher
  • pip version 9.0.1 or higher

安装gRPC相关的库
grpcio-tools主要用根据我们的protocol buffer定义来生成Python代码,官方解释是Protobuf code generator for gRPC。

#apt install python3-pip
pip install grpcio
pip install protobuf
pip install grpcio_tools

编写proto文件

proto是一个协议文件,客户端和服务器的通信接口正是通过proto文件协定的,可以根据不同语言生成对应语言的代码文件。

heartbeat.proto文件:

syntax = "proto3";

message HeartbeatRequest{
	string Host      = 1;
	int32  Mem       = 2;
	int32  Disk      = 3;
	int32  Cpu       = 4;
	int64  Timestamp = 5;
	int64  Seq       = 6;

}

message HeartbeatResponse{
	int32  ErrCode   = 1;
	string ErrMsg    = 2;
}

heartbeat_service.proto

syntax = "proto3";

import "heartbeat.proto";

// HeartBeatService
service HeartBeatService{
    rpc HeartBeat(HeartbeatRequest) returns(HeartbeatResponse){}
}

核心 就是一个 用于生成需要用到数据类型的文件;一个就是用于生成相关调用方法的类。 一个定义数据类型,一个用于定义方法。

通过proto生成.py文件

proto文件需要通过protoc生成对应的.py文件。protoc的下载地址 。下载解压之后,将解压目录添加到path的环境变量中。

pip install grpcio
install grpcio-tools
#pip  install --upgrade protobuf

注意:【下面命令是在proto文件所在的目录执行的,-I 用来指定proto的目录是 . 】

python -m grpc_tools.protoc -I=. --python_out=.. heartbeat.proto
python -m grpc_tools.protoc -I=. --grpc_python_out=.. heartbeat_service.proto
  • -I 指定proto所在目录
  • -m 指定通过protoc生成py文件
  • ?python_out生成py文件的输出路径
  • heartbeat.proto、heartbeat_service.proto为 输入的proto文件
  • 生成的文件名中 xxx_pb2.py 就是我们刚才创建数据结构文件,里面有定义函数参数和返回数据结构; xxx_pb2_grpc.py 就是我们定义的函数,定义了我们客服端rpc将来要调用方法。

编译客户端和服务端代码

服务端

#!/usr/bin/env python
# coding=utf-8
import sys
from concurrent import futures
import time

import grpc
from google.protobuf.json_format import MessageToJson

import heartbeat_service_pb2_grpc
import heartbeat_pb2
from lib.core.log import LOGGER


class HeartBeatSrv(heartbeat_service_pb2_grpc.HeartBeatServiceServicer):
    def HeartBeat(self, msg, context):
        try:
            # LOGGER.info(MessageToJson(msg, preserving_proto_field_name=True))
            body = MessageToJson(msg, preserving_proto_field_name=True)
            LOGGER.info("Get Heartbeat Request: %s", body)

            response = heartbeat_pb2.HeartbeatResponse()
            response.ErrCode = 0000
            response.ErrMsg = "success"

            return response
        except Exception as e:
            print("exception in heartbeat")
            LOGGER.error("RPC Service exception: %s", e)
            response = heartbeat_pb2.HeartbeatResponse()
            response.ErrCode = 500
            response.ErrMsg = "rpc error: %s" % e
            return response


def server(host, rpc_port):
    # 这里通过thread pool来并发处理server的任务
    # 定义服务器并设置最大连接数,concurrent.futures是一个并发库,类似于线程池的概念
    grpc_server = grpc.server(futures.ThreadPoolExecutor(max_workers=100))
    # 不使用SSL
    grpc_server.add_insecure_port('[::]' + ':' + str(rpc_port))
    # This method is only safe to call before the server is started.
    #  绑定处理器HeartBeatSrv(自己实现了处理函数)
    heartbeat_service_pb2_grpc.add_HeartBeatServiceServicer_to_server(HeartBeatSrv(), grpc_server)
    # 该方法只能调用一次, start() 不会阻塞
    # 启动服务器
    grpc_server.start()
    LOGGER.info("server start...")
    while 1:
        time.sleep(10)
    #grpc_server.wait_for_termination()


def main():
    try:
        LOGGER.info("begin start server")

        rpc_port = 8090
        host = "::"
        server(host, rpc_port)

    except Exception as e:
        LOGGER.error("server start error: %s", e)
        time.sleep(5)


if __name__ == '__main__':
    LOGGER.info(sys.path)
    main()

客户端

from time import sleep

import grpc

import heartbeat_pb2
import heartbeat_service_pb2_grpc
from lib.core.log import LOGGER


def run(seq):
    option = [('grpc.keepalive_timeout_ms', 10000)]
    #
    with grpc.insecure_channel(target='127.0.0.1:8090', options=option) as channel:
        # 客户端实例
        stub = heartbeat_service_pb2_grpc.HeartBeatServiceStub(channel)
        # stub调用服务端方法
        response = stub.HeartBeat(heartbeat_pb2.HeartbeatRequest(Host='hello grpc', Seq=seq), timeout=10)
        LOGGER.info("response ErrCode:%s", response.ErrCode)


if __name__ == '__main__':

    for i in range(1, 10000):
        LOGGER.info("i: %s", i)
        sleep(3)
        run(i)

参考

使用Python实现gRPC通信
参考URL: https://zhuanlan.zhihu.com/p/363810793
python grpc搭构服务
https://www.jianshu.com/p/10d9ca034567
python grpc 服务端和客户端调用demo
参考URL: https://blog.csdn.net/qq_42363032/article/details/115282405

到此这篇关于用Python编写简单的gRPC服务的文章就介绍到这了,更多相关Python gRPC服务内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python常见排序算法基础教程
Apr 13 Python
django框架如何集成celery进行开发
May 24 Python
Python遍历numpy数组的实例
Apr 04 Python
详解Python用户登录接口的方法
Apr 17 Python
Python可迭代对象操作示例
May 07 Python
python简单鼠标自动点击某区域的实例
Jun 25 Python
python设计微型小说网站(基于Django+Bootstrap框架)
Jul 08 Python
Django框架请求生命周期实现原理
Nov 13 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
Dec 01 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 Python
Python用requests库爬取返回为空的解决办法
Feb 21 Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 Python
python中__slots__节约内存的具体做法
Jul 04 #Python
python中Matplotlib绘制直线的实例代码
Jul 04 #Python
C站最全Python标准库总结,你想要的都在这里
Python实现列表拼接和去重的三种方式
Jul 02 #Python
简单且有用的Python数据分析和机器学习代码
Jul 02 #Python
python常见的占位符总结及用法
Jul 02 #Python
Python合并pdf文件的工具
You might like
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
详解JavaScript语法对{}处理的坑爹之处
2014/06/05 Javascript
jQuery调用ajax请求的常见方法汇总
2015/03/24 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
修改NPM全局模式的默认安装路径的方法
2020/12/15 Javascript
九步学会Python装饰器
2015/05/09 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
python爬虫使用cookie登录详解
2017/12/27 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
Pytorch 中的optimizer使用说明
2021/03/03 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
如何查找和删除数据库中的重复数据
2014/11/05 面试题
工商管理专业实习生自我鉴定
2013/09/29 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
法律七进实施方案
2014/03/15 职场文书
遗体告别仪式主持词
2014/03/20 职场文书
完美的中文自荐信
2014/05/24 职场文书
银行竞聘上岗演讲稿
2014/09/12 职场文书
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS