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 递归函数详解及实例
Dec 27 Python
python 内置函数filter
Jun 01 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
flask框架json数据的拿取和返回操作示例
Nov 28 Python
numpy创建单位矩阵和对角矩阵的实例
Nov 29 Python
解决python3插入mysql时内容带有引号的问题
Mar 02 Python
深入浅析Python代码规范性检测
Jul 31 Python
python3使用diagrams绘制架构图的步骤
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
PHP的拦截器实例分析
2014/11/03 PHP
浅谈php命令行用法
2015/02/04 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
jQuery 树形结构的选择器
2010/02/15 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
JavaScript实现带播放列表的音乐播放器实例分享
2016/03/07 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
windows下Virtualenvwrapper安装教程
2017/12/13 Python
在pandas中一次性删除dataframe的多个列方法
2018/04/10 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
自荐书范文
2013/12/08 职场文书
《兰亭集序》教学反思
2014/02/11 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
2014年妇委会工作总结
2014/12/10 职场文书
家庭贫困证明
2015/06/16 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书