成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Thrift 簡(jiǎn)易入門與實(shí)戰(zhàn)

iliyaku / 1538人閱讀

摘要:簡(jiǎn)介是一個(gè)軟件框架用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā)它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎以構(gòu)建在這些編程語言間無縫結(jié)合的高效的服務(wù)官網(wǎng)地址安裝的安裝比較簡(jiǎn)單在下可以直接使用快速安裝或可以通過官網(wǎng)下載這里就不再多說了當(dāng)下載安裝完畢后我們就

簡(jiǎn)介

thrift是一個(gè)軟件框架, 用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā). 它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎, 以構(gòu)建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結(jié)合的、高效的服務(wù).
官網(wǎng)地址: thrift.apache.org

安裝

Thrift 的安裝比較簡(jiǎn)單, 在 Mac 下可以直接使用 brew 快速安裝.

brew install thrift

Window 或 Linux 可以通過官網(wǎng) 下載, 這里就不再多說了.

當(dāng)下載安裝完畢后, 我們就會(huì)得到一個(gè)名為 thrift (Window 下是 thrift.exe) 的工具, 通過它就可以生成各個(gè)語言的 thrift 代碼.

基礎(chǔ) 數(shù)據(jù)類型

Thrift 腳本可定義的數(shù)據(jù)類型包括以下幾種類型:

基本類型

bool: 布爾值, true 或 false, 對(duì)應(yīng) Java 的 boolean

byte: 8 位有符號(hào)整數(shù), 對(duì)應(yīng) Java 的 byte

i16: 16 位有符號(hào)整數(shù), 對(duì)應(yīng) Java 的 short

i32: 32 位有符號(hào)整數(shù), 對(duì)應(yīng) Java 的 int

i64: 64 位有符號(hào)整數(shù), 對(duì)應(yīng) Java 的 long

double: 64 位浮點(diǎn)數(shù), 對(duì)應(yīng) Java 的 double

string: 未知編碼文本或二進(jìn)制字符串, 對(duì)應(yīng) Java 的 String

struct 類型

定義公共的對(duì)象, 類似于 C 語言中的結(jié)構(gòu)體定義, 在 Java 中是一個(gè) JavaBean

union 類型

和 C/C++ 中的 union 類似.

容器類型:

list: 對(duì)應(yīng) Java 的 ArrayList

set: 對(duì)應(yīng) Java 的 HashSet

map: 對(duì)應(yīng) Java 的 HashMap

exception 類型

對(duì)應(yīng) Java 的 Exception

service 類型

對(duì)應(yīng)服務(wù)的類.

service 類型可以被繼承, 例如:

service PeopleDirectory {
   oneway void log(1: string message),
   void reloadDatabase()
}
service EmployeeDirectory extends PeopleDirectory {
   Employee findEmployee(1: i32employee_id) throws (1: MyError error),
   bool createEmployee(1: Employee new_employee)
}

注意到, 在定義 PeopleDirectory 服務(wù)的 log 方法時(shí), 我們使用到了 oneway 關(guān)鍵字, 這個(gè)關(guān)鍵字的作用是告訴 thrift, 我們不關(guān)心函數(shù)的返回值, 不需要等待函數(shù)執(zhí)行完畢就可以直接返回.
oneway 關(guān)鍵字通常用于修飾無返回值(void)的函數(shù), 但是它和直接的無返回值的函數(shù)還是有區(qū)別的, 例如上面的 log 函數(shù)和 reloadDatabase 函數(shù), 當(dāng)客戶端通過 thrift 進(jìn)行遠(yuǎn)程調(diào)用服務(wù)端的 log 函數(shù)時(shí), 不需要等待服務(wù)端的 log 函數(shù)執(zhí)行結(jié)束就可以直接返回; 但是當(dāng)客戶端調(diào)用 reloadDatabase 方法時(shí), 雖然這個(gè)方法也是無返回值的, 但客戶端必須要阻塞等待, 直到服務(wù)端通知客戶端此調(diào)用已結(jié)束后, 客戶端的遠(yuǎn)程調(diào)用才可以返回.

