php和java之thrift

java和php使用thrift

  1. RPC:遠程過程調(diào)用協(xié)議雪营,它是一種通過網(wǎng)絡(luò)從遠程計算機程序上請求服務(wù)的方式.RPC采用客戶機/服務(wù)器模式。請求程序就是一個客戶機颗搂,而服務(wù)提供程序就是一個服務(wù)器敷搪。

  2. thrift:Apache Thrift 是 Facebook 實現(xiàn)的一種高效的、支持多種編程語言的遠程服務(wù)調(diào)用的框架斩例。一種RPC框架。

    • 可以跨語言相互調(diào)用从橘,比如java調(diào)用php念赶。
    • 使用的4層網(wǎng)絡(luò)模型础钠。http是7層網(wǎng)絡(luò)模型。
    • 速度比http要快叉谜。

demo:

首先安裝thrift:
brew install thrift
文件目錄說明:

目錄.png

client目錄:

   JavaClient:php調(diào)用java的client端

  PhpClient: php實現(xiàn)的client端旗吁。(php寫的server端)

thrift:目錄:

test.thrift 生成的client端通信協(xié)議文件

lib目錄:依賴的thrift的包

server目錄:

 thrift:  test.thrift 生成的server端的通信協(xié)議文件

 TestServer.php  php實現(xiàn)的server端

 runserver.py  監(jiān)控端口

 java項目地址:http://pan.baidu.com/s/1c4zE7G

  php項目地址:http://pan.baidu.com/s/1geD2FTL

3.通信協(xié)議的定義:文件名:test.thfit

  //查詢

 namespace java thrift.service  //生成java時是報名

 namespace php thrift.service    //生成的php的文件路徑

 const string version = "1.0.0"

service TestService {    //類名

 // 獲取版本號

 string getServiceVersion();

 //方法

  string getData(1:string str,2:i32 id);    //通信協(xié)議,傳的參數(shù)是字符串和整型停局,返回字符   串很钓。

}

4.java作為server端,php和java作為客戶端

 java通過thrift生成通信協(xié)議的文件董栽。

 thrfit --gen java test.thrfit

  (1)server端

        實現(xiàn)thrift通信協(xié)議      

得到打點值.png

server啟動端口:
72fa725d-33e9-4c57-9bdd-d501d170f621-image.png

java作為clent:
9133f3f2-7a32-42e6-b57e-1892c635f54d-image.png

php作為client:

    (1)首先要生成php的客戶端的通信文件:  

          thrift —gen php test.thrift 

    (2)導(dǎo)入依賴的lib文件码倦。

    (3)實現(xiàn)client
7067487d-f49a-4c21-8b1d-fb716d2ef02e-image.png

5.php使用thrift.

        用php作為server端時,依賴于服務(wù)器裆泳。實現(xiàn)方式有兩種叹洲。

     (1)使用python 啟動一個端口監(jiān)控
7402ba1c-617b-4610-87f8-15b1e6bcc254-image.png

(2)把server端的文件放到apache服務(wù)器下面

      注意: 使用第一種方式時柠硕,client和server端的文件的第一行加//#!/usr/bin/env php

     第二種方式不用加工禾。

php生成server端時和生成client端的通信文件的命令是不一樣的。

server端:thrift -r --gen php:server Test.thrift

7e707fa9-4068-4382-a1f8-fdeac1d2b703-image.png

client端:thrift —gen php test.thrift

ddb25985-81e9-4fe3-90a1-a34b1b651d94-image.png

(1)第一種啟動方式:./runserver.py
請求方式: server: php PhpClient.php
(2)第二種啟動方式:把php項目放到apache下面
請求方式server: php PhpClient.php

結(jié)果:


95ced2b1-62a7-4300-8080-b32e8be9491f-image.png

6.java服務(wù)器端和php服務(wù)器端區(qū)別:

(1)java直接打個jar包蝗柔,就可以啟動一個端口闻葵,接受thrift請求。不依賴于服務(wù)器癣丧,例如tomcat槽畔。

(2)php 作為thrift的server端,沒有辦法自己啟動端口胁编,需要依賴于服務(wù)器厢钧,需要部署在服務(wù)器下面。例如apache.

(下面的內(nèi)容來源于網(wǎng)上嬉橙,總結(jié)的挺好)

8.thfit服務(wù)器端:

    1. 創(chuàng)建Handler早直,用于處理業(yè)務(wù)邏輯,數(shù)據(jù)處理接口.
    
    2. 基于Handler創(chuàng)建Processor,數(shù)據(jù)處理對象
    
    3. 創(chuàng)建Transport(通信方式),數(shù)據(jù)傳輸方式
    
    4. 創(chuàng)建Protocol方式(設(shè)定傳輸格式),數(shù)據(jù)傳輸協(xié)議
    
    5. 基于Processor, Transport和Protocol創(chuàng)建Server
    
    6. 運行Server

