用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开发中module模块用法实例分析
Nov 12 Python
Python实现检测文件MD5值的方法示例
Apr 11 Python
详解python里的命名规范
Jul 16 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
python用pandas数据加载、存储与文件格式的实例
Dec 07 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 Python
Python关于反射的实例代码分享
Feb 20 Python
python代码实现将列表中重复元素之间的内容全部滤除
May 22 Python
Python基础之Socket通信原理
Apr 22 Python
Django中的JWT身份验证的实现
May 07 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
Extjs表单常见验证小结
2014/03/07 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
js正则表达式注册页面表单验证
2016/10/11 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
2016/12/08 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
Python中实现结构相似的函数调用方法
2015/03/10 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
Python----数据预处理代码实例
2019/03/20 Python
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
渡河少年教学反思
2014/02/12 职场文书
反四风对照检查材料
2014/09/22 职场文书
领导干部作风建设总结
2014/10/23 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
法律进社区活动总结
2015/05/07 职场文书
2016年三严三实党课学习心得体会
2016/01/06 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技