枚舉類型

和 Java 中的 enum 類型一樣, 例如:

enum Fruit {
    Apple,
    Banana,
}
例子

下面是一個(gè)在 IDL 文件中使用各種類型的例子:

enum ResponseStatus {
  OK = 0,
  ERROR = 1,
}

struct ListResponse {
  1: required ResponseStatus status,
  2: optional list ids,
  3: optional list scores,
  10: optional string strategy,
  11: optional string globalId,
  12: optional map extraInfo,
}

service Hello {
    string helloString(1:string para)
    i32 helloInt(1:i32 para)
    bool helloBoolean(1:bool para)
    void helloVoid()
    string helloNull()
}
關(guān)于 IDL 文件

所謂 IDL, 即 接口描述語言, 在使用 thrift 前, 需要提供一個(gè) .thrift 后綴的文件, 其內(nèi)容是使用 IDL 描述的服務(wù)接口信息.
例如如下的一個(gè)接口描述:

namespace java com.xys.thrift

service HelloWorldService {
    string sayHello(string name);
}

這里我們定義了一個(gè)名為 HelloWorldService 的接口, 它有一個(gè)方法, 即 sayHello. 當(dāng)通過 thrift --gen java test.thrift 來生成 thrift 接口服務(wù)時(shí), 會(huì)產(chǎn)生一個(gè) HelloWorldService.java 的文件, 在此文件中會(huì)定義一個(gè) HelloWorldService.Iface 接口, 我們?cè)诜?wù)器端實(shí)現(xiàn)此接口即可.

服務(wù)器端編碼基本步驟

實(shí)現(xiàn)服務(wù)處理接口 impl

創(chuàng)建 Processor

創(chuàng)建 Transport

創(chuàng)建 Protocol

創(chuàng)建 Server

啟動(dòng) Server

例如:

public class HelloServer {
    public static final int SERVER_PORT = 8080;

    public static void main(String[] args) throws Exception {
        HelloServer server = new HelloServer();
        server.startServer();
    }

    public void startServer() throws Exception {
        // 創(chuàng)建 TProcessor
        TProcessor tprocessor = 
                new HelloWorldService.Processor(new HelloWorldImpl());

        // 創(chuàng)建 TServerTransport, TServerSocket 繼承于 TServerTransport
        TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
        
        // 創(chuàng)建 TProtocol
        TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();
        
        TServer.Args tArgs = new TServer.Args(serverTransport);
        tArgs.processor(tprocessor);
        tArgs.protocolFactory(protocolFactory);

        // 創(chuàng)建 TServer
        TServer server = new TSimpleServer(tArgs);
        // 啟動(dòng) Server
        server.serve();
    }
}
客戶端編碼基本步驟

創(chuàng)建 Transport

創(chuàng)建 Protocol

基于 Potocol 創(chuàng)建 Client

打開 Transport

調(diào)用服務(wù)相應(yīng)的方法.

public class HelloClient {
    public static final String SERVER_IP = "localhost";
    public static final int SERVER_PORT = 8080;
    public static final int TIMEOUT = 30000;

    public static void main(String[] args) throws Exception {
        HelloClient client = new HelloClient();
        client.startClient("XYS");
    }

    public void startClient(String userName) throws Exception {
        // 創(chuàng)建 TTransport
        TTransport transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);
        // 創(chuàng)建 TProtocol
        TProtocol protocol = new TBinaryProtocol(transport);

        // 創(chuàng)建客戶端.
        HelloWorldService.Client client = new HelloWorldService.Client(protocol);
        
        // 打開 TTransport
        transport.open();
        
        // 調(diào)用服務(wù)方法
        String result = client.sayHello(userName);
        System.out.println("Result: " + result);

        transport.close();
    }
}
Thrift 的網(wǎng)絡(luò)棧

如上圖所示, thrift 的網(wǎng)絡(luò)棧包含了 transport 層, protocol 層, processor 層和 Server/Client 層.

Transport 層

Transport 層提供了從網(wǎng)絡(luò)中讀取數(shù)據(jù)或?qū)?shù)據(jù)寫入網(wǎng)絡(luò)的抽象.
Transport 層和 Protocol 層相互獨(dú)立, 我們可以根據(jù)自己需要選擇不同的 Transport 層, 而對(duì)上層的邏輯不造成任何影響.

Thrift 的 Java 實(shí)現(xiàn)中, 我們使用接口 TTransport 來描述傳輸層對(duì)象, 這個(gè)接口提供的常用方法有:

open
close
read
write
flush

而在服務(wù)器端, 我們通常會(huì)使用 TServerTransport 來監(jiān)聽客戶端的請(qǐng)求, 并生成相對(duì)應(yīng)的 Transport 對(duì)象, 這個(gè)接口提供的常用方法有:

open
listen
accept
close

為了使用上的方便, Thrift 提供了如下幾個(gè)常用 Transport:

TSocket: 這個(gè) transport 使用阻塞 socket 來收發(fā)數(shù)據(jù).

TFramedTransport: 以幀的形式發(fā)送數(shù)據(jù), 每幀前面是一個(gè)長(zhǎng)度. 當(dāng)服務(wù)方使用 non-blocking IO 時(shí)(即服務(wù)器端使用的是 TNonblockingServerSocket), 那么就必須使用 TFramedTransport.

TMemoryTransport: 使用內(nèi)存 I/O. Java 實(shí)現(xiàn)中在內(nèi)部使用了 ByteArrayOutputStream

TZlibTransport: 使用 Zlib 壓縮傳輸?shù)臄?shù)據(jù). 在 Java 中未實(shí)現(xiàn).

Protocol 層(數(shù)據(jù)傳輸協(xié)議層)

這一層的作用是內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為可通過 Transport 傳輸?shù)臄?shù)據(jù)流或者反操作, 即我們所謂的 序列化反序列化.

常用的協(xié)議有:

TBinaryProtocol, 二進(jìn)制格式

TCompactProtocol, 壓縮格式

TJSONProtocol, JSON 格式

TSimpleJSONProtocol, 提供 JSON 只寫協(xié)議, 生成的文件很容易通過腳本語言解析.

TDebugProtocoal, 使用人類可讀的 Text 格式, 幫助調(diào)試

注意, 客戶端和服務(wù)器的協(xié)議要一樣.

Processor 層

Processor 層對(duì)象由 Thrift 根據(jù)用戶的 IDL 文件所生成, 我們通常不能隨意指定.
這一層主要有兩個(gè)功能:

從 Protocol 層讀取數(shù)據(jù), 然后轉(zhuǎn)交給對(duì)應(yīng)的 handler 處理

將 handler 處理的結(jié)構(gòu)發(fā)送 Prootcol 層.

Server 層

Thrift 提供的 Server 層實(shí)現(xiàn)有:

TNonblockingServer: 這個(gè)是一個(gè)基于多線程, 非阻塞 IO 的 Server 層實(shí)現(xiàn), 它專門用于處理大量的并發(fā)請(qǐng)求的

THsHaServer: 辦同步/半異步服務(wù)器模型, 基于 TNonblockingServer 實(shí)現(xiàn).

TThreadPoolServer: 基于多線程, 阻塞 IO 的 Server 層實(shí)現(xiàn), 它所消耗的系統(tǒng)資源比 TNonblockingServer 高, 不過可以提供更高的吞吐量.

TSimpleServer: 這個(gè)實(shí)現(xiàn)主要是用于測(cè)試目的. 它只有一個(gè)線程, 并且是阻塞 IO, 因此在同一時(shí)間只能處理一個(gè)連接.

使用例子

下面的例子在我的 Github 上有源碼, 直接 clone 即可.

依賴

    org.apache.thrift
    libthrift
    0.10.0

thrift 版本: 0.10.0
注意, jar 包的版本需要和 thrift 版本一致, 不然可能會(huì)有一些編譯錯(cuò)誤

thrift 文件

test.thrift

namespace java com.xys.thrift

service HelloWorldService {
    string sayHello(string name);
}
編譯
cd src/main/resources/
thrift --gen java test.thrift
mv gen-java/com/xys/thrift/HelloWorldService.java ../java/com/xys/thrift 

當(dāng)執(zhí)行 thrift --gen java test.thrift 命令后, 會(huì)在當(dāng)前目錄下生成一個(gè) gen-java 目錄, 其中會(huì)以包路徑格式存放著生成的服務(wù)器端 thrift 代碼, 我們將其拷貝到工程對(duì)應(yīng)的目錄下即可.

服務(wù)實(shí)現(xiàn)
public class HelloWorldImpl implements HelloWorldService.Iface {
    public HelloWorldImpl() {
    }

    @Override
    public String sayHello(String name) throws TException {
        return "Hello, " + name;
    }
}
服務(wù)端/客戶端實(shí)現(xiàn)

下面我們分別根據(jù)服務(wù)器端的幾種不同類型, 來分別實(shí)現(xiàn)它們, 并對(duì)比這些模型的異同點(diǎn).

TSimpleServer 服務(wù)器模型

TSimpleServer 是一個(gè)簡(jiǎn)單的服務(wù)器端模型, 它只有一個(gè)線程, 并且使用的是阻塞 IO 模型, 因此一般用于測(cè)試環(huán)境中.

服務(wù)器端實(shí)現(xiàn)
public class SimpleHelloServer {
    public static final int SERVER_PORT = 8080;

    public static void main(String[] args) throws Exception {
        SimpleHelloServer server = new SimpleHelloServer();
        server.startServer();
    }

    public void startServer() throws Exception {
        TProcessor tprocessor = new HelloWorldService.Processor(
                new HelloWorldImpl());

        TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
        TSimpleServer.Args tArgs = new TSimpleServer.Args(serverTransport);
        tArgs.processor(tprocessor);
        tArgs.protocolFactory(new TBinaryProtocol.Factory());

        TServer server = new TSimpleServer(tArgs);

        server.serve();
    }
}

我們?cè)诜?wù)器端的代碼中, 沒有顯示地指定 Transport 的類型, 這個(gè)是因?yàn)?TSimpleServer.Args 在構(gòu)造時(shí), 會(huì)指定一個(gè)默認(rèn)的 TransportFactory, 當(dāng)有新的客戶端連接時(shí), 就會(huì)生成一個(gè) TSocket 的 Transport 實(shí)例. 由于這一點(diǎn), 我們?cè)诳蛻舳藢?shí)現(xiàn)時(shí), 也就需要指定客戶端的 Transport 為 TSocket 才行.

客戶端實(shí)現(xiàn)
public class SimpleHelloClient {
    public static final String SERVER_IP = "localhost";
    public static final int SERVER_PORT = 8080;
    public static final int TIMEOUT = 30000;

    public void startClient(String userName) throws Exception {
        TTransport transport = null;

        transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);
        // 協(xié)議要和服務(wù)端一致
        TProtocol protocol = new TBinaryProtocol(transport);
        HelloWorldService.Client client = new HelloWorldService.Client(
                protocol);
        transport.open();
        String result = client.sayHello(userName);
        System.out.println("Result: " + result);

        transport.close();
    }

    public static void main(String[] args) throws Exception {
        SimpleHelloClient client = new SimpleHelloClient();
        client.startClient("XYS");
    }
}
TThreadPoolServer 服務(wù)器模型

TThreadPoolServer 是一個(gè)基于線程池和傳統(tǒng)的阻塞 IO 模型實(shí)現(xiàn), 每個(gè)線程對(duì)應(yīng)著一個(gè)連接.

服務(wù)器端實(shí)現(xiàn)
public class ThreadPoolHelloServer {
    public static final int SERVER_PORT = 8080;

    public static void main(String[] args) throws Exception {
        ThreadPoolHelloServer server = new ThreadPoolHelloServer();
        server.startServer();
    }

    public void startServer() throws Exception {
        TProcessor tprocessor = new HelloWorldService.Processor(
                new HelloWorldImpl());

        TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
        TThreadPoolServer.Args tArgs = new TThreadPoolServer.Args(serverTransport);
        tArgs.processor(tprocessor);
        tArgs.protocolFactory(new TBinaryProtocol.Factory());

        TServer server = new TThreadPoolServer(tArgs);
        server.serve();
    }
}

TThreadPoolServer 的服務(wù)器端實(shí)現(xiàn)和 TSimpleServer 的沒有很大區(qū)別, 只不過是在對(duì)應(yīng)的地方把 TSimpleServer 改為 TThreadPoolServer 即可.

同樣地, 我們?cè)?TThreadPoolServer 服務(wù)器端的代碼中, 和 TSimpleServer 一樣, 沒有顯示地指定 Transport 的類型, 這里的原因和 TSimpleServer 的一樣, 就不再贅述了.

客戶端實(shí)現(xiàn)

代碼實(shí)現(xiàn)和 SimpleHelloClient 一樣.

TNonblockingServer 服務(wù)器模型

TNonblockingServer 是基于線程池的, 并且使用了 Java 提供的 NIO 機(jī)制實(shí)現(xiàn)非阻塞 IO, 這個(gè)模型可以并發(fā)處理大量的客戶端連接.
注意, 當(dāng)使用 TNonblockingServer 模型是, 服務(wù)器端和客戶端的 Transport 層需要指定為 TFramedTransportTFastFramedTransport.

服務(wù)器端實(shí)現(xiàn)
public class NonblockingHelloServer {
    public static final int SERVER_PORT = 8080;

    public static void main(String[] args) throws Exception {
        NonblockingHelloServer server = new NonblockingHelloServer();
        server.startServer();
    }

    public void startServer() throws Exception {
        TProcessor tprocessor = new HelloWorldService.Processor(
                new HelloWorldImpl());

        TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(SERVER_PORT);
        TNonblockingServer.Args tArgs = new TNonblockingServer.Args(serverTransport);
        tArgs.processor(tprocessor);
        tArgs.protocolFactory(new TBinaryProtocol.Factory());
        // 下面這個(gè)設(shè)置 TransportFactory 的語句可以去掉
        tArgs.transportFactory(new TFramedTransport.Factory());

        TServer server = new TNonblockingServer(tArgs);
        server.serve();
    }
}

前面我們提到, 在 TThreadPoolServerTSimpleServer 的服務(wù)器端代碼實(shí)現(xiàn)中, 我們并沒有顯示地為服務(wù)器端設(shè)置 Transport, 因?yàn)?TSimpleServer.ArgsTThreadPoolServer.Args 設(shè)置了默認(rèn)的 TransportFactory, 其最終生成的 Transport 是一個(gè) TSocket 實(shí)例.

那么在 TNonblockingServer 中又會(huì)是怎樣的情況呢?
通過查看代碼我們可以發(fā)現(xiàn), TNonblockingServer.Args 構(gòu)造時(shí), 會(huì)調(diào)用父類 AbstractNonblockingServerArgs 的構(gòu)造器, 其源碼如下:

public AbstractNonblockingServerArgs(TNonblockingServerTransport transport) {
    super(transport);
    this.transportFactory(new TFramedTransport.Factory());
}

