gRPC是一个高性能、开源、通用的远程过程调用(RPC)框架,由Google推出。
它基于HTTP/2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。

在gRPC中,客户端可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。

gRPC支持多种语言,并提供了丰富的接口和库,以及简单易用的API,方便开发者进行快速开发和部署。
同时,gRPC的底层框架处理了所有强制严格的服务契约、数据序列化、网络通讯、服务认证、访问控制、服务观测等等通常有关联的复杂性,使得开发者可以更加专注于业务逻辑的实现。

1. 为什么用 gRPC

我平时用的最多的语言其实是golang,但是,做数据分析相关的项目,不太可能绕开python那些优秀的库。
于是,就想把数据分析的核心部分用python来实现,并用gRPC接口的方式提供出来。
其他的业务部分,仍然用原先的语言来实现。

gRPC相比于http REST,性能和安全上更加有保障,而且对主流的开发语言都支持的很好,不用担心与其他语言开发的业务系统对接的问题。

最后,gRPC虽然接口的定义和实现比http REST更复杂,但是,它提供了方便的命令行工具,
可以根据protocol buf的定义自动生成对应语言的类型定义,以及stub相关的代码等等。

实际开发时,一般只要关注接口的定义和业务功能的实现即可,gRPC框架需要的代码可以通过命令行工具生成。

2. 安装

对于Python语言,安装gRPC框架本身和对应的命令行工具即可:

$ pip install grpcio  # gRPC框架
$ pip install grpcio-tools # gRPC命令行工具

3. 开发步骤

