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中readline判断文件读取结束的方法
Nov 08 Python
python处理按钮消息的实例详解
Jul 11 Python
python实现微信小程序自动回复
Sep 10 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
python查看数据类型的方法
Oct 12 Python
Python对wav文件的重采样实例
Feb 25 Python
Python 自由定制表格的实现示例
Mar 20 Python
Python内置函数locals和globals对比
Apr 28 Python
python解释器安装教程的方法步骤
Jul 02 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 Python
python二维图制作的实例代码
Dec 03 Python
分享Python异步爬取知乎热榜
Apr 12 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
jquery 弹出登录窗口实现代码
2009/12/24 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
JavaScript window.document的属性、方法和事件小结
2012/10/24 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
JavaScript中的Truthy和Falsy介绍
2015/01/01 Javascript
jQuery()方法的第二个参数详解
2015/04/29 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
js数组的基本使用总结
2021/01/18 Javascript
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
通过C++学习Python
2015/01/20 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
残疾人创业典型事迹
2014/02/01 职场文书
《春天来了》教学反思
2014/04/07 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
Python实现日志实时监测的示例详解
2022/04/06 Python