可以看到, TNonblockingServer.Args 也會(huì)設(shè)置一個(gè)默認(rèn)的 TransportFactory, 它的類型是 TFramedTransport#Factory, 因此最終 TNonblockingServer 所使用的 Transport 其實(shí)是 TFramedTransport 類型的, 這也就是為什么客戶端也必須使用 TFramedTransport(或TFastFramedTransport) 類型的 Transport 的原因了.

分析到這里, 回過頭來看代碼實(shí)現(xiàn), 我們就發(fā)現(xiàn)其實(shí)代碼中 tArgs.transportFactory(new TFramedTransport.Factory()) 這一句是多余的, 不過為了強(qiáng)調(diào)一下, 我還是保留了.

客戶端實(shí)現(xiàn)
public class NonblockingHelloClient {
    public static final String SERVER_IP = "localhost";
    public static final int SERVER_PORT = 8080;
    public static final int TIMEOUT = 30000;

    public void startClient(String userName) throws Exception {
        TTransport transport = null;

        // 客戶端使用 TFastFramedTransport 也是可以的.
        transport = new TFramedTransport(new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT));
        // 協(xié)議要和服務(wù)端一致
        TProtocol protocol = new TBinaryProtocol(transport);
        HelloWorldService.Client client = new HelloWorldService.Client(
                protocol);
        transport.open();
        String result = client.sayHello(userName);
        System.out.println("Result: " + result);

        transport.close();
    }

    public static void main(String[] args) throws Exception {
        NonblockingHelloClient client = new NonblockingHelloClient();
        client.startClient("XYS");
    }
}
異步客戶端實(shí)現(xiàn)

在 TNonblockingServer 服務(wù)器模型下, 除了使痛不式的客戶端調(diào)用方式, 我們還可以在客戶端中使用異步調(diào)用的方式, 具體代碼如下:

public class NonblockingAsyncHelloClient {
    public static final String SERVER_IP = "localhost";
    public static final int SERVER_PORT = 8080;
    public static final int TIMEOUT = 30000;

    public void startClient(String userName) throws Exception {
        TAsyncClientManager clientManager = new TAsyncClientManager();
        TNonblockingTransport transport = new TNonblockingSocket(SERVER_IP,
                SERVER_PORT, TIMEOUT);

        // 協(xié)議要和服務(wù)端一致
        TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();
        HelloWorldService.AsyncClient client = new HelloWorldService.AsyncClient(
                protocolFactory, clientManager, transport);

        client.sayHello(userName, new AsyncHandler());

        Thread.sleep(500);
    }

    class AsyncHandler implements AsyncMethodCallback {
        @Override
        public void onComplete(String response) {
            System.out.println("Got result: " + response);
        }

        @Override
        public void onError(Exception exception) {
            System.out.println("Got error: " + exception.getMessage());
        }
    }

    public static void main(String[] args) throws Exception {
        NonblockingAsyncHelloClient client = new NonblockingAsyncHelloClient();
        client.startClient("XYS");
    }
}

可以看到, 使用異步的客戶端調(diào)用方式實(shí)現(xiàn)起來就比較復(fù)雜了. 和 NonblockingHelloClient 對(duì)比, 我們可以看到有幾點(diǎn)不同:

異步客戶端中需要定義一個(gè) TAsyncClientManager 實(shí)例, 而同步客戶端模式下不需要.

異步客戶端 Transport 層使用的是 TNonblockingSocket, 而同步客戶端使用的是 TFramedTransport

異步客戶端的 Procotol 層對(duì)象需要使用 TProtocolFactory 來生成, 而同步客戶端需要用戶手動(dòng)生成.

異步客戶端的 Client 是 HelloWorldService.AsyncClient, 而同步客戶的 Client 是 HelloWorldService.Client

最后也是最關(guān)鍵的不同點(diǎn), 異步客戶端需要提供一個(gè)異步處理 Handler, 用于處理服務(wù)器的回復(fù).

