一、Thrift框架好用嗎?
Apache Thrift是一個跨語言的服務化框架,由Facebook開發。旨在為不同的語言提供一個一致的RPC框架,可以實現無縫的跨語言調用。Thrift框架優點有以下幾點:
1、跨語言支持:
Thrift支持多種編程語言,包括Java、C++、Python、PHP等等。在開發過程中,通過定義IDL(接口定義語言)來定義接口,Thrift會將IDL自動生成對應語言的代碼。這樣多個語言之間進行交互時,只需要通過定義好的IDL即可。
2、性能較高:
在RPC調用方面,Thrift可以提供比傳統web service更快的訪問速度。Thrift使用了二進制協議,相比於文本協議,序列化和反序列化的效率更高。同時Thrift還採用了高性能的NIO(New I/O)模型,可以輕鬆處理大量請求。
3、靈活性和擴展性:
Thrift框架中的IDL是可擴展的,在架構會發生變化的情況下,Thrift可以簡單的完成服務定義的變化,支持多種服務模式,例如單線程/多線程、阻塞/非阻塞等多種模式。
二、Thrift框架buffer和frame
Thrift的socket傳輸協議,是基於buffer的,不過,Thrift對socket傳輸協議進行了封裝,使用時,一般不直接使用它,而是使用協議的上層封裝:frame。 frame的作用是用指定長度的幀包裝消息。
Thrift使用了兩種基本的數據結構:TBufferedTransport和TFramedTransport。
TBufferedTransport是為了提高IO效率,對各種Socket通信方式進行了一個節流控制優化。在socket客戶端、服務端連接之間通過一個buffer,把數據通過一一吞吐的方式漸進式地傳輸,這種流式傳輸方式避免了對非堵塞IO的高頻調用,對使用基於堵塞線程池的服務器程序有較好的優化效果。
TFramedTransport則是指每個請求都帶上一個長度參數,每次請求通過一個整塊的數據包傳輸,帶有長度前綴的數據包接收起來比單純的buffer好使得多。
三、Thrift框架和Netty
當然Thrift框架也可以作為Netty網絡應用框架的一部分,使得Java本地應用能夠分佈式用戶訪問,即服務端為Java原生應用,提供基於RPC調用的遠程訪問方式,Thrift+Cassandra的架構也採用了Netty的框架。
Thrift框架可以和Netty框架在下層組件上打通,用Netty提供網絡協議的支持,使得服務器集群分佈式運行,能夠完全控制客戶端與服務端的傳輸數據,具有高吞吐量和低延遲等優勢,提供程序的可擴展性,實現了高效的通信。
四、Thrift框架還有人用嗎?
隨着分佈式服務架構在互聯網領域的廣泛應用,RPC框架也在逐漸普及,當然,Thrift框架也被越來越多的用戶所熟知和應用。當前的很多大型互聯網公司或電商平台,都在使用Thrift框架,例如Facebook、Twitter、阿里巴巴、搜狐、快手、京東等等。相信在現在和未來很長時間內,Thrift框架都會佔據重要的位置。
五、Thrift框架和Truffle框架
Truffle框架是JavaScript腳本語言的一個新型編譯技術,基於GraalVM虛擬機使用的一款可嵌入語言的直接編譯器框架,它能夠將多種腳本解釋器語言轉換為符合統一JVM運行時的位元組碼。而Thrift框架最大特點就是支持多種語言的RPC服務調用,兩者有些類似。Truffle的執行引擎可以集成在Thrift框架中,是很多人推崇的技術組合。
六、Thrift意思
Thrift單詞本身的意思是「剪短」,或者可以解釋為「省略多餘的部分」。換句話說,Thrift意在提高通信效率,去除不必要的部分,用最少的位元組傳遞儘可能多的信息。
七、Thrift的技術架構有哪些?
Thrift框架的主要技術架構包括:IDL定義、代碼生成、數據結構、數據傳輸協議、數據編碼器解碼器和服務端和客戶端的通信框架。
IDL定義:
Thrift定義的IDL很類似於傳統的接口定義語言,不過擴展了一些數據類型,以支持多種語言的數據類型,當然,定義的IDL也具有兼容性。
// Thrift IDL,定義了一種數據類型 namespace java com.example struct Person { // 定義 Person 結構體,結構體中有3個字段 1: i64 id 2: string name 3: string email }
代碼生成:
在定義好IDL之後,Thrift可以根據IDL自動生成對應語言的代碼文件,方便應用之間的集成和調用。
數據結構:
Thrift支持多種數據類型,例如基礎數據類型、常規數據類型、結構體、異常、枚舉、集合、映射等等。
數據傳輸協議:
Thrift使用二進制傳輸,相比於文本協議,二進制協議轉換效率更高。
數據編碼器解碼器:
Thrift通過序列化和反序列化實現傳輸,需要編碼器和解碼器實現這些功能。
// Java 代碼示例,編碼器和解碼器的定義 // 實現TProtocol接口 public class TBinaryProtocol extends TProtocol { // 編碼邏輯 public void writeI32(int i32) { … } // 解碼邏輯 public int readI32() { … } … }
服務端和客戶端通信框架:
Thrift支持多種服務模式,例如單線程/多線程、阻塞/非阻塞等多種模式。在使用Thrift建立服務端或客戶端時,需要確定通信框架的具體實現。
// Java 代碼示例,Thrift 服務端通信框架的具體實現 public class HelloServiceImpl implements HelloService.Iface { // 實現 HelloService.Iface 接口 public String hello(String name) { return "Hello " + name; } } TProcessor processor = new HelloService.Processor(new HelloServiceImpl()); TServerTransport serverTransport = new TServerSocket(9090); TServer server = new TThreadPoolServer(processor, serverTransport); server.serve();
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/254203.html