用Python编写简单的gRPC服务的详细过程
作者:西京刀客 发布时间:2023-07-22 13:41:39
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
来源:https://blog.csdn.net/inthat/article/details/118385147


猜你喜欢
- 本文为大家分享了python实现学生管理系统的具体代码,供大家参考,具体内容如下1.0版本学生管理系统''' 1.添
- Python Logging原来真的远比我想象的要复杂很多很多,学习路线堪比git。但是又绕不过去,alternatives又少,所以必须要
- 本文为大家分享了MySQL 5.7版本的安装使用详细教程,更改数据库data的存储路径,供大家参考,具体内容如下因为看到mysql5.7加入
- 最近在看python的算法书,之前在年前买的书,一直在工作间隙的时候,学习充电,终于看到这本书,但是确实又有点难,感觉作者写的代码太炫技 了
- Python中对于数组和列表进行切片操作是很频繁的,当然对于切片的操作可供我们直接使用的函数也是很遍历了,我们今天主要简单总结一下常用集中索
- 一、变量的定义程序中,数据都是临时存储在内存中,为了更快速的查找或使用这个数据,通常我们把这个数据在内存中存储之后,给整个数据定义一个名称,
- SQL分页查询:背景在公司的系统中有一个平台是 做配置管理的 就是所谓的 CRUD 的平台,但是点击后进去到页面第一次看到的是一次查询的页面
- 说起来惭愧,总是犯一些小错误,纠结半天,这不应为一个分号的玩意折腾了好半天! 错误时在执行SQL语句的时候发出的,信息如下: Java代码
- 1. ADO.NET 方式连接Mysql数据库 经过在网上查找资料,在.net 上连接mysql 数据库有三种方式: 方法一: 使用Core
- PHP crc32() 函数实例输出 crc32() 的结果:<?php $str = crc32("Hello World
- 1、MySQL默认存储引擎的变迁在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索
- 前言我原本是学C\C++,这是本人第一篇关于python的文章。请多多关照!对于python为什么要打包成exe文件,是因为传输源文件以及源
- 在LintCode上练习遇到这个问题,查阅资料找到多种方法,总结如下。输入输出123321第一种:整数方法取余取整实现class Solut
- 下标所谓下标就是编号,就好比超市中存储柜的编号,通过这个编号就能找到相应的存储空间。Python中字符串,列表,元祖均支持下标索引。例如:#
- 本文实例讲述了Python实现的读取电脑硬件信息功能。分享给大家供大家参考,具体如下:上学那会,老师让我用java获取电脑硬件信息,CPU,
- 之前学习深度学习算法,都是使用网上现成的数据集,而且都有相应的代码。到了自己开始写论文做实验,用到自己的图像数据集的时候,才发现无从下手 ,
- Python中多线程使用到Threading模块。Threading模块中用到的主要的类是Thread,我们先来写一个简单的多线程代码:#
- 本文为大家分享了python银行管理系统的具体代码,供大家参考,具体内容如下自己写的练手小程序,练习面向对象的概念,代码中都有注释,刚学的同
- 前言如果你在寻找python工作,那你的面试可能会涉及Python相关的问题。通过对网络资料的收集整理,本文列出了100道python的面试
- pytorch中训练完网络后,需要对学习的结果进行测试。官网上例程用的方法统统都是正确率,使用的是torch.eq()这个函数。但是为了更精