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中运算符使用时的优先级
May 14 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
Apr 19 Python
Python 利用切片从列表中取出一部分使用的方法
Feb 01 Python
python图片二值化提高识别率代码实例
Aug 24 Python
Python 共享变量加锁、释放详解
Aug 28 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
用python实现学生管理系统
Jul 24 Python
基于Python爬取素材网站音频文件
Oct 21 Python
在python中实现导入一个需要传参的模块
May 12 Python
Django migrate报错的解决方案
May 20 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
May 20 Python
virtualenv隔离Python环境的问题解析
Jun 21 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
PHP5/ZendEngine2的改进
2006/10/09 PHP
PHP中动态HTML的输出技术
2006/10/09 PHP
MySQL修改密码方法总结
2008/03/25 PHP
php csv操作类代码
2009/12/14 PHP
ecshop 订单确认中显示省市地址信息的方法
2010/03/15 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
Using the TextRange Object
2006/10/14 Javascript
js验证表单大全
2006/11/25 Javascript
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
Python字符串切片操作知识详解
2016/03/28 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
Python2与Python3的区别详解
2020/02/09 Python
django教程如何自学
2020/07/31 Python
期末总结的个人自我评价
2013/11/02 职场文书
优秀团员事迹材料1000字
2014/08/20 职场文书
合理化建议书范文
2015/09/14 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
python代码实现备忘录案例讲解
2021/07/26 Python