Thrift架構~thrift中(zhong)間語言的(de)認識(只有它什么都(dou)不是(shi),它才(cai)有可能(neng)什么都(dou)是(shi))
中間語言是我為thrift語言起的名字,呵呵,為什么叫它中間語言呢,其實意思很簡單,就是說,它只是一個過程,而不是一個最終的結果,而結果需要這個中間過程的影響,沒有中間語言,結果語言也不能產生,在thrift架構中,如果你希望產生一個為C語言提供的接口,那么,你需要先書寫thrift是間語言,然后,需要thrift程序將它編譯成c語言的格式才行,這是正常的,“只有它什么都不是,它才有可能什么都是”,呵呵。
thrift中(zhong)的(de)數據類型
下面(mian)是thrift本身對類型的重定義,看一下:
bool Boolean, one byte
byte Signed byte
i16 Signed 16-bit integer
i32 Signed 32-bit integer
i64 Signed 64-bit integer
double 64-bit floating point value
string String
binary Blob (byte array)
map<t1,t2> Map from one type to another
list<t1> Ordered list of one type
set<t1> Set of unique elements of one type
通過上(shang)面(mian)的(de)說明,我們(men)可以(yi)看出(chu),thrift里(li)面(mian)有的(de)是各種語(yu)(yu)言(yan)公(gong)有的(de)類型,而一些(xie)(xie)個(ge)別語(yu)(yu)言(yan)中才出(chu)現的(de)東西(xi),如(ru)dictionary,hash等并沒有在thrift中出(chu)現,這是正常的(de),對于一種公(gong)用語(yu)(yu)言(yan)來(lai)說,它不應該包括(kuo)那(nei)些(xie)(xie)特殊的(de)東西(xi),而它可以(yi)為那(nei)些(xie)(xie)特殊的(de)東西(xi)建(jian)立一個(ge)自(zi)己(ji)的(de)標準(zhun),讓自(zi)己(ji)去(qu)適(shi)應它們(men),如(ru)thrift里(li)的(de)map<t1,t2>類型相當于CSharp里(li)的(de)Dictionary<t1,t2>字典類型,這些(xie)(xie)在生成目(mu)標語(yu)(yu)言(yan)之后,都可以(yi)進行(xing)驗(yan)證。
thrift中沒(mei)有類,但有結構體(ti)
我(wo)想,這(zhe)應該是對C語(yu)言(yan)的(de)(de)一種照顧(gu),在thrift中沒(mei)有(you)出(chu)現class(類)的(de)(de)概念,而有(you)值類型(xing)struct,實(shi)事上,對于(yu)結(jie)(jie)構的(de)(de)認識我(wo)們一直(zhi)都有(you)偏(pian)見(jian),讓為某些高級(ji)語(yu)言(yan)里(li)有(you)了類,就(jiu)不(bu)應該有(you)結(jie)(jie)構了,還說(shuo)自己(ji)的(de)(de)代碼中從來沒(mei)有(you)出(chu)現過結(jie)(jie)構。在這(zhe)里(li),我(wo)需要(yao)對這(zhe)位同學(xue)說(shuo),你的(de)(de)代碼里(li)之所以(yi)沒(mei)有(you)結(jie)(jie)構,完成(cheng)是因為你對這(zhe)種數據(ju)類型(xing)的(de)(de)不(bu)理解,不(bu)深入引起的(de)(de),對于(yu)業(ye)務(wu)簡單(dan),或者(zhe)沒(mei)有(you)業(ye)務(wu)的(de)(de)對象來說(shuo),為了將(jiang)屬性進(jin)行封裝,完成(cheng)可(ke)以(yi)使用結(jie)(jie)構來實(shi)現,看(kan)看(kan)C語(yu)言(yan)你就(jiu)知(zhi)道結(jie)(jie)構有(you)多重(zhong)要(yao)了,呵呵。
枚舉:
enum Operation {
ADD = 1,
SUBTRACT = 2,
MULTIPLY = 3,
DIVIDE = 4
}
結構(結構體)
struct DataSync{
1:bool IsSync,/*是否要同步*/
2:string FilePath,/*文件路徑*/
3:i64 CurrentSeek,/*當前針*/
}
異常
exception InvalidOperation {
1: i32 what,
2: string why
}
服(fu)(fu)務(wu)(wu),我們(men)的(de)接(jie)(jie)(jie)口(kou)定義(yi)在服(fu)(fu)務(wu)(wu)中,接(jie)(jie)(jie)口(kou)是客戶(hu)(hu)端(duan)(duan)與服(fu)(fu)務(wu)(wu)器端(duan)(duan)通訊(xun)(xun)的(de)基(ji)礎(chu),客戶(hu)(hu)端(duan)(duan)使用(yong)自己(ji)語言(yan)的(de)接(jie)(jie)(jie)口(kou)與服(fu)(fu)務(wu)(wu)器端(duan)(duan)通訊(xun)(xun),客戶(hu)(hu)端(duan)(duan)與服(fu)(fu)務(wu)(wu)器端(duan)(duan)的(de)平(ping)臺,開發(fa)環(huan)境可(ke)(ke)以(yi)完全不同(tong),只要知識服(fu)(fu)務(wu)(wu)端(duan)(duan)的(de)IP和端(duan)(duan)口(kou)即可(ke)(ke)實(shi)現(xian)通訊(xun)(xun),這就是across language的(de)thrift的(de)魅力!
service FileTransport{
bool Upload(1:DataSegment dataSegment),/*客戶端傳入一個byte數(shu)組,服務(wu)器返(fan)回是否上傳成功(gong),desPath表示(shi)上傳后存儲的路徑*/
binary Download(1:string fileUrl),/*客戶端傳入一個(ge)URL,服務器返(fan)回這個(ge)URL指向(xiang)的(de)文件,并(bing)為byte數組的(de)形式(shi)返(fan)回*/
DataSync IsSync(1:string fileName),/*檢測文件是否(fou)需(xu)要進行同步(bu)上傳*/
bool UpdateDataSync(1:DataSync dataSync)/*從數(shu)據(ju)庫中更新數(shu)據(ju)同步狀態(tai),主(zhu)鍵(jian)為文件完整名(ming)稱*/
}
當我(wo)們運(yun)行(xing)thrift命令去生成(cheng)目(mu)標(biao)代(dai)碼(ma)(ma)(ma)后(hou),在指(zhi)定(ding)的gen文(wen)件夾中生成(cheng),例如生成(cheng)csharp的代(dai)碼(ma)(ma)(ma),它會在thrift同級目(mu)錄中建立一個gen-csharp文(wen)件夾,然(ran)后(hou)代(dai)碼(ma)(ma)(ma)生成(cheng)會以結(jie)構,枚舉,服務(wu)為(wei)單位去生成(cheng)多個文(wen)件。如圖: