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等