python使用rpc框架gRPC的方法


Posted in Python onAugust 24, 2018

概述

gRPC 是谷歌开源的一个rpc(远程程序调用)框架,可以轻松实现跨语言,跨平台编程,其采用gRPC协议(基于HTTP2)。

rpc:

remote procedure call, 翻译过来就是是远程程序调用。具体来说,就是客户端c1需要调用服务器s1上的某个方法(函数),得到相应的返回值并传递给c1。

gRPC协议

要说gRPC协议需要先了解HTTP2, 虽然HTTP1.X 协议至今仍是主流协议,但是随着我们对性能要求越来越高,和web规模的不断扩大,HTTP2就应运而生。
在这里,我们只需要知道其性能是高于现有的HTTP1就好了,感兴趣的朋友可以深入了解HTTP2。

使用原因

在上家公司,因为之前的项目有一下几个痛点,所以决定采用rpc框架:

  • 项目的app,网站,m站,小程序等是独立项目, 一处改,处处改,效率低下
  • 所有模块在一个项目里面,维护起来需要熟悉所有业务流程,维护难度加大
  • 扩展性不强,应付高一点的并发需要将项目所有东西复制到新加服务器,运行所有模块,包括并发量不高的模块,造成资源浪费

所以我们花了点时间处理这些问题,将订单,用户等模块拆开,方便独立部署,独立升级,独立维护,这样可以大大提高维护效率和项目的伸缩性。

使用方法

1.准备.proto文件

syntax = "proto3";
package order;
message OrderRequest {// 定义请求数据
   string phone = 1;
   string price = 2;
   map<string, string> request_arg = 3;//便于字段扩展
 }

 message JSONResponse{// 定义返回格式
   string rst_string = 1; //统一返回json字符串作处理
   }

 service OrderHandler {
  // format a list of events.
  rpc create_order (OrderRequest) returns (JSONResponse) {}
 }
// 其中:
// message: 定义数据结构<br>
// service: 定义接口的名字,参数,

2.生成所需文件(服务器和客户端均需要)

python -m grpc_tools.protoc -I./ --python_out=./ --grpc_python_out=./ ./*.proto

运行后会生成两个文件(test_pb2.py, test_pb2_grpc.py)

3.编写server端代码

import time
import test_pb2
import test_pb2_grpc
import grpc
 
 
def test(request):
  # 实际调用到的函数
  json_response = test_pb2.JSONResponse()
  json_response.rst_string = json.dumps({"ret":"Hi gRPC"})# 构造出proto文件中定义的返回值格式
  return json_response
  
 class OrderHandler(test_pb2_grpc.OrderHandlerServicer):
  '''
  gRPC请求会进入这个类中进行分发,根据客户端请求的方法找到对应的处理方法
  感兴趣的可以打断点查看request, context中的内容,他们包含了请求的所有信息
  '''

   def create_order(self, request, context):
     return test(request, context)

 def serve():
   # 开启gRPC服务,监听特定端口,
   server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
   test_pb2_grpc.add_OrderHandlerServicer_to_server(
                      OrderHandler(), server)
   server.add_insecure_port('[::]:{}'.format(12006))
   server.start()
   try:
     while True:
       time.sleep(186400)
   except KeyboardInterrupt:
     server.stop(0)
serve()

4.编写客户端代码进行 测试 client.py

import grpc
 import test_pb2_grpc
 import test_pb2

 channel = grpc.insecure_channel("127.0.0.1:12006")
 stub = test_pb2_grpc.OrderHandlerStub(channel)
 # 要完成请求需要先构造出proto文件中定义的请求格式
 ret = stub.create_order(test_pb2.OrderRequest(phone="12990", price="50"))
 
 print(ret.rst_string)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python psutil模块简单使用实例
Apr 28 Python
Python网络爬虫实例讲解
Apr 28 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 Python
Python实现简单http服务器
Apr 12 Python
对python Tkinter Text的用法详解
Oct 11 Python
解决python中 f.write写入中文出错的问题
Oct 31 Python
对Django 中request.get和request.post的区别详解
Aug 12 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
python 实现分组求和与分组累加求和代码
May 18 Python
利用python+request通过接口实现人员通行记录上传功能
Jan 13 Python
pytest配置文件pytest.ini的详细使用
Apr 17 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 #Python
python中文编码与json中文输出问题详解
Aug 24 #Python
详解Django解决ajax跨域访问问题
Aug 24 #Python
Python面向对象之反射/自省机制实例分析
Aug 24 #Python
Python使用装饰器模拟用户登陆验证功能示例
Aug 24 #Python
Python日志模块logging基本用法分析
Aug 23 #Python
Python多继承原理与用法示例
Aug 23 #Python
You might like
在php MYSQL中插入当前时间
2008/04/06 PHP
zend framework重定向方法小结
2016/05/28 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
锋利的jQuery jQuery中的DOM操作
2010/03/21 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
分享vim python缩进等一些配置
2018/07/02 Python
Python之循环结构
2019/01/15 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
2020/02/07 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
2020/02/17 Python
python实现简单颜色识别程序
2020/02/19 Python
python定义具名元组实例操作
2021/02/28 Python
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
如何写好升职自荐信
2014/01/06 职场文书
培训专员岗位职责
2014/02/26 职场文书
劲霸男装广告词
2014/03/21 职场文书
校庆筹备方案
2014/03/30 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
离婚财产分配协议书
2014/10/21 职场文书
颐和园英文导游词
2015/01/30 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
2019暑假学生安全口号
2019/06/27 职场文书