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函数缺省值与引用学习笔记分享
Feb 10 Python
python中精确输出JSON浮点数的方法
Apr 18 Python
python write无法写入文件的解决方法
Jan 23 Python
深入解析Python小白学习【操作列表】
Mar 23 Python
Django框架首页和登录页分离操作示例
May 28 Python
python实现基于朴素贝叶斯的垃圾分类算法
Jul 09 Python
Python 读取用户指令和格式化打印实现解析
Sep 02 Python
python 计算积分图和haar特征的实例代码
Nov 20 Python
使用python远程操作linux过程解析
Dec 04 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
python3 os进行嵌套操作的实例讲解
Nov 19 Python
python如何读取和存储dict()与.json格式文件
Jun 25 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
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
php配合jquery实现增删操作具体实例
2013/12/12 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
Draggable Elements 元素拖拽功能实现代码
2011/03/30 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
AngularJS实现表单验证
2015/01/28 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
Python获取当前时间的方法
2014/01/14 Python
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
win10系统中安装scrapy-1.1
2016/07/03 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
Python通过socketserver处理多个链接
2020/03/18 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
详解python中的闭包
2020/09/07 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
CSS3 文字动画效果
2020/11/12 HTML / CSS
敬老文明号事迹材料
2014/01/16 职场文书
读书月活动方案
2014/05/22 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL