python部署thrift服務以及客戶端
阿新 • • 發佈:2019-01-01
第一步:定義介面
檔名:parse.thrift
內容如下:
service Parse {
string parseHtml2Xml(1:string html)
}
第二步:在thrift介面所在目錄執行thrift命令
# thrift --gen py parse.thrift
這步會在當前目錄生成gen-py資料夾
如果是用php,則用如下命令:
服務端:thrift --gen php:server helloworld.thrift
客戶端:thrift --gen php:client helloworld.thrift
如果是用java,則用如下命令:
Linux環境:thrift --gen java importservice.thrift
windows環境: thrift-0.9.3.exe --gen java importservice.thrift
要注意的是,服務端和客戶端使用的thrift版本要保持一致第三步: server服務的開發,檔名,server.py
import sys sys.path.append("./gen-py/parse") from Parse import * from ttypes import * from thrift.Thrift import TType, TMessageType, TException from thrift.Thrift import TProcessor from thrift.transport import TSocket from thrift.protocol import TBinaryProtocol, TProtocol from thrift.server import TServer import logging from constants import *
可在服務中定義日誌模組,記錄日誌資訊
logging.basicConfig(filename='logger.log', level=logging.INFO, format='%(asctime)s %(filename)s : %(levelname)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
真正的服務程式碼
class ParseHandler: def parseHtml2Xml(self, html): logging.info("start parse html") return "1234"
def run():
#建立服務端
handler = ParseHandler()
processor = Processor(handler)
#監聽埠
transport = TSocket.TServerSocket('localhost', 9234)
#選擇傳輸層
tfactory = TTransport.TBufferedTransportFactory()
#選擇傳輸協議
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
#建立服務端
server = TServer.TThreadPoolServer(processor, transport, tfactory, pfactory)
server.setNumThreads(5)
logging.info('start thrift serve in python')
server.serve()
logging.info('done!')
if __name__ == '__main__':
run()
第四步:啟動python服務
# python server.py
第五步: client客戶端的開發,客戶端檔名為client.py
import sys
sys.path.append('./gen-py/parse')
from Parse import *
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
import requests
try:
transport = TSocket.TSocket('localhost', 9234)
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = Client(protocol)
transport.open()
print 'start'
res = requests.get('http://baike.baidu.com/item/%E7%A2%A7%E6%A1%82%E5%9B%AD%E5%98%89%E8%AA%89/19775381')
xml = client.parseHtml2Xml(res.content)
print xml
transport.close()
except Thrift.TException as e:
print 'exceptino'
print e
第六步: 啟動客戶端呼叫
# python client.py
下面是一個thrift檔案的case
service ImportService {
//單個匯入
string singleImport(1:string url, 2:list<string> importModule, 3:i64 authorId)
//批量新增匯入
string batchCreateImport(1:list<string> urls, 2:list<string> importModule, 3:i64 authorId)
//批量覆蓋匯入
string batchCoverImport(1:list<string> urls, 2:list<string> importModule, 3:i64 authorId)
//檢查相似度
string checkSimilarity(1:string url, 2:list<string> importModule)
//檢查詞條狀態
string checkLemmaStatus(1:string url)
//批量匯入時獲取匯入進度
string getImportProcess(1:i64 authorId)
}
在thrift中,i32表示整型int,i64表示長整型long