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 mysqldb连接数据库
Mar 16 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
python距离测量的方法
Mar 06 Python
wxpython实现图书管理系统
Mar 12 Python
python随机取list中的元素方法
Apr 08 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
Python任意字符串转16, 32, 64进制的方法
Jun 12 Python
python elasticsearch从创建索引到写入数据的全过程
Aug 04 Python
使用python写的opencv实时监测和解析二维码和条形码
Aug 14 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
Jul 07 Python
python多线程爬取西刺代理的示例代码
Jan 30 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 可阅读随机字符串代码
2010/05/26 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
php写的AES加密解密类分享
2014/06/20 PHP
destoon常用的安全设置概述
2014/06/21 PHP
PHP 接入微信扫码支付总结(总结篇)
2016/11/03 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
AngularJs  unit-testing(单元测试)详解
2016/09/02 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
Django中login_required装饰器的深入介绍
2017/11/24 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
实习自我鉴定模板
2013/09/28 职场文书
园林设计师自荐信
2013/11/18 职场文书
教师求职推荐信范文
2013/11/20 职场文书
宣传普通话标语
2014/06/27 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
门面房租房协议书
2014/12/01 职场文书
校车司机安全责任书
2015/05/11 职场文书
2019公司管理制度
2019/04/19 职场文书
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL