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使用urllib2模块抓取HTML页面资源的实例分享
May 03 Python
Python正规则表达式学习指南
Aug 02 Python
Apache如何部署django项目
May 21 Python
python 读取鼠标点击坐标的实例
Dec 29 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
python多线程http压力测试脚本
Jun 25 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
学习Python需要哪些工具
Sep 04 Python
linux系统下pip升级报错的解决方法
Jan 31 Python
Python与C/C++的相互调用案例
Mar 04 Python
Python字符串对齐方法使用(ljust()、rjust()和center())
Apr 26 Python
Python中的datetime包与time包包和模块详情
Feb 28 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中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
PHP实现无限极分类图文教程
2014/11/25 PHP
ThinkPHP 404页面的设置方法
2015/01/14 PHP
简单谈谈php延迟静态绑定
2016/01/26 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
Mootools 1.2教程 事件处理
2009/09/15 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
javascript实现简单查找与替换的方法
2015/07/22 Javascript
JavaScript中Window对象的属性及事件
2015/12/25 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
详解js类型判断
2018/05/22 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
2020/11/12 Javascript
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
Python实现提取文章摘要的方法
2015/04/21 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
Python错误的处理方法
2020/06/23 Python
Python中Selenium库使用教程详解
2020/07/23 Python
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
shell程序中如何注释
2012/01/28 面试题
工程项目经理岗位职责
2013/12/15 职场文书
网上卖盒饭创业计划书范文
2014/02/07 职场文书
党日活动总结
2014/05/07 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
个人简历自我评价怎么写
2015/03/10 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS