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常用模块用法分析
Sep 08 Python
python 网络编程详解及简单实例
Apr 25 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
实例介绍Python中整型
Feb 11 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
Python变量访问权限控制详解
Jun 29 Python
opencv3/C++图像像素操作详解
Dec 10 Python
打印tensorflow恢复模型中所有变量与操作节点方式
May 26 Python
Django实现后台上传并显示图片功能
May 29 Python
python解包概念及实例
Feb 17 Python
PyCharm 配置SSH和SFTP连接远程服务器
May 11 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中使用PDF文档功能
2006/10/09 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP 8新特性简介
2020/08/18 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
jquery实现动态画圆
2014/12/04 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
信息滚动效果的实例讲解
2017/09/18 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
python超简单解决约瑟夫环问题
2015/05/12 Python
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
Python更新数据库脚本两种方法及对比介绍
2017/07/27 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
《学棋》教后反思
2014/04/14 职场文书
出国英文推荐信
2014/05/10 职场文书
开票员岗位职责
2015/02/12 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
Linux中sftp常用命令整理
2022/06/28 Servers