python thrift 实现 单端口多服务的过程


Posted in Python onJune 08, 2020

Thrift 是一种接口描述语言和二进制通信协议。以前也没接触过,最近有个项目需要建立自动化测试,这个项目之间的微服务都是通过 Thrift 进行通信的,然后写自动化脚本之前研究了一下。

需要定义一个xxx.thrift的文件, 来生成各种语言的代码,生成之后我们的服务提供者和消费者,都需要把代码引入,服务端把代码实现,消费者直接使用API的存根,直接调用。

和 http 相比,同属于应用层,走 tcp 协议。Thrift 优势在于发送同样的数据,request包 和 response包 要比 http 小很多,在整体性能上要优于 http 。

前言

学习了两天thrift 一直想实现单端口多服务 但是苦于网上的 thrift 实在太少 而且大部分都是java实现的 最后 改了一个java的 实现了 单端口多服务

实现过程

1 创建 thrift 文件 添加两个服务 Transmit Hello_test

service Transmit {
string invoke(1:i32 cmd 2:string token 3:string data)
}

service Hello_test {
string hello(1: string name)
}

2 运行 thrift.exe -out gen-py --gen py test.thrift

生成对应接口 因为我的 服务端和 用户端 都是用 python写的 所以 只需要 生成python 接口即可

3 编写 server.py

# 服务类1 TransmitHandler
class TransmitHandler:
 def __init__(self):
  self.log = {}

 def invoke(self, cmd, token, data):
  cmd = cmd
  token = token
  data = data
  if cmd == 1:
	  return data + 'and' + token
  else:
   return 'cmd不匹配'
# 服务类2 HelloHandler
class HelloHandler:
	def hello(self, name):
		return 'hello'+name

4 编写服务端运行代码 开启服务端

from test import Transmit
from test import Hello_test

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
# 导入
from thrift.TMultiplexedProcessor import TMultiplexedProcessor
from TransmitHandler_server import TransmitHandler
from Hello_server import HelloHandler


# open server
if __name__ == "__main__":
 # 实现 单端口 多服务 的方法

 transmit_handler = TransmitHandler()
 transmit_processor = Transmit.Processor(transmit_handler)

 hello_handler = HelloHandler()
 hello_processor = Hello_test.Processor(hello_handler)

 transport = TSocket.TServerSocket('127.0.0.1', 8000)
 tfactory = TTransport.TBufferedTransportFactory()
 pfactory = TBinaryProtocol.TBinaryProtocolFactory()
 # 多 processor
 processor = TMultiplexedProcessor()
 processor.registerProcessor('transmit', transmit_processor)
 processor.registerProcessor('hello', hello_processor)

 server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
 print("Starting python server...")
 server.serve()

值得注意的是 要想实现单端口 多服务 就必须得
引入processor = TMultiplexedProcessor()
用来注册两个服务类
processor.registerProcessor(‘name', procress对象)
name 属性将会在client 时用到

5运行 runserver.py

如果出现Starting python server… 则运行成功

6 编写client.py

from test import Transmit
from test import Hello_test
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.protocol.TMultiplexedProtocol import TMultiplexedProtocol


if __name__ == '__main__':
	# 启动 服务
	transport = TSocket.TSocket('127.0.0.1', 8000)
	transport = TTransport.TBufferedTransport(transport)
	protocol = TBinaryProtocol.TBinaryProtocol(transport)

	# 注册两个protocol 如果想要实现单端口 多服务 就必须使用 TMultiplexedProtocol
	transmit_protocol = TMultiplexedProtocol(protocol, 'transmit')
	hello_protocol = TMultiplexedProtocol(protocol, 'hello')

	# 注册两个客户端
	transmit_client = Transmit.Client(transmit_protocol)
	hello_client = Hello_test.Client(hello_protocol)

	transport.open() # 打开链接
	
	# 测试服务1
	cmd = 1
	token = '1111-2222-3333-4444'
	data = "kong_ge"
	msg = transmit_client.invoke(cmd, token, data)
	print(msg)
	
	# 测试服务2
	name = '孔格'
	msg2 = hello_client.hello(name)
	print(msg2)
	
	# 关闭
	transport.close()

7运行client

观察结果 实现单端口多服务

总结

核心就是 TMultiplexedProcessor 类 和 TMultiplexedProtocol
但是网上关于 thrift python的实例 太少了 导致浪费了很长时间
通过这篇文章的学习很快的明白thrift 中的一些概念

到此这篇关于python thrift 实现 单端口多服务的过程的文章就介绍到这了,更多相关python thrift单端口多服务内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python持久性管理pickle模块详细介绍
Feb 18 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
Jan 16 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
对Python实现简单的API接口实例讲解
Dec 10 Python
python+selenium实现QQ邮箱自动发送功能
Jan 23 Python
Python3删除排序数组中重复项的方法分析
Jan 31 Python
python使用phoenixdb操作hbase的方法示例
Feb 28 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
python库matplotlib绘制坐标图
Oct 18 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
在PyTorch中使用标签平滑正则化的问题
Apr 03 Python
python3 logging日志封装实例
Apr 08 Python
Python astype(np.float)函数使用方法解析
Jun 08 #Python
python opencv 实现读取、显示、写入图像的方法
Jun 08 #Python
python:删除离群值操作(每一行为一类数据)
Jun 08 #Python
pyecharts在数据可视化中的应用详解
Jun 08 #Python
python numpy实现rolling滚动案例
Jun 08 #Python
Python如何向SQLServer存储二进制图片
Jun 08 #Python
python求numpy中array按列非零元素的平均值案例
Jun 08 #Python
You might like
第五节 克隆 [5]
2006/10/09 PHP
PHP base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
php动态生成JavaScript代码
2009/03/09 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
简单介绍Ruby中的CGI编程
2015/04/10 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
python读写csv文件实例代码
2019/07/05 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
python脚本后台执行方式
2019/12/21 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
如何用Django处理gzip数据流
2021/01/29 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
品质主管岗位职责
2014/03/16 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
Vue的生命周期一起来看看
2022/02/24 Vue.js
Java Spring读取和存储详细操作
2022/08/05 Java/Android