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 将字符串转换成字典dict
Mar 24 Python
Python中optionParser模块的使用方法实例教程
Aug 29 Python
在Python下进行UDP网络编程的教程
Apr 29 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
python实现C4.5决策树算法
Aug 29 Python
详解python:time模块用法
Mar 25 Python
Pandas之DataFrame对象的列和索引之间的转化
Jun 25 Python
Django Rest framework认证组件详细用法
Jul 25 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
Aug 31 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
python 协程 gevent原理与用法分析
Nov 22 Python
python pygame实现挡板弹球游戏
Nov 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数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
javaScript同意等待代码实现心得
2011/01/01 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
vue之延时刷新实例
2019/11/14 Javascript
高效jQuery选择器的5个技巧实例分析
2019/11/26 jQuery
js面向对象之实现淘宝放大镜
2020/01/15 Javascript
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
用python制作游戏外挂
2018/01/04 Python
Python将列表数据写入文件(txt, csv,excel)
2019/04/03 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
保护环境倡议书
2014/04/14 职场文书
小学一年级学生评语
2014/04/22 职场文书
教师师德表现自我评价
2015/03/05 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
公司总经理岗位职责
2015/04/01 职场文书