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中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
python去掉行尾的换行符方法
Jan 04 Python
Python判断变量名是否合法的方法示例
Jan 28 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
浅谈Python基础—判断和循环
Mar 22 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
Python实现AI自动抠图实例解析
Mar 05 Python
Django REST framwork的权限验证实例
Apr 02 Python
python由已知数组快速生成新数组的方法
Apr 08 Python
什么是Python包的循环导入
Sep 08 Python
使用Pytorch搭建模型的步骤
Nov 16 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
php入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
浅谈json_encode用法
2015/03/05 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
基于php编程规范(详解)
2017/08/17 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
javascript常见操作汇总
2014/09/03 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
js实现文本框输入文字个数限制代码
2015/12/25 Javascript
理解javascript模块化
2016/03/28 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
js实现键盘自动打字效果
2016/12/23 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
vue实现分页栏效果
2019/06/28 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
Python从MP3文件获取id3的方法
2015/06/15 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
python实现文件的分割与合并
2019/08/29 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
关于打架的检讨书
2014/01/17 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
工程项目建议书范文
2014/03/12 职场文书
525心理健康活动总结
2015/05/08 职场文书
电视新闻稿
2015/07/17 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书