9.thrift客戶端:

    客戶端編寫的一般步驟:
    
    1. 創(chuàng)建Transport
    
    2. 創(chuàng)建Protocol方式
    
    3. 基于Transport和Protocol創(chuàng)建Client
    
    4. 運行Client的方法
    
10.數(shù)據(jù)傳輸方式,即Protoco

    TBinaryProtocol – 二進制格式.
    
    TCompactProtocol – 壓縮格式
    
    TJSONProtocol – JSON格式

11市框。支持的通信方式即霞扬,Transport

    THttpTransport:采用Http傳輸協(xié)議進行數(shù)據(jù)傳輸
    
    TSocket:采用TCP Socket進行數(shù)據(jù)傳輸
    
    下面幾個類主要是對上面幾個類地裝飾(采用了裝飾模式),以提高傳輸效率枫振。
    
    TBufferedTransport:對某個Transport對象操作的數(shù)據(jù)進行buffer喻圃,即從buffer中讀取數(shù)據(jù)進行傳輸,或者將數(shù)據(jù)直接寫入buffer
    
    TFramedTransport:以frame(幀:按照固定大小來傳輸)為單位進行傳輸粪滤,非阻塞式服務(wù)中使用斧拍。同TBufferedTransport類似,也會對相關(guān)數(shù)據(jù)進行buffer杖小,同時肆汹,它支持定長數(shù)據(jù)發(fā)送和接收怕吴。
    
    TMemoryBuffer:從一個緩沖區(qū)中讀寫數(shù)據(jù)

12.服務(wù)器端支持的模型。

    TSimpleServer – 簡單的單線程服務(wù)模型县踢,常用于測試
    
    TThreadedServer - 多線程服務(wù)模型转绷,使用阻塞式IO,每個請求創(chuàng)建一個線程硼啤。
    
    TThreadPoolServer – 線程池服務(wù)模型议经,使用標(biāo)準(zhǔn)的阻塞式IO,預(yù)先創(chuàng)建一組線程處理請求谴返。
    
    TNonblockingServer – 多線程服務(wù)模型煞肾,使用非阻塞式IO(需使用TFramedTransport數(shù)據(jù)傳輸方式)
    
    處理大量更新的話,主要是在TThreadedServer和TNonblockingServer中進行選擇嗓袱。TNonblockingServer能夠使用少量線程處理大量并發(fā)連接籍救,但是延遲較高;TThreadedServer的延遲較低渠抹。實際中蝙昙,TThreadedServer的吞吐量可能會比TNonblockingServer高,但是TThreadedServer的CPU占用要比TNonblockingServer高很多梧却。
    
    13.阻塞IO:socket的阻塞意味著必須要做完Io包括錯誤才會返回奇颠。
    
    非阻塞io:無論操作是否完成都會立刻返回。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末放航,一起剝皮案震驚了整個濱河市烈拒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌广鳍,老刑警劉巖荆几,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赊时,居然都是意外死亡吨铸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門蛋叼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焊傅,“玉大人,你說我怎么就攤上這事狈涮『ィ” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵歌馍,是天一觀的道長握巢。 經(jīng)常有香客問我,道長松却,這世上最難降的妖魔是什么暴浦? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任溅话,我火速辦了婚禮,結(jié)果婚禮上歌焦,老公的妹妹穿的比我還像新娘飞几。我一直安慰自己,他們只是感情好独撇,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布屑墨。 她就那樣靜靜地躺著,像睡著了一般纷铣。 火紅的嫁衣襯著肌膚如雪卵史。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天搜立,我揣著相機與錄音以躯,去河邊找鬼。 笑死啄踊,一個胖子當(dāng)著我的面吹牛忧设,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播社痛,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼见转,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蒜哀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤吏砂,失蹤者是張志新(化名)和其女友劉穎撵儿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狐血,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡淀歇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了匈织。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浪默。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缀匕,靈堂內(nèi)的尸體忽然破棺而出纳决,到底是詐尸還是另有隱情,我是刑警寧澤乡小,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布阔加,位于F島的核電站,受9級特大地震影響满钟,放射性物質(zhì)發(fā)生泄漏胜榔。R本人自食惡果不足惜胳喷,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夭织。 院中可真熱鬧吭露,春花似錦、人聲如沸尊惰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽择浊。三九已至戴卜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琢岩,已是汗流浹背投剥。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留担孔,地道東北人江锨。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像糕篇,于是被迫代替她去往敵國和親啄育。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容