我們?cè)賮砜匆幌?AsyncHandler 這個(gè)類. 這個(gè)類是用于異步回調(diào)用的, 當(dāng)我們正常收到了服務(wù)器的回應(yīng)后, Thrift 就會(huì)自動(dòng)回調(diào)我們的 onComplete 方法, 因此我們?cè)谶@里就可以設(shè)置我們的后續(xù)處理邏輯.
當(dāng) Thrift 遠(yuǎn)程調(diào)用服務(wù)器端出現(xiàn)異常時(shí)(例如服務(wù)器未啟動(dòng)), 那么就會(huì)回調(diào)到 onError 方法, 我們?cè)谶@個(gè)方法中就可以做相應(yīng)的錯(cuò)誤處理.

THsHaServer 服務(wù)器模型

Half-Sync/Half-Async, 半同步/半異步服務(wù)器模型, 底層的實(shí)現(xiàn)其實(shí)還是依賴于 TNonblockingServer, 因此它所需要的 Transport 也是 TFramedTransport.

服務(wù)器端實(shí)現(xiàn)
public class HsHaHelloServer {
    public static final int SERVER_PORT = 8080;

    public static void main(String[] args) throws Exception {
        HsHaHelloServer server = new HsHaHelloServer();
        server.startServer();
    }

    public void startServer() throws Exception {
        TProcessor tprocessor = new HelloWorldService.Processor(
                new HelloWorldImpl());

        TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(SERVER_PORT);
        THsHaServer.Args tArgs = new THsHaServer.Args(serverTransport);
        tArgs.processor(tprocessor);
        tArgs.protocolFactory(new TBinaryProtocol.Factory());

        TServer server = new THsHaServer(tArgs);
        server.serve();
    }
}
客戶端實(shí)現(xiàn)

和 NonblockingHelloClient 一致.

參考

Learning-Apache-Thrift

Thrift入門及Java實(shí)例演示

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66763.html

相關(guān)文章

  • 后端必備——數(shù)據(jù)通信知識(shí)(RPC、消息隊(duì)列)一站式總結(jié)

    摘要:具體可以參考消息隊(duì)列之具體可以參考實(shí)戰(zhàn)之快速入門十分鐘入門阿里中間件團(tuán)隊(duì)博客是一個(gè)分布式的可分區(qū)的可復(fù)制的基于發(fā)布訂閱的消息系統(tǒng)主要用于大數(shù)據(jù)領(lǐng)域當(dāng)然在分布式系統(tǒng)中也有應(yīng)用。目前市面上流行的消息隊(duì)列就是阿里借鑒的原理用開發(fā)而得。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問題,目前已經(jīng)開源,會(huì)一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snail...

    Kahn 評(píng)論0 收藏0
  • Thrift RPC使用入門

    摘要:使用入門目前項(xiàng)目使用來作為服務(wù)之間調(diào)用的底層框架,組內(nèi)人員說可以嘗試使用替換他,性能更出色,且使用更方便。所以找了一些資料,為做一個(gè)入門??蛻舳丝蛻舳艘虢涌?,使用生成代理,來訪問遠(yuǎn)程服務(wù)對(duì)象。 thrift使用入門 目前項(xiàng)目使用hessian來作為服務(wù)之間RPC調(diào)用的底層框架,組內(nèi)人員說可以嘗試使用thrift替換他,thrift性能更出色,且使用更方便。所以找了一些資料,為thri...

    junfeng777 評(píng)論0 收藏0
  • Spring Boot 中使用 thrift 入門

    摘要:簡(jiǎn)介是什么是一個(gè)軟件框架,用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā)。的功能允許定義一個(gè)簡(jiǎn)單的定義文件中的數(shù)據(jù)類型和服務(wù)接口,以作為輸入文件,編譯器生成代碼用來方便地生成客戶端和服務(wù)器通信的無縫跨編程語言。 Thrift 簡(jiǎn)介 Thrift 是什么 Thrift是一個(gè)軟件框架,用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā)。它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎,以構(gòu)建在 C++, Java, Go,P...

    cnio 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<