Thrift筆記(一)--Hello Demo

Thrift是一個RPC框架java

1. 用IDL定義好實體和服務框架,如實體字段名,類型等。服務名,服務參數,返回值等apache

2. 經過編譯器或者說代碼生成器生成RPC框架代碼json

IDL語法,代碼生成器的安裝使用能夠在官網查框架

這裏參考了一個網上的Demo,忘了出處了socket

Test.thriftui

namespace java com.gxf.thrift

enum RequestType {
   SAY_HELLO,   //問好
   QUERY_TIME,  //詢問時間
}

struct Request {
   1: required RequestType type;  // 請求的類型,必選
   2: required string name;       // 發起請求的人的名字,必選
   3: optional i32 age;           // 發起請求的人的年齡,可選
}

exception RequestException {
   1: required i32 code;
   2: optional string reason;
}

// 服務名
service HelloWordService {
   string doAction(1: Request request) throws (1:RequestException qe); // 可能拋出異常。
}

使用代碼生成器,生成框架代碼:thrift --gen java Test.thrift spa

Server端邏輯實現,須要實現XXXService.Iface接口.net

HelloServiceImpl.javacode

public class HelloWordServiceImpl implements HelloWordService.Iface {

    // 實現這個方法完成具體的邏輯。
    public String doAction(Request request)
            throws RequestException, org.apache.thrift.TException {
        System.out.println("Get request: " + request);
        if (StringUtils.isBlank(request.getName()) || request.getType() == null) {
            throw new com.gxf.thrift.RequestException();
        }
        String result = "Hello, " + request.getName();
        if (request.getType() == com.gxf.thrift.RequestType.SAY_HELLO) {
            result += ", Welcome!";
        } else {
            result += ", Now is " + new Date().toLocaleString();
        }
        return result;

    }
}

Server端啓動代碼HelloServer.javaserver

import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;

import java.net.ServerSocket;

public class HelloWordServer {

    public static void main(String[] args) throws Exception {
        ServerSocket socket = new ServerSocket(7912);
        TServerSocket serverTransport = new TServerSocket(socket);
        TBinaryProtocol.Factory proFactory = new TBinaryProtocol.Factory();

        /**
         * 關聯處理器與GreetingService服務實現
         */
        TProcessor processor = new HelloWordService.Processor(new HelloWordServiceImpl());

        TThreadPoolServer.Args serverArgs = new TThreadPoolServer.Args(serverTransport);
        serverArgs.processor(processor);
        serverArgs.protocolFactory(proFactory);
        TServer server = new TThreadPoolServer(serverArgs);
        System.out.println("Start server on port 7912...");

        server.serve();
    }

}

客戶端代碼

HelloWorldClient.java

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

public class HelloWordClient {
    public static void main(String[] args) throws Exception {
        TTransport transport = new TSocket("127.0.0.1", 7912);
        TProtocol protocol = new TBinaryProtocol(transport);

        // 建立client
        com.gxf.thrift.HelloWordService.Client client = new com.gxf.thrift.HelloWordService.Client(protocol);

        transport.open();  // 創建鏈接

        // 第一種請求類型
        com.gxf.thrift.Request request = new com.gxf.thrift.Request()
                .setType(com.gxf.thrift.RequestType.SAY_HELLO).setName("guanxiangfei").setAge(24);
        System.out.println(client.doAction(request));

        // 第二種請求類型
        request.setType(com.gxf.thrift.RequestType.QUERY_TIME).setName("guanxiangfei");
        System.out.println(client.doAction(request));

        transport.close();  // 請求結束,斷開鏈接
    }

}

 

客戶端定義好請求實體,經過RPC請求服務

總結:

1. Thrift不單單提供了RPC,也提供了序列化反序列化框架

2. 序列化框架有多種序列化方式能夠選擇,二進制,json等

3. RPC傳輸方式有Socket, SockectChannel, File等

相關文章
相關標籤/搜索