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爬虫入门教程之糗百图片爬虫代码分享
Sep 02 Python
Python中MYSQLdb出现乱码的解决方法
Oct 11 Python
Python中用post、get方式提交数据的方法示例
Sep 22 Python
Python 输入一个数字判断成绩分数等级的方法
Nov 15 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
python tkinter控件布局项目实例
Nov 04 Python
python实现从wind导入数据
Dec 03 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
Jan 06 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 Python
Python 如何反方向迭代一个序列
Jul 28 Python
python 字符串格式化的示例
Sep 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
对javascript和select部件的结合运用
2006/10/09 PHP
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
PHP Socket 编程
2010/04/09 PHP
PHP缩略图等比例无损压缩,可填充空白区域补充色
2011/06/10 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
2016/09/27 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
详解python的ORM中Pony用法
2018/02/09 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
django数据库自动重连的方法实例
2019/07/21 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
关于Keras Dense层整理
2020/05/21 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
社会学专业求职信
2014/02/24 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android