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使用xmlrpc实例讲解
Dec 17 Python
跟老齐学Python之赋值,简单也不简单
Sep 24 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
python自动zip压缩目录的方法
Jun 28 Python
python3.5基于TCP实现文件传输
Mar 20 Python
Python开发的十个小贴士和技巧及长常犯错误
Sep 27 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 Python
Python_查看sqlite3表结构,查询语句的示例代码
Jul 17 Python
Python-opencv 双线性插值实例
Jan 17 Python
Python中zip函数如何使用
Jun 04 Python
python中get和post有什么区别
Jun 19 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脚本过滤用户上传的图片
2015/07/03 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
javascript 自定义事件初探
2009/08/21 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
用Python中的字典来处理索引统计的方法
2015/05/05 Python
Python性能提升之延迟初始化
2016/12/04 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
python 下载文件的几种方法汇总
2021/01/06 Python
施华洛世奇加拿大官网:SWAROVSKI加拿大
2018/06/03 全球购物
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
什么是反射
2012/03/17 面试题
德能勤绩廉个人总结
2015/02/14 职场文书
产品质量保证书范本
2015/02/27 职场文书
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
什么是SOLID
2022/03/24 Javascript
win7配置本地ftp服务器的图文教程
2022/08/05 Servers