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中的ConfigParser模块使用详解
May 04 Python
Python文件操作基本流程代码实例
Dec 11 Python
基于python list对象中嵌套元组使用sort时的排序方法
Apr 18 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
对PyQt5的输入对话框使用(QInputDialog)详解
Jun 25 Python
pandas 层次化索引的实现方法
Jul 06 Python
对python 中re.sub,replace(),strip()的区别详解
Jul 22 Python
基于python解线性矩阵方程(numpy中的matrix类)
Oct 21 Python
numpy:找到指定元素的索引示例
Nov 26 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
从python读取sql的实例方法
Jul 21 Python
python scrapy简单模拟登录的代码分析
Jul 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
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
js Dialog 实践分享
2012/10/22 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
React组件内事件传参实现tab切换的示例代码
2018/07/04 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
scrapy-redis的安装部署步骤讲解
2019/02/27 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
Django celery异步任务实现代码示例
2020/11/26 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
秘书英文求职信范文
2014/01/31 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技