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操作MySQL数据库具体方法
Oct 28 Python
Python实现的飞速中文网小说下载脚本
Apr 23 Python
python实现数值积分的Simpson方法实例分析
Jun 05 Python
python 写的一个爬虫程序源码
Feb 28 Python
python使用 HTMLTestRunner.py生成测试报告
Oct 20 Python
Django实现快速分页的方法实例
Oct 22 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
python中提高pip install速度
Feb 14 Python
pytorch实现MNIST手写体识别
Feb 14 Python
python数字转对应中文的方法总结
Aug 02 Python
Python Pygame实战之塔防游戏的实现
Mar 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模板中出现空行解决方法
2011/03/08 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
PHP实现图片的等比缩放和Logo水印功能示例
2017/05/04 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
javascript中call apply 与 bind方法详解
2016/03/10 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
Python实现发送email的几种常用方法
2014/08/18 Python
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
2017/08/03 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
Python xlrd excel文件操作代码实例
2020/03/10 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
python实现横向拼接图片
2020/03/23 Python
python实现3D地图可视化
2020/03/25 Python
python如何快速拼接字符串
2020/10/28 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
《雨霖铃》教学反思
2014/02/22 职场文书
家长通知书家长评语
2014/04/17 职场文书
演讲稿格式范文
2014/05/19 职场文书
结对共建工作方案
2014/06/02 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书