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 list转dict示例分享
Jan 28 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
python复制文件到指定目录的实例
Apr 27 Python
Python读写及备份oracle数据库操作示例
May 17 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
Oct 09 Python
python实现将视频按帧读取到自定义目录
Dec 10 Python
tensorflow 查看梯度方式
Feb 04 Python
Python参数传递对象的引用原理解析
May 22 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 Python
Python实现小黑屋游戏的完整实例
Jan 06 Python
python excel和yaml文件的读取封装
Jan 12 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实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
apache配置虚拟主机的方法详解
2013/06/17 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
jQuery库与其他JS库冲突的解决办法
2010/02/07 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
2015/08/21 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
JS实现复制功能
2017/03/01 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
vue+element实现表格新增、编辑、删除功能
2019/05/28 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
简述Python中的面向对象编程的概念
2015/04/27 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
TensorFlow实现Logistic回归
2018/09/07 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
违反课堂纪律检讨书
2014/01/19 职场文书
文明演讲稿范文
2014/05/12 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
购房委托书
2014/10/15 职场文书
2016年春节问候语
2015/11/11 职场文书
技术转让协议书
2016/03/19 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
如何优化vue打包文件过大
2022/04/13 Vue.js