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 02 Python
Python文件和目录操作详解
Feb 08 Python
python编写爬虫小程序
May 14 Python
Python虚拟环境Virtualenv使用教程
May 18 Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
使用Python编写Prometheus监控的方法
Oct 15 Python
python实现抠图给证件照换背景源码
Aug 20 Python
如何用python免费看美剧
Aug 11 Python
Python调用JavaScript代码的方法
Oct 27 Python
Python实战之OpenCV实现猫脸检测
Jun 26 Python
Python Django获取URL中的数据详解
Nov 01 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开启安全模式后禁用的函数集合
2011/06/26 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
2012/07/16 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
BootStrap智能表单demo示例详解
2016/06/13 Javascript
AngularJS 模型详细介绍及实例代码
2016/07/27 Javascript
js实现股票实时刷新数据案例
2017/05/14 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
解析Python中的二进制位运算符
2015/05/13 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
python selenium 查找隐藏元素 自动播放视频功能
2019/07/24 Python
详解python内置模块urllib
2020/09/09 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
中专生职业生涯规划书范文
2014/01/10 职场文书
Python制作动态字符画的源码
2021/08/04 Python
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python