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字符串中查找子串小技巧
Apr 10 Python
Python获取邮件地址的方法
Jul 10 Python
python实现自动登录后台管理系统
Oct 18 Python
python调用c++传递数组的实例
Feb 13 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
使用Fabric自动化部署Django项目的实现
Sep 27 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
May 24 Python
virtualenv介绍及简明教程
Jun 23 Python
如何在mac下配置python虚拟环境
Jul 06 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
python生成随机数、随机字符、随机字符串
Apr 06 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
Banner程序
2006/10/09 PHP
9个比较实用的php代码片段
2016/03/15 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
JavaScript使用cookie
2007/02/02 Javascript
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
封装好的省市地区联动控件附下载
2007/08/13 Javascript
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
vue+webpack中配置ESLint
2018/11/07 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
Vue基础配置讲解
2019/11/29 Javascript
vue el-tree 默认展开第一个节点的实现代码
2020/05/15 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
在python中使用nohup命令说明
2020/04/16 Python
如何在pycharm中安装第三方包
2020/10/27 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
安全承诺书范文
2014/03/26 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
党建工作整改措施
2014/10/28 职场文书
西岭雪山导游词
2015/02/06 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
新闻稿标题
2015/07/18 职场文书
高中议论文(范文2篇)
2019/08/19 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书