RPC之thrift-簡單demo

Thrift簡介

Apache thrift是一個軟件框架,目的是提供可伸縮、跨語言的服務(wù)開發(fā)来吩,連接code棧和code引擎來創(chuàng)建高效的,無縫連接的服務(wù)蔽莱,無論在何種主流的開發(fā)語言之中弟疆。

Getting started
1.下載Apache thrift,downloada copy of Thrift.

  1. 編譯安裝Apache thrift 編譯器-See the installing Thriftguide
  2. 編寫一個a.thrift文件
    使用接口文件定義一個自己的thrift文件盗冷,根據(jù)這個文件我們可以使用thrift編譯器生成clients和server端代碼
    <pre class="cjk">thrift --gen <language> <Thrift filename></pre>
  3. 根據(jù)生成的文件可以開發(fā)rpc服務(wù)

具體demo參見附錄

Thrift 網(wǎng)絡(luò)棧

+-------------------------------------------+
| Server |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+

  • Transport
    傳輸層為R/W網(wǎng)絡(luò)提供簡單的抽象怠苔,是得thrift和底層傳輸層解耦。
    transport接口函數(shù)主要有如下:

open
close
read
write
flush

ServerTransport有:

open
listen
accept
close

也支持其他傳輸協(xié)議:

file:文件讀寫
http: 網(wǎng)絡(luò)

  • Protocol
    協(xié)議定義了一種內(nèi)存數(shù)據(jù)結(jié)構(gòu)和讀寫格式之間的映射機制仪糖,可以將數(shù)據(jù)字節(jié)流編碼或者解碼:
    binary: Fairly simple binary encoding -- the length and type of a field are encoded as bytes followed by the actual value of the field.
    compact: Described in THRIFT-110
    json
  • Processor
    處理器具有讀寫數(shù)據(jù)的能力

interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}

  • Server
    A Server pulls together all of the various features described above:

Create a transport
Create input/output protocols for the transport
Create a processor based on the input/output protocols
Wait for incoming connections and hand them off to the processor

附錄:

https://thrift.apache.org/docs/
一個簡單的thrift服務(wù)demo(python 2 )

testService.thrift

service TestService {
/*print hello world*/
string say(1: required string something),

/*sum func*/
i64 calc(1:required i64 larg, 2:required i64 rarg),
}

test_client.py

# coding=utf-8
from testService import TestService
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
def main():
  transport = TSocket.TSocket("127.0.0.1", 9090)
  transport = TTransport.TBufferedTransport(transport)
  protocol = TBinaryProtocol.TBinaryProtocol(transport)
  client = TestService.Client(protocol)
  transport.open()
  print client.say("hahaha")
  print client.calc(100, 90)
  transport.close()

if __name__ == "__main__":
  main()

test_server.py

# coding=utf-8
import sys
import logging
from testService import TestService
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
logger = logging.getLogger(name="test_server")

class TestServiceHandler:
  def say(self, something):
  logging.info(something)
    return "hello world, %s" % something
def calc(self, larg, rarg):
  return larg + rarg

if __name__ == "__main__":
  logging.basicConfig(stream=sys.stdout, level=logging.INFO,
  format='%(asctime)s %(levelno)s %(message)s',
  datefmt='%Y-%m-%d %H:%M:%S',
  )
  try:
    handler = TestServiceHandler()
    processor = TestService.Processor(handler)
    transport = TSocket.TServerSocket(host="127.0.0.1", port=9090)
    tfactory = TTransport.TBufferedTransportFactory()
    pfactory = TBinaryProtocol.TBinaryProtocolFactory()\
    server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
    print "server starting..."
    server.serve()
    print "server done."
  except Exception as e:
    logging.exception(e)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柑司,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锅劝,更是在濱河造成了極大的恐慌攒驰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件故爵,死亡現(xiàn)場離奇詭異玻粪,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門劲室,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伦仍,“玉大人,你說我怎么就攤上這事很洋〕淅叮” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵喉磁,是天一觀的道長谓苟。 經(jīng)常有香客問我,道長线定,這世上最難降的妖魔是什么娜谊? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮斤讥,結(jié)果婚禮上纱皆,老公的妹妹穿的比我還像新娘。我一直安慰自己芭商,他們只是感情好派草,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铛楣,像睡著了一般近迁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上簸州,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天鉴竭,我揣著相機與錄音,去河邊找鬼岸浑。 笑死搏存,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的矢洲。 我是一名探鬼主播璧眠,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼读虏!你這毒婦竟也來了责静?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤盖桥,失蹤者是張志新(化名)和其女友劉穎灾螃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揩徊,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡睦焕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年藐握,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垃喊。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖袜炕,靈堂內(nèi)的尸體忽然破棺而出本谜,到底是詐尸還是另有隱情,我是刑警寧澤偎窘,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布乌助,位于F島的核電站,受9級特大地震影響陌知,放射性物質(zhì)發(fā)生泄漏他托。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一仆葡、第九天 我趴在偏房一處隱蔽的房頂上張望赏参。 院中可真熱鬧,春花似錦沿盅、人聲如沸把篓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽韧掩。三九已至,卻和暖如春窖铡,著一層夾襖步出監(jiān)牢的瞬間疗锐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工费彼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滑臊,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓敌买,卻偏偏與公主長得像简珠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虹钮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345