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使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 Python
Python Socket传输文件示例
Jan 16 Python
用tensorflow构建线性回归模型的示例代码
Mar 05 Python
Python将一个Excel拆分为多个Excel
Nov 07 Python
Python flask框架post接口调用示例
Jul 03 Python
PIL对上传到Django的图片进行处理并保存的实例
Aug 07 Python
python logging添加filter教程
Dec 24 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
教你怎么用Python实现GIF动图的提取及合成
Jun 15 Python
如何在Python中妥善使用进度条详解
Apr 05 Python
python处理json数据文件
Apr 11 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 4.2书写安全的脚本
2006/10/09 PHP
PHP 用数组降低程序的时间复杂度
2009/12/04 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
jquery统计输入文字的个数并对其进行判断
2014/01/07 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
Python实现的简单万年历例子分享
2014/04/25 Python
Python中的Numpy入门教程
2014/04/26 Python
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
Python time库基本使用方法分析
2019/12/13 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
美国Lolё官网:购买大胆而美丽的女性运动服装
2017/05/22 全球购物
关于Java String的一道面试题
2013/09/29 面试题
大专学生推荐信范文
2013/11/19 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
电子商务网站的创业计划书
2014/01/05 职场文书
酒鬼酒广告词
2014/03/21 职场文书
《画》教学反思
2014/04/14 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
实习科室评语
2015/01/04 职场文书