《Netty學習打卡--從小白到放棄》----- 12 - netty 之thrift 初識thrift

打卡日期(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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章