python thrift 實(shí)現(xiàn) 單端口多服務(wù)的過程
Thrift 是一種接口描述語言和二進(jìn)制通信協(xié)議。以前也沒接觸過,最近有個項(xiàng)目需要建立自動化測試,這個項(xiàng)目之間的微服務(wù)都是通過 Thrift 進(jìn)行通信的,然后寫自動化腳本之前研究了一下。
需要定義一個xxx.thrift的文件, 來生成各種語言的代碼,生成之后我們的服務(wù)提供者和消費(fèi)者,都需要把代碼引入,服務(wù)端把代碼實(shí)現(xiàn),消費(fèi)者直接使用API的存根,直接調(diào)用。
和 http 相比,同屬于應(yīng)用層,走 tcp 協(xié)議。Thrift 優(yōu)勢在于發(fā)送同樣的數(shù)據(jù),request包 和 response包 要比 http 小很多,在整體性能上要優(yōu)于 http 。
前言
學(xué)習(xí)了兩天thrift 一直想實(shí)現(xiàn)單端口多服務(wù) 但是苦于網(wǎng)上的 thrift 實(shí)在太少 而且大部分都是java實(shí)現(xiàn)的 最后 改了一個java的 實(shí)現(xiàn)了 單端口多服務(wù)
實(shí)現(xiàn)過程
1 創(chuàng)建 thrift 文件 添加兩個服務(wù) 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 運(yùn)行 thrift.exe -out gen-py --gen py test.thrift
生成對應(yīng)接口 因?yàn)槲业?服務(wù)端和 用戶端 都是用 python寫的 所以 只需要 生成python 接口即可
3 編寫 server.py
# 服務(wù)類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不匹配'
# 服務(wù)類2 HelloHandler class HelloHandler: def hello(self, name): return 'hello'+name
4 編寫服務(wù)端運(yùn)行代碼 開啟服務(wù)端
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 # 導(dǎo)入 from thrift.TMultiplexedProcessor import TMultiplexedProcessor from TransmitHandler_server import TransmitHandler from Hello_server import HelloHandler # open server if __name__ == "__main__": # 實(shí)現(xiàn) 單端口 多服務(wù) 的方法 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()
值得注意的是 要想實(shí)現(xiàn)單端口 多服務(wù) 就必須得
引入processor = TMultiplexedProcessor()
用來注冊兩個服務(wù)類
processor.registerProcessor(‘name', procress對象)
name 屬性將會在client 時(shí)用到
5運(yùn)行 runserver.py
如果出現(xiàn)Starting python server… 則運(yùn)行成功
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__': # 啟動 服務(wù) transport = TSocket.TSocket('127.0.0.1', 8000) transport = TTransport.TBufferedTransport(transport) protocol = TBinaryProtocol.TBinaryProtocol(transport) # 注冊兩個protocol 如果想要實(shí)現(xiàn)單端口 多服務(wù) 就必須使用 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() # 打開鏈接 # 測試服務(wù)1 cmd = 1 token = '1111-2222-3333-4444' data = "kong_ge" msg = transmit_client.invoke(cmd, token, data) print(msg) # 測試服務(wù)2 name = '孔格' msg2 = hello_client.hello(name) print(msg2) # 關(guān)閉 transport.close()
7運(yùn)行client
觀察結(jié)果 實(shí)現(xiàn)單端口多服務(wù)
總結(jié)
核心就是 TMultiplexedProcessor 類 和 TMultiplexedProtocol
但是網(wǎng)上關(guān)于 thrift python的實(shí)例 太少了 導(dǎo)致浪費(fèi)了很長時(shí)間
通過這篇文章的學(xué)習(xí)很快的明白thrift 中的一些概念
到此這篇關(guān)于python thrift 實(shí)現(xiàn) 單端口多服務(wù)的過程的文章就介紹到這了,更多相關(guān)python thrift單端口多服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python thrift搭建服務(wù)端和客戶端測試程序
- python3.7通過thrift操作hbase的示例代碼
- python使用thrift教程的方法示例
- python利用thrift服務(wù)讀取hbase數(shù)據(jù)的方法
- python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù))
- Python連接Java Socket服務(wù)端的實(shí)現(xiàn)方法
- python 實(shí)現(xiàn)客戶端與服務(wù)端的通信
- python網(wǎng)絡(luò)編程socket實(shí)現(xiàn)服務(wù)端、客戶端操作詳解
- Python Websocket服務(wù)端通信的使用示例
- python實(shí)現(xiàn)Thrift服務(wù)端的方法
相關(guān)文章
python內(nèi)存監(jiān)控工具memory_profiler和guppy的用法詳解
這篇文章主要介紹了python內(nèi)存監(jiān)控工具memory_profiler和guppy的用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Python處理不同接口間參數(shù)依賴的方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫接口自動化測試,以有效地處理不同接口之間的參數(shù)依賴,并提供豐富的示例代碼,希望對大家有所幫助2024-01-01python networkx 根據(jù)圖的權(quán)重畫圖實(shí)現(xiàn)
這篇文章主要介紹了python networkx 根據(jù)圖的權(quán)重畫圖實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07pytest實(shí)現(xiàn)多種調(diào)用方式
pytest是一個非常成熟的全功能的Python測試框架,本文主要介紹了pytest多種調(diào)用方式,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12Python實(shí)現(xiàn)的中國剩余定理算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)的中國剩余定理算法,結(jié)合實(shí)例形式分析了中國剩余定理的概念、原理及具體算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08Python的Tornado框架實(shí)現(xiàn)圖片上傳及圖片大小修改功能
Tornado是一個異步的Python Web開發(fā)框架,同時(shí)也是一個優(yōu)秀的異步服務(wù)器開發(fā)庫,這里我們將來講解一下Python的Tornado框架實(shí)現(xiàn)圖片上傳及圖片大小修改功能方面的一些重點(diǎn):2016-06-06Python簡單實(shí)現(xiàn)查找一個字符串中最長不重復(fù)子串的方法
這篇文章主要介紹了Python簡單實(shí)現(xiàn)查找一個字符串中最長不重復(fù)子串的方法,涉及Python針對字符串的簡單遍歷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03Python實(shí)現(xiàn)圖片格式轉(zhuǎn)換
經(jīng)常會遇到圖片格式需要轉(zhuǎn)換的情況,這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)圖片格式轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì)、實(shí)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Python使用Selenium模塊實(shí)現(xiàn)模擬瀏覽器抓取淘寶商品美食信息功能示例
這篇文章主要介紹了Python使用Selenium模塊實(shí)現(xiàn)模擬瀏覽器抓取淘寶商品美食信息功能,涉及Python基于re模塊的正則匹配及selenium模塊的頁面抓取等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07