中間語言是我為thrift語言起的名字,呵呵,為什么叫它中間語言呢,其實意思很簡單,就是說,它只是一個過程,而不是一個最終的結果,而結果需要這個中間過程的影響,沒有中間語言,結果語言也不能產生,在thrift架構中,如果你希望產生一個為C語言提供的接口,那么,你需要先書寫thrift是間語言,然后,需要thrift程序將它編譯成c語言的格式才行,這是正常的,“只有它什么都不是,它才有可能什么都是”,呵呵。
thrift中的數據類型
下面是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
通過上面的說明,我們可以看出,thrift里面有的是各種語言公有的類型,而一些個別語言中才出現的東西,如dictionary,hash等并沒有在thrift中出現,這是正常的,對于一種公用語言來說,它不應該包括那些特殊的東西,而它可以為那些特殊的東西建立一個自己的標準,讓自己去適應它們,如thrift里的map<t1,t2>類型相當于CSharp里的Dictionary<t1,t2>字典類型,這些在生成目標語言之后,都可以進行驗證。
thrift中沒有類,但有結構體
我想,這應該是對C語言的一種照顧,在thrift中沒有出現class(類)的概念,而有值類型struct,實事上,對于結構的認識我們一直都有偏見,讓為某些高級語言里有了類,就不應該有結構了,還說自己的代碼中從來沒有出現過結構。在這里,我需要對這位同學說,你的代碼里之所以沒有結構,完成是因為你對這種數據類型的不理解,不深入引起的,對于業務簡單,或者沒有業務的對象來說,為了將屬性進行封裝,完成可以使用結構來實現,看看C語言你就知道結構有多重要了,呵呵。
枚舉:
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
}
服務,我們的接口定義在服務中,接口是客戶端與服務器端通訊的基礎,客戶端使用自己語言的接口與服務器端通訊,客戶端與服務器端的平臺,開發環境可以完全不同,只要知識服務端的IP和端口即可實現通訊,這就是across language的thrift的魅力!
service FileTransport{
bool Upload(1:DataSegment dataSegment),/*客戶端傳入一個byte數組,服務器返回是否上傳成功,desPath表示上傳后存儲的路徑*/
binary Download(1:string fileUrl),/*客戶端傳入一個URL,服務器返回這個URL指向的文件,并為byte數組的形式返回*/
DataSync IsSync(1:string fileName),/*檢測文件是否需要進行同步上傳*/
bool UpdateDataSync(1:DataSync dataSync)/*從數據庫中更新數據同步狀態,主鍵為文件完整名稱*/
}
當我們運行thrift命令去生成目標代碼后,在指定的gen文件夾中生成,例如生成csharp的代碼,它會在thrift同級目錄中建立一個gen-csharp文件夾,然后代碼生成會以結構,枚舉,服務為單位去生成多個文件。如圖:
文章列表