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最长公共子串算法实例
Mar 07 Python
python中zip和unzip数据的方法
May 27 Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 Python
使用python实现生成用户信息
Mar 20 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
python实现静态服务器
Sep 05 Python
浅谈Keras中shuffle和validation_split的顺序
Jun 19 Python
Python全局变量与global关键字常见错误解决方案
Oct 05 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 Python
next在python中返回迭代器的实例方法
Dec 15 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
玩转虚拟域名◎+ .
2006/10/09 PHP
探讨php中防止SQL注入最好的方法是什么
2013/06/10 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
2010/09/14 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
2015/01/02 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
Python中使用Queue和Condition进行线程同步的方法
2016/01/19 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
Python yield 使用方法浅析
2017/05/20 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
python enumerate内置函数用法总结
2020/01/07 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
后勤人员自我鉴定
2013/10/20 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
企业宣传工作方案
2014/06/02 职场文书
服装设计专业自荐信
2014/06/17 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
立春观后感
2015/06/18 职场文书
安全第一课观后感
2015/06/18 职场文书
解决golang结构体tag编译错误的问题
2021/05/02 Golang