java和php使用thrift
RPC:遠程過程調(diào)用協(xié)議雪营,它是一種通過網(wǎng)絡(luò)從遠程計算機程序上請求服務(wù)的方式.RPC采用客戶機/服務(wù)器模式。請求程序就是一個客戶機颗搂,而服務(wù)提供程序就是一個服務(wù)器敷搪。
-
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
文件目錄說明:
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é)議
server啟動端口:
java作為clent:
php作為client:
(1)首先要生成php的客戶端的通信文件:
thrift —gen php test.thrift
(2)導(dǎo)入依賴的lib文件码倦。
(3)實現(xiàn)client
5.php使用thrift.
用php作為server端時,依賴于服務(wù)器裆泳。實現(xiàn)方式有兩種叹洲。
(1)使用python 啟動一個端口監(jiān)控
(2)把server端的文件放到apache服務(wù)器下面
注意: 使用第一種方式時柠硕,client和server端的文件的第一行加//#!/usr/bin/env php
第二種方式不用加工禾。
php生成server端時和生成client端的通信文件的命令是不一樣的。
server端:thrift -r --gen php:server Test.thrift
client端:thrift —gen php test.thrift
(1)第一種啟動方式:./runserver.py
請求方式: server: php PhpClient.php
(2)第二種啟動方式:把php項目放到apache下面
請求方式server: php PhpClient.php
結(jié)果:
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:無論操作是否完成都會立刻返回。