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中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
一些Python中的二维数组的操作方法
May 02 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
python skimage 连通性区域检测方法
Jun 21 Python
python使用turtle库与random库绘制雪花
Jun 22 Python
200行python代码实现2048游戏
Jul 17 Python
python3 实现的对象与json相互转换操作示例
Aug 17 Python
python系列 文件操作的代码
Oct 06 Python
tornado+celery的简单使用详解
Dec 21 Python
Python tempfile模块生成临时文件和临时目录
Sep 30 Python
python复合条件下的字典排序
Dec 18 Python
python热力图实现简单方法
Jan 29 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错误级别的设置方法
2013/06/17 PHP
php多文件上传实现代码
2014/02/20 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
原生js+ajax分页组件
2020/01/30 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
Python在线运行代码助手
2016/07/15 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
九年级英语教学反思
2014/01/31 职场文书
手工社团活动方案
2014/02/17 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
应届大学生自荐书
2014/06/17 职场文书
未婚证明格式
2015/06/15 职场文书