开发一个gPRC接口一般分为4个步骤

  1. 使用[protocal buf](https://protobuf.dev/overview)定义服务接口
  2. 通过命令行生成clientserver的模板代码
  3. 实现server端代码(具体业务功能)
  4. 实现client端代码(具体业务功能)

下面通过一个示例演示gRPC接口的开发步骤。
这个示例来自最近做量化分析时的一个指标(MACD)的实现,
为了简化示例,下面实现MACD指标的业务功能部分是虚拟的,不是实际的计算方法。

3.1. 定义服务接口

接口主要定义方法,参数,返回值。

syntax = "proto3";

package idc;

// 定义服务,也就是对外提供的功能
service Indicator {
rpc GetMACD(MACDRequest) returns (MACDReply) {}
} // 请求的参数
message MACDRequest {
string start_date = 1; // 交易开始时间
string end_date = 2; // 交易结束时间
} // 返回值中每个对象的详细内容
message MACDData {
string date = 1; // 交易时间
float open = 2; // 开盘价
float close = 3; // 收盘价
float high = 4; // 最高价
float low = 5; // 最低价
float macd = 6; // macd指标值
} // 返回的内容,是一个数组
message MACDReply {
repeated MACDData macd = 1;
}

3.2. 生成模板代码

grpc_sample目录下,执行命令:

python -m grpc_tools.protoc -I./protos --python_out=. --pyi_out=. --grpc_python_out=. ./protos/indicator.proto

生成后文件结构如下:

生成了3个文件:

  1. indicator_pb2.pyproto文件定义的消息类
  2. indicator_pb2_grpc.py:服务端和客户端的模板代码
  3. indicator_pb2.pyi:不是必须的,为了能让mypy等工具校验代码类型是否正确

3.3. server端代码

通过继承indicator_pb2_grpc.py文件中的服务类,实现服务端功能。

# -*- coding: utf-8 -*-

from concurrent import futures

import grpc
import indicator_pb2
import indicator_pb2_grpc class Indicator(indicator_pb2_grpc.IndicatorServicer):
def GetMACD(self, request, context):
macd = []
for i in range(1, 5):
data = indicator_pb2.MACDData(
date=request.start_date,
open=i * 1.1,
close=i * 2.1,
high=i * 3.1,
low=i * 0.1,
macd=i * 2.5,
)
macd.append(data) return indicator_pb2.MACDReply(macd=macd) def serve():
port = "50051"
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
indicator_pb2_grpc.add_IndicatorServicer_to_server(Indicator(), server)
server.add_insecure_port("[::]:" + port)
server.start()
print("Server started, listening on " + port)
server.wait_for_termination() if __name__ == "__main__":
serve()

服务端需要实现proto文件中定义接口的具体业务功能。

3.4. client端代码

使用indicator_pb2_grpc.py文件中的Stub来调用服务端的代码。

# -*- coding: utf-8 -*-

import grpc
import indicator_pb2
import indicator_pb2_grpc def run():
with grpc.insecure_channel("localhost:50051") as channel:
stub = indicator_pb2_grpc.IndicatorStub(channel)
response = stub.GetMACD(
indicator_pb2.MACDRequest(
start_date="2023-01-01",
end_date="2023-12-31",
)
) print("indicator client received: ")
print(response) if __name__ == "__main__":
run()

3.5. 运行效果

加入客户端和服务端代码后,最后的文件结构如下:

测试时,先启动服务:

$  python.exe .\idc_server.py
Server started, listening on 50051

然后启动客户端看效果:

$  python.exe .\idc_client.py
indicator client received:
macd {
date: "2023-01-01"
open: 1.1
close: 2.1
high: 3.1
low: 0.1
macd: 2.5
}
macd {
date: "2023-01-01"
open: 2.2
close: 4.2
high: 6.2
low: 0.2
macd: 5
}
macd {
date: "2023-01-01"
open: 3.3
close: 6.3
high: 9.3
low: 0.3
macd: 7.5
}
macd {
date: "2023-01-01"
open: 4.4
close: 8.4
high: 12.4
low: 0.4
macd: 10
}

4. 传输文件/图片

除了上面的返回列表数据的接口比较常用以外,我用的比较多的还有一种接口就是返回图片。
将使用pythonmatplotlib等库生成的分析结果图片提供给其他系统使用。

开发的步骤和上面是一样的。

4.1. 定义服务接口

定义文件相关的服务接口,文件的部分需要加上stream关键字,也就是流式数据。

syntax = "proto3";

package idc;

// 定义服务,也就是对外提供的功能
service IndicatorGraph {
rpc GetMACDGraph(MACDGraphRequest) returns (stream MACDGraphReply) {}
} // 请求的参数
message MACDGraphRequest {
string start_date = 1; // 交易开始时间
string end_date = 2; // 交易结束时间
} // 返回的内容,是一个图片
message MACDGraphReply {
bytes macd_chunk = 1;
}

注意,定义服务接口GetMACDGraph时,返回值MACDGraphReply前面加上stream关键字。
返回的文件内容是 bytes 二进制类型。

4.2. 生成模板代码

执行命令:

python -m grpc_tools.protoc -I./protos --python_out=. --pyi_out=. --grpc_python_out=. ./protos/indicator_graph.proto

生成3个文件:

  1. indicator_graph_pb2.py
  2. indicator_graph_pb2.pyi
  3. indicator_graph_pb2_grpc.py

4.3. server端代码

首先,生成一个MACD指标的图片(macd.png)。

然后,服务端的代码主要就是按块读取这个文件并返回。


import grpc
import indicator_graph_pb2
import indicator_graph_pb2_grpc class IndicatorGraph(indicator_graph_pb2_grpc.IndicatorGraphServicer):
def GetMACDGraph(self, request, context):
chunk_size = 1024 with open("./macd.png", mode="rb") as f:
while True:
chunk = f.read(chunk_size)
if not chunk:
return response = indicator_graph_pb2.MACDGraphReply(macd_chunk=chunk)
yield response

4.4. client端代码

客户端的代码也要相应修改,不再是一次性接受请求的结果,而是循环接受,直至结束。

import grpc
import indicator_graph_pb2
import indicator_graph_pb2_grpc def run():
with grpc.insecure_channel("localhost:50051") as channel:
stub = indicator_graph_pb2_grpc.IndicatorGraphStub(channel) print("indicator client received: ")
with open("./received_macd.png", mode="wb") as f:
for response in stub.GetMACDGraph(
indicator_graph_pb2.MACDGraphRequest(
start_date="2023-01-01",
end_date="2023-12-31",
)
):
f.write(response.macd_chunk)

客户端接收完成后,图片保存在 received_macd.png 中。

实际执行后,图片可以正常保存并显示。

5. 回顾

本篇是最近用gPRC封装python数据分析相关业务过程中一些简单的总结。

这里没有对gPRC做系统的介绍,它的官方文档已经非常完善,而且文档中针对主流编程语言的示例也都有。
本篇笔记中的两个示例虽然简单,却是我用的最多的两种情况:
一种是返回对象数组:是为了将pandasnumpy等库处理后的数据返回出来供其他系统使用;
一种是返回文件/图片:是为了将matplotlibseaborn等库生成的分析图片返回出来供其他系统使用。

目前gPRC对我最大的好处是,它提供了一种稳定可靠的,将python强大的数据分析能力结合到其他系统中的能力。

跨界协作:借助gRPC实现Python数据分析能力的共享的更多相关文章

  1. 2016年终总结--一个Python程序猿的跨界之旅

    时间过得真快.感觉15年年终总结刚写完,16年就结束了.看了blog,16年就写了可怜的8篇,对我来说16年还算顺风顺水. 真正可能出乎意料的是年底我离开了呆了2年半的龙图游戏,临时放弃了用了3年半的 ...

  2. KNIME + Python = 数据分析+报表全流程

    Python 数据分析环境 数据分析领域有很多可选方案,例如SPSS傻瓜式分析工具,SAS专业性商业分析工具,R和python这类需要代码编程类的工具.个人选择是python这类,包括pandas,n ...

  3. 【读书笔记与思考】《python数据分析与挖掘实战》-张良均

    [读书笔记与思考]<python数据分析与挖掘实战>-张良均 最近看一些机器学习相关书籍,主要是为了拓宽视野.在阅读这本书前最吸引我的地方是实战篇,我通读全书后给我印象最深的还是实战篇.基 ...

  4. Python数据分析--Pandas知识点(二)

    本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘. Python数据分析--Pandas知识点(一) 下面将是在知识点一的基础上继续总结. 13. 简单计算 新建一个数据表 ...

  5. 学习参考《Python数据分析与挖掘实战(张良均等)》中文PDF+源代码

    学习Python的主要语法后,想利用python进行数据分析,感觉<Python数据分析与挖掘实战>可以用来学习参考,理论联系实际,能够操作数据进行验证,基础理论的内容对于新手而言还是挺有 ...

  6. 小白学 Python 数据分析(1):数据分析基础

    各位同学好,小编接下来为大家分享一些有关 Python 数据分析方面的内容,希望大家能够喜欢. 人工植入广告: PS:小编最近两天偷了点懒,好久没有发原创了,最近是在 CSDN 开通了一个付费专栏,用 ...

  7. python数据分析与挖掘实战第二版pdf-------详细代码与实现

    [书名]:PYTHON数据分析与挖掘实战 第2版[作者]:张良均,谭立云,刘名军,江建明著[出版社]:北京:机械工业出版社[时间]:2020[页数]:340[isbn]:9787111640028 学 ...

  8. [Python数据分析]新股破板买入,赚钱几率如何?

    这是本人一直比较好奇的问题,网上没搜到,最近在看python数据分析,正好自己动手做一下试试.作者对于python是零基础,需要从头学起. 在写本文时,作者也没有完成这个小分析目标,边学边做吧. == ...

  9. 跨界玩AR,迪奥、Hugo Boss等知名奢侈品牌将制造AR眼镜

    Snapchat因为阅后即焚消息应用而被人所熟知,前段时间这家公司拓展主要业务,未来将不再只有消息应用,还有款名为"Spectacles"的AR太阳镜.内置了一个摄像头,戴上之后即 ...

  10. 【Python数据分析】Python3多线程并发网络爬虫-以豆瓣图书Top250为例

    基于上两篇文章的工作 [Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 [Python数据分析]Python3操作Excel(二) 一些问题的解决与优化 已经正确地实现 ...

随机推荐

  1. 关闭 cockpit 登陆提示

    sudo rm /etc/issue.d/cockpit.issue sudo rm /etc/motd.d/cockpit

  2. Oracle数据库学习总结

    SQL 笔记 ch3_cn 1.数据类型记录 char(n) 定长字符 varchar(n) 可变长字符 numeric(p,d) 定点数,总位数p,小数点后位数q float(n) n位浮点数 2. ...

  3. python中BeautifulSoup库使用小结

    转载请注明出处: BeautifulSoup是一个用于解析HTML和XML文档的Python库,它提供了一些简单但强大的API,让你可以从文档中提取数据.以下是一些BeautifulSoup的主要特性 ...

  4. JMeter接口性能测试使用

    下载完JMeter以后,通过JMeter.bat启动JMeter,打开JMeter界面如下所示: 右击"测试计划">添加>Threads(Users)>线程组.J ...

  5. P1047 [NOIP2005 普及组] 校门外的树

    1.题目介绍 [NOIP2005 普及组] 校门外的树 题目描述 某校大门外长度为 \(l\) 的马路上有一排树,每两棵相邻的树之间的间隔都是 \(1\) 米.我们可以把马路看成一个数轴,马路的一端在 ...

  6. [javaee] - tomcat 下载和配置环境变量

    以tomcat9为例 第一步 :下载到本地并解压文件 解压后: 第二步:配置环境变量,在系统变量中添加  CATALINE_HOME  ,路径为tomcat的目录 启动tomcat , 启动之后不要关 ...

  7. JMS微服务开发示例(八)双机热备

    双机热备,指两个一模一样的微服务,两个同时在运行,但是只有一个在工作,当工作中的微服务垮掉后,另一个会自行补上. 要实现这个,只需要设置 SingletonService = true. var mi ...

  8. [转帖]tidb 修改root密码

    http://blog.51yip.com/tidb/2452.html   通过 {pd-ip}:{pd-port}/dashboard 登录 TiDB Dashboard,登录用户和口令为 TiD ...

  9. ZCube:在我的优惠券中的落地实践 | 京东云技术团队

    ​ 前言 我的优惠券作为营销玩法的一种运营工具,在营销活跃场中起到很至关重要的作用.如何更加高效的赋能业务,助理业务发展,灵活扩展业务,是我们一直追求和思考的方向 一.背景 1.1 现状 营销中台作为 ...

  10. 从好玩到好用:程序员用AI提效的那些事儿

    本片内容是[AI思维空间]ChatGPT纵横编程世界,点亮智慧火花的续作,主要记录组内开发小伙伴儿们在开发过程中的实际应用案例,记录典型案例,尽量不要和其他人重复,以解决开发过程中的实际问题为主,设计 ...