Apache Thrift學習一

來源:互聯網
上載者:User

目錄: 概述 下載配置 基本概念 資料類型 服務端編碼基本步驟 用戶端編碼基本步驟 資料轉送協議 執行個體示範(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&lt;HelloWorldService.Iface&gt;            // tprocessor =            // new HelloWorldService.Processor&lt;HelloWorldService.Iface&gt;(            // new HelloWorldImpl());            // 簡單的單線程服務模型,一般用於測試            TServerSocket serverTransport = new TServerSocket(SERVER_PORT);            TServer.Args tArgs = 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.