Apache Thrift with Java Quickstart(thrift入門及Java實例)

thrift是一個軟件框架,用來進行可擴展且跨語言的服務的開發。它結合了功能強大的軟件堆棧和代碼生成引擎,以構建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結合的、高效的服務。

1. 概述

Thrift最初由facebook開發,07年四月開放源碼,08年5月進入apache孵化器。thrift容許你定義一個簡單的定義文件中的數據類型和服務接口。以做爲輸入文件,編譯器生成代碼用來方便地生成RPC客戶端和服務器通訊的無縫跨編程語言。html

官網地址:thrift.apache.org
推薦值得一看的文章:
http://thrift.apache.org/
http://thrift.apache.org/download
http://jnb.ociweb.com/jnb/jnbJun2009.html
http://wiki.apache.org/thriftjava

2. maven依賴

若是是Maven構建項目的,直接在pom.xml 中添加以下內容:linux

<dependency>
  <groupId>org.apache.thrift</groupId>
  <artifactId>libthrift</artifactId>
  <version>0.9.2</version>
</dependency>

3. 基本概念

3.1.數據類型git

基本類型:
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:對應服務的類
3.2.服務端編碼基本步驟:github

實現服務處理接口impl
建立TProcessor
建立TServerTransport
建立TProtocol
建立TServer
啓動Server
3.客戶端編碼基本步驟:web

建立Transport
建立TProtocol
基於TTransport和TProtocol建立 Client
調用Client的相應方法
4.數據傳輸協議apache

TBinaryProtocol : 二進制格式.
TCompactProtocol : 壓縮格式
TJSONProtocol : JSON格式
TSimpleJSONProtocol : 提供JSON只寫協議, 生成的文件很容易經過腳本語言解析
tips:客戶端和服務端的協議要一致編程

四、實例演示

在此前必定要安裝thrift,能夠在windows上安裝也能夠在linux上安裝,只要能執行thrift命令產生服務端接口就好了。windows

4.1. 新增一個文件 add.thrift,包含如下內容:服務器

若是你用過 Google Protocol Buffer必定不會對下面的操做感到陌生。

namespace java com.jamesfen.thrift  // java的包名 
    typedef i32 int  //typedefs to get convenient names for your types 
    service AdditionService {  // defines the service to add two numbers 
    int add(1:int n1, 2:int n2), //defines a method 
}

4.2.產生服務端接口代碼,執行如下命令

thrift --gen java add.thrift

4.3. 實現接口
當你操做完第二步後,會當前目錄產生一個gen-java文件夾,裏面包含了一個AdditionService.java文件,把這個類拷到你的包中。有一個要實現的內部接口,如今要實現該接口。

package com.jamesfen.thrift;
import org.apache.thrift.TException;
public class AdditionServiceHandler implements AdditionService.Iface{

    @Override
    public int add(int n1, int n2) throws TException {
      return n1 + n2;

    }
}

4.4.服務端代碼,爲AdditionServiceHandler類開啓一個監聽接口(9090)

package com.jamesfen.thrift;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TServer.Args;
import org.apache.thrift.server.TSimpleServer;

public class MyServer {
    public static void StartsimpleServer(
            AdditionService.Processor<AdditionServiceHandler> processor) {
        try {
            TServerTransport serverTransport = new TServerSocket(9090);
            TServer server = new TSimpleServer(
                    new Args(serverTransport).processor(processor));
            // Use this for a multithreaded server
            // TServer server = new TThreadPoolServer(new
            // TThreadPoolServer.Args(serverTransport).processor(processor));
            System.out.println("Starting the simple server...");
            server.serve();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {

        StartsimpleServer(new AdditionService.Processor<AdditionServiceHandler>(
                new AdditionServiceHandler()));
     }
}

5.客戶端代碼,請求服務

package com.jamesfen.thrift;

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

public class AdditionClient {

    public static void main(String[] args) {

        try {
            TTransport transport;
            transport = new TSocket("localhost", 9090);
            transport.open();
            TProtocol protocol = new TBinaryProtocol(transport);
            AdditionService.Client client = new AdditionService.Client(protocol);

            System.out.println(client.add(100, 200));

            transport.close();
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException x) {
            x.printStackTrace();
        }
    }

}

4.6.運行結果
服務端:
Starting the simple server…
客戶端:
300
4.7:demo源碼
https://github.com/Bellonor/myhadoop2.x/tree/master/myhadoop2.x/src/main/java/com/jamesfen/thrift

相關文章
相關標籤/搜索