目錄: 概述 下載配置 基本概念 資料類型 服務端編碼基本步驟 用戶端編碼基本步驟 資料轉送協議 執行個體示範(java) thrift產生代碼 實現介面Iface TSimpleServer服務模型 TThreadPoolServer 服務模型 TNonblockingServer 服務模型 THsHaServer服務模型 非同步用戶端 [一]、概述
Apache Thrift 是 Facebook 實現的一種高效的、支援多種程式設計語言的遠程服務調用的架構。Thrift是由Facebook開發的,並在2008年捐給了Apache基金會,成為了一個孵化器項目。
Thrift是一個軟體架構,用來進行可擴充且跨語言的服務的開發。它結合了功能強大的軟體堆棧和代碼產生引擎,
Thrift是一個驅動層介面,它提供了用於用戶端使用多種語言實現的API。
Thrift是個代碼產生庫,支援的用戶端語言套件括C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 。它的目標是為了各種流行的語言提供便利的RPC調用機制,而不需要使用那些開銷巨大的方式,比如SOAP。
要使用Thrift,就要使用一個語言中立的服務定義檔,描述資料類型和服務介面。這個檔案會被用作引擎的輸入,編譯器產生代碼為每種支援的語言產生RPC用戶端程式碼程式庫。這種靜態產生的設計讓它非常容易被開發人員所使用,而且因為類型驗證都發生在編譯期而非運行期,所以代碼可以很有效率地運行。
Thrift的設計提供了以下這些特性:
1、語言無關的類型
因為類型是使用定義檔案按照語言中立的方式規定的,所以它們可以被不同的語言分析。比如,C++的結構可以和Python的字典類型相互交換資料。
2、通用傳輸介面
不論你使用的是磁碟檔案、記憶體資料還是socket流,都可以使用同一段應用代碼。
3、協議無關
Thrift會對資料類型進行編碼和解碼,可以跨協議使用。
4、支援版本
資料類型可以加入版本資訊,來支援用戶端API的更新。
官網地址:thrift.apache.org
推薦值得一看的文章: http://jnb.ociweb.com/jnb/jnbJun2009.html http://wiki.apache.org/thrift http://thrift.apache.org/static/files/thrift-20070401.pdf [二]、下載配置
1)安裝thrift:到thrift官網下載exe檔案,然後將檔案重新命名為thrift.exe,拷貝到D:\EBOOK\thrift目錄下(或者任何目錄下),然後就可以在dos環境下使用了
D:\EBOOK\thrift>thrift -gen java D:\work\workspace\thriftworkspace\demo1\demoHello.thrift ,輸出的java檔案預設輸出到目前的目錄下D:\EBOOK\thrift\gen-java,也可以使用-o參數指定輸出路徑;
2)下載相關依賴包
2.1)libthrift.jar ,下載地址:http://repo1.maven.org/maven2/org/apache/thrift/libthrift/0.9.0/
2.2)slf4j-api.jar
2.3)slf4j-simple.jar
到官網http://thrift.apache.org/download 下載最新版本,截止今日(2016-05-23)最新版本為0.9.3
1. 如果是Maven構建項目的,直接在pom.xml 中添加如下內容:
<dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.8.0</version></dependency>
2.如果自己編譯lib包,把下載的壓縮包解壓到X:盤,然後在X:\thrift-0.8.0\lib\java 目錄下運行ant進行自動編譯,會在X:\thrift-0.8.0\lib\java\build\ 目錄下看到編譯好的lib包:libthrift-0.8.0.jar
[三]、基本概念
1.資料類型 基本類型: bool:布爾值,true 或 false,對應 Java 的 boolean byte:8 位有符號整數,對應 Java 的 byte i16:16 位有符號整數,對應 Java 的 short i32:32 位有符號整數,對應 Java 的 int i64:64 位元有符號整數,對應 Java 的 long double:64 位元浮點數,對應 Java 的 double string:utf-8編碼的字串,對應 Java 的 String 結構體類型: struct:定義公用的對象,類似於 C 語言中的結構體定義,在 Java 中是一個 JavaBean 容器類型: list:對應 Java 的 ArrayList set:對應 Java 的 HashSet map:對應 Java 的 HashMap 異常類型: exception:對應 Java 的 Exception 服務類型: service:對應服務的類
2.服務端編碼基本步驟: 實現服務處理介面impl 建立TProcessor 建立TServerTransport 建立TProtocol 建立TServer 啟動Server
3.用戶端編碼基本步驟: 建立Transport 建立TProtocol 基於TTransport和TProtocol建立 Client 調用Client的相應方法
4.資料轉送協議 TBinaryProtocol : 二進位格式. TCompactProtocol : 壓縮格式 TJSONProtocol : JSON格式 TSimpleJSONProtocol : 提供JSON唯寫協議, 產生的檔案很容易通過指令碼語言解析
tips:用戶端和服務端的協議要一致 [四]、執行個體示範
1. thrift產生代碼
建立Thrift檔案:D:\work\workspace\thriftworkspace\demo1\demoHello.thrift ,內容如下:
namespace java com.dxz.thrift.demo service HelloWorldService { string sayHello(1:string username)}
thrift-0.8.0.exe 是官網提供的windows下編譯工具,運用這個工具產生相關代碼:
D:\EBOOK\thrift>thrift-0.9.3.exe -r -gen java D:\work\workspace\thriftworkspace\demo1\demoHello.thrift
產生後的目錄結構如下:
將產生的HelloWorldService.java 檔案copy到自己測試的工程中,我的工程是用maven構建的,故在pom.xml中增加如下內容:
<dependency><groupId>org.apache.thrift</groupId><artifactId>libthrift</artifactId><version>0.8.0</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.5.8</version></dependency>
如果是ant構建的工程,將libthrift-0.9.3.jar加入到工程中
2. 實現介面Iface
java代碼:HelloWorldImpl.java
package com.dxz.thrift.demo;import org.apache.thrift.TException;public class HelloWorldImpl implements HelloWorldService.Iface { public HelloWorldImpl() { } @Override public String sayHello(String username) throws TException { return "Hi," + username + " welcome to thrift world"; }}
3.TSimpleServer服務端
簡單的單線程服務模型,一般用於測試。
編寫服務端server代碼:HelloServerDemo.java
package com.dxz.thrift.demo;import org.apache.thrift.TProcessor;import org.apache.thrift.protocol.TBinaryProtocol;import org.apache.thrift.protocol.TCompactProtocol;import org.apache.thrift.protocol.TJSONProtocol;import org.apache.thrift.protocol.TSimpleJSONProtocol;import org.apache.thrift.server.TServer;import org.apache.thrift.server.TSimpleServer;import org.apache.thrift.transport.TServerSocket;public class HelloServerDemo { public static final int SERVER_PORT = 8090; public void startServer() { try { System.out.println("HelloWorld TSimpleServer start ...."); TProcessor tprocessor = new HelloWorldService.Processor<HelloWorldService.Iface>(new HelloWorldImpl()); // HelloWorldService.Processor<HelloWorldService.Iface> // tprocessor = // new HelloWorldService.Processor<HelloWorldService.Iface>( // new HelloWorldImpl()); // 簡單的單線程服務模型,一般用於測試 TServerSocket serverTransport = new TServerSocket(SERVER_PORT); TServer.Args tArgs =