python thrift 實(shí)現(xiàn) 單端口多服務(wù)的過(guò)程
Thrift 是一種接口描述語(yǔ)言和二進(jìn)制通信協(xié)議。以前也沒(méi)接觸過(guò),最近有個(gè)項(xiàng)目需要建立自動(dòng)化測(cè)試,這個(gè)項(xiàng)目之間的微服務(wù)都是通過(guò) Thrift 進(jìn)行通信的,然后寫(xiě)自動(dòng)化腳本之前研究了一下。
需要定義一個(gè)xxx.thrift的文件, 來(lái)生成各種語(yǔ)言的代碼,生成之后我們的服務(wù)提供者和消費(fèi)者,都需要把代碼引入,服務(wù)端把代碼實(shí)現(xiàn),消費(fèi)者直接使用API的存根,直接調(diào)用。
和 http 相比,同屬于應(yīng)用層,走 tcp 協(xié)議。Thrift 優(yōu)勢(shì)在于發(fā)送同樣的數(shù)據(jù),request包 和 response包 要比 http 小很多,在整體性能上要優(yōu)于 http 。
前言
學(xué)習(xí)了兩天thrift 一直想實(shí)現(xiàn)單端口多服務(wù) 但是苦于網(wǎng)上的 thrift 實(shí)在太少 而且大部分都是java實(shí)現(xiàn)的 最后 改了一個(gè)java的 實(shí)現(xiàn)了 單端口多服務(wù)
實(shí)現(xiàn)過(guò)程
1 創(chuàng)建 thrift 文件 添加兩個(gè)服務(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
生成對(duì)應(yīng)接口 因?yàn)槲业?服務(wù)端和 用戶端 都是用 python寫(xiě)的 所以 只需要 生成python 接口即可
3 編寫(xiě) server.py
# 服務(wù)類(lèi)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ù)類(lèi)2 HelloHandler class HelloHandler: def hello(self, name): return 'hello'+name
4 編寫(xiě)服務(wù)端運(yùn)行代碼 開(kāi)啟服務(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()
用來(lái)注冊(cè)兩個(gè)服務(wù)類(lèi)
processor.registerProcessor(‘name', procress對(duì)象)
name 屬性將會(huì)在client 時(shí)用到
5運(yùn)行 runserver.py
如果出現(xiàn)Starting python server… 則運(yùn)行成功
6 編寫(xiě)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__':
# 啟動(dòng) 服務(wù)
transport = TSocket.TSocket('127.0.0.1', 8000)
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
# 注冊(cè)兩個(gè)protocol 如果想要實(shí)現(xiàn)單端口 多服務(wù) 就必須使用 TMultiplexedProtocol
transmit_protocol = TMultiplexedProtocol(protocol, 'transmit')
hello_protocol = TMultiplexedProtocol(protocol, 'hello')
# 注冊(cè)兩個(gè)客戶端
transmit_client = Transmit.Client(transmit_protocol)
hello_client = Hello_test.Client(hello_protocol)
transport.open() # 打開(kāi)鏈接
# 測(cè)試服務(wù)1
cmd = 1
token = '1111-2222-3333-4444'
data = "kong_ge"
msg = transmit_client.invoke(cmd, token, data)
print(msg)
# 測(cè)試服務(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 類(lèi) 和 TMultiplexedProtocol
但是網(wǎng)上關(guān)于 thrift python的實(shí)例 太少了 導(dǎo)致浪費(fèi)了很長(zhǎng)時(shí)間
通過(guò)這篇文章的學(xué)習(xí)很快的明白thrift 中的一些概念
到此這篇關(guān)于python thrift 實(shí)現(xiàn) 單端口多服務(wù)的過(guò)程的文章就介紹到這了,更多相關(guān)python thrift單端口多服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python thrift搭建服務(wù)端和客戶端測(cè)試程序
- python3.7通過(guò)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使用MD5加密算法對(duì)字符串進(jìn)行加密操作示例
這篇文章主要介紹了Python使用MD5加密算法對(duì)字符串進(jìn)行加密操作,結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)md5加密相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
150行Python代碼實(shí)現(xiàn)帶界面的數(shù)獨(dú)游戲
這篇文章主要介紹了150行Python代碼實(shí)現(xiàn)帶界面的數(shù)獨(dú)游戲,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python操作Sql Server 2008數(shù)據(jù)庫(kù)的方法詳解
這篇文章主要介紹了Python操作Sql Server 2008數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了Python使用pyodbc庫(kù)操作Sql Server 2008數(shù)據(jù)庫(kù)的連接、執(zhí)行sql語(yǔ)句、關(guān)閉連接等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05
python3 selenium自動(dòng)化 下拉框定位的例子
今天小編就為大家分享一篇python3 selenium自動(dòng)化 下拉框定位的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
解決python明明pip安裝成功卻找不到包的問(wèn)題
今天小編就為大家分享一篇解決python明明pip安裝成功卻找不到包的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù)
這篇文章主要介紹了Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù),主要通過(guò)三個(gè)問(wèn)題如何創(chuàng)建SQLite數(shù)據(jù)庫(kù)?如何向SQLite表中插入數(shù)據(jù)?如何查詢SQLite表中的數(shù)據(jù)?展開(kāi)文章主題詳情,需要的朋友可以參考一下2022-06-06
Python基本數(shù)據(jù)類(lèi)型及內(nèi)置方法
這篇文章主要介紹了Python基本數(shù)據(jù)類(lèi)型及內(nèi)置方法,??數(shù)據(jù)類(lèi)型是用來(lái)記錄事物狀態(tài)的,而事物的狀態(tài)是不斷變化的,下文圍繞主題展開(kāi)相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-04-04

