打卡日期(2019-07-11)
學習要點
- 1.Thrift是什麼
- 2.Thrift架構
- 3.Thrift能做什麼
- 4.TProtocol
- 5.Thrift TTransPort
- 6.Thrift支持哪幾種Server模型
- 7.Thrift IDL文件有哪幾種基本數據類型
- 8.Thrift 支持哪幾種容器
- 9.Thrift 關鍵字
1.Thrift是什麼?
Thrift是一個軟件框架,用於可擴展、跨語言的服務開發。擁有強大軟件堆棧和代碼生成引擎,在Thrift框架內能夠爲多種語言提供無縫且高效的服務。
2.Thrift架構
Thrift的架構也是由客戶端(Client)、客戶端輔助對象(Stub\Sklenton)、傳輸協議(TProtocol)、傳輸層(TTransport)
- Client:負責實現業務,組裝請求參數
- YourCode/FooService.Client:客戶端輔助對象Stub或者Sklenton,負責調用遠程服務接口
- TProtocol:負責序列化和反序列化消息,然後將消息寫入到網絡傳輸層
- TTransport:負責提供傳輸數據
3.Thrift能做什麼
Thrift主要用於跨語言、不同服務之間的PRC通信。Thrift是一個典型的CS結構,客戶端和服務端可以使用不同的語言進行開發,其通過IDL(Interface Description Language)來關聯客戶端和服務端。
4.Thrift TProtocol
TProtocol中封裝了每一個數據類型的讀和寫,這裏針對的主要是網絡的IO讀寫,TProtocol是一個抽象類且內部維護了一個TTransport,這個協議主要用於對傳輸數據格式進行封裝,實現不同的協議來適應不同的數據傳輸。其包括如下幾種格式:
- TJSONProtocol:以json的格式讀寫數據
- TSimpleJSONProtocol:json格式的簡單讀,沒有提供寫的功能
- TBinaryProtocol:以二進制的格式進行讀寫
- TCompactProtocol:對數據進行壓縮,採用zigzag進行編碼,它會沿着構造函數傳入protocol部分輸出/讀取格式,但會對數據進行壓縮
5.Thrift TTransPort
TTransport封裝了底層的傳輸通道,主要有read/write、open/close等基本的讀寫方法,而且都是對二進制數據進行操作。Protocol則對thrift中的各種數據進行讀寫,底層調用的是TTransport。TTransport的分爲如下幾種格式:
- TIOStreamTransport:阻塞式socket
- TNonblockingTrasnsort:非阻塞式IO
- TMemoryInputTransport:封裝了一個byte數組來作爲輸入流的的封裝
- TFramedTransport:封裝了TMemoryInputTransport做輸入流,封裝了TByteArryOutPutStream做輸出流,作爲內存讀寫緩衝區的一個封裝,調用flush方法時候,會先寫入4個字節的輸出流作爲消息頭,然後再寫消息體。
- TMemoryBuffer:使用字節數組輸出流ByteArrayOutputStream做輸出流的封裝。
- TFastFramedTransport是內存利用率更高的一種內存讀寫緩存區,它使用自增長byte數組,而不是每次都new出來一個byte數組,提高了內存的使用率。跟TFramedTransport一樣,每次flush的時候都會先寫入4個字節作爲消息頭,然後再寫消息體。
6.Thrift支持哪幾種Server模型
一個服務是由一組命名的函數組成,包括函數名,參數列表,返回值。thrift主要支持以下幾種服務模型:
- TSimpleServer:簡單的單線程服務,通常用於測試
- TThreadPoolServer:多線程服務,使用標準的阻塞式IO
- TNonBlockingServer:多線程服務,使用標準的非阻塞式IO(需要使用TFramedTranspor數據傳輸方式)
- THsHaServer:THSHa 其模型任務讀寫放到線程池裏面去處理,Half-async/Half-sync處理模式,Half-async是處理IO事件上(accept/read/write),Half-sync是用於handler對RPC的同步處理
7.Thrift IDL文件有哪幾種基本數據類型
- byte:有符號字節
- i16:16位有符號整數
- i32:32位有符號整數
- i64:64位有符號整數
- double:64位浮點型
- string:字符串
- binary:Blob類型,對應java中的byte[]
- bool:布爾類型
8.Thrift 支持哪幾種容器
thrift容器是強類型容器,對應大多數的編程語言中常用的容器類型
- list:按順序排序的元素列表,會轉換成java中的ArrayList類型
- set:無需的唯一元素集合,會轉換成java中的HashSet
- map:用唯一的鍵來映射值,一個字典結構,Key爲K類型,Value爲V類型,會轉成java中的HashMap