技术实践:教你用Python搭建gRPC服务
摘要:gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言。
本文分享自华为云社区《用python搭建gRPC服务》,原文作者:井冈山_阳春 。
gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言。一个gRPC服务的大体结构图为:

图一表明,grpc的服务是跨语言的,但需要遵循相同的协议(proto)。相比于REST服务,gPRC 的一个很明显的优势是它使用了二进制编码,所以它比 JSON/HTTP 更快,且有清晰的接口规范以及支持流式传输,但它的实现相比rest服务要稍微要复杂一些,下面简单介绍搭建gRPC服务的步骤。
1.安装python需要的库
pip install grpcio
pip install grpcio-tools
pip install protobuf
2.定义gRPC的接口
创建 gRPC 服务的第一步是在.proto 文件中定义好接口,proto是一个协议文件,客户端和服务器的通信接口正是通过proto文件协定的,可以根据不同语言生成对应语言的代码文件。这个协议文件主要就是定义好服务(service)接口,以及请求参数和相应结果的数据结构,具体的proto语法参见如下链接(https://www.jianshu.com/p/da7ed5914088),关于二维数组、字典等python中常用的数据类型,proto语法的表达见链接(https://blog.csdn.net/xiaoxiaojie521/article/details/106938519),下面是一个简单的例子。
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;
};
3.使用 protoc 和相应的插件编译生成对应语言的代码
python -m grpc_tools.protoc -I ./ --python_out=./ --grpc_python_out=. ./hello.proto
利用编译工具把proto文件转化成py文件,直接在当前文件目录下运行上述代码即可。
- -I 指定proto所在目录
- -m 指定通过protoc生成py文件
- --python_out指定生成py文件的输出路径
- hello.proto 输入的proto文件
执行上述命令后,生成hello_pb2.py 和hello_pb2_grpc.py这两个文件。
4.编写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地址以及端口号。
5.编写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接口规范一致的体现。
6.调用测试
先启动运行服务端的代码,再启动运行客户端的代码即可。
7.gRPC的使用总结
- 定义好接口文档
- 工具生成服务端/客户端代码
- 服务端补充业务代码
- 客户端建立 gRPC 连接后,使用自动生成的代码调用函数
- 编译、运行
技术实践:教你用Python搭建gRPC服务的更多相关文章
- 手把手教你用Python搭建自己的量化回测框架【均值回归策略】
手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...
- 使用Golang搭建gRPC服务提供给.NetCore客户端调用
目录 gRPC概述 RPC gRPC又是什么呢 安装 Golang IDE(Goland) Protocol Buffer 下载Protocal Buffer 配置Protocal Buffer编译器 ...
- [手把手教你] 用Swoft 搭建微服务(TCP RPC)
序言 Swoft Framework 基于 Swoole 原生协程的新时代 PHP 全栈式协程框架 Swoft 是什么? Swoft 框架是首个基于Swoole 原生协程的新时代 PHP高性能协程全栈 ...
- 【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构
一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案 ...
- 教你用python搭建一个「生活常识解答」机器人
今天教大家如何用Python爬虫去搭建一个「生活常识解答」机器人. 思路:这个机器人主要是依托于"阿里达摩院发布的语言模型PLUG",通过爬虫的方式,发送post请求(提问),然后 ...
- Python搭建HTTP服务
我们平时可能会需要HTTP服务,本机搭建一个服务器来完成有些过于繁琐,这时就可以用python帮我们搭建一个HTTP服务器,省时高效. python 2.x 输入命令:python -m Simple ...
- python搭建web服务
import json from urlparse import parse_qs from wsgiref.simple_server import make_server import os im ...
- python搭建后台服务
后端 # coding:utf-8 # 2019/10/22 16:01 # huihui # ref: from flask import Flask, abort, request, jsonif ...
- 12岁的少年教你用Python做小游戏
首页 资讯 文章 频道 资源 小组 相亲 登录 注册 首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...
随机推荐
- 在Visual Studio 中使用git——文件管理-下(六)
在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...
- 老vue项目webpack3升级到webpack5全过程记录(一)
背景 19年新建的vue项目,使用的是webpack3,随着项目的积累,组件的增多导致本地构建,线上打包等操作速度极慢,非常影响开发效率和部署效率,基于此问题,本次对webpack及相关插件进行了优化 ...
- DataGear 变更部署数据库为SQL Server填坑指南(含转写后的SQL server代码及SQL server配置文件)
1. 引言 2. 配置数据库链接 3. 引入数据库驱动 4. 手动初始化数据库 5. 改写SQL 6. 其他 7. 参考 1. 引言 DataGear默认使用Derby数据库作为系统的元数据库,至于待 ...
- Flink使用二次聚合实现TopN计算-乱序数据
一.背景说明: 在上篇文章实现了TopN计算,但是碰到迟到数据则会无法在当前窗口计算,需要对其中的键控状态优化 Flink使用二次聚合实现TopN计算 本次需求是对数据进行统计,要求每隔5秒,输出最近 ...
- MergingSort
递归排序的两种实现 <script type="text/javascript"> //归并排序(递归实现) //思想:堆排序利用了完全二叉树的性质,但是比较麻烦 // ...
- 【转载】Python 代码调试技巧
https://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/ Python 代码调试技巧 张 颖2012 年 5 月 03 日发布 ...
- Python re 截取文本中IP地址及用户名
文本示例: ts=2019-07-10T06:43:06523942Z pid=1875 tid=6320 version=e73c536 proto=http id=5a61a613e395f883 ...
- 基于端口划分vlan
基于端口划分vlan 拓扑图 PC ip 配置 PC 5:192.168.1.5 PC 6:192.168.1.6 PC 7:192.168.1.7 PC 8: 192.168.1.8 交换机配置 创 ...
- /etc/ssh/sshd_config ssh自动断 cent7
vim /etc/ssh/sshd_config ClientAliveInterval 60ClientAliveCountMax 8630000 ClientAliveInterval 30Cli ...
- 使用Wok管理kvm虚拟机
[Centos7.4] !!!测试环境我们首关闭防火墙和selinux [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# ...