1. 程式人生 > >python部署thrift服務以及客戶端

python部署thrift服務以及客戶端

第一步:定義介面

檔名: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