目前項目使用hessian來做爲服務之間RPC調用的底層框架,組內人員說能夠嘗試使用thrift替換他,thrift性能更出色,且使用更方便。因此找了一些資料,爲thrift作一個入門。html
thrift的服務描述使用IDL(服務描述語言),而後提供一個代碼生成工具,將之轉化成不一樣語言的源代碼文件,服務端實現該接口,客戶端經過該接口進行服務調用。java
接口描述語言
thrift本身定義了接口描述語言,以下,更多的參考 Thrift IDL,或者這篇文章apache
namespace java com.tongyin.thrift.demo service HelloWorldServcie{ string sayHello(1:string username) }
使用官方提供的代碼生成工具
首先官方去下載代碼生成工具(提供了多個語言的版本),而後運行服務器
thrift -r --gen java demo.thrift
下面是生成的java版本的java接口文件,沒有貼完,給了個大概框架
package com.szp.mvp.thrift.demo1; @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"}) @javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)", date = "2017-09-26") public class HelloWorldServcie { public interface Iface { public String sayHello(String username) throws org.apache.thrift.TException; }
服務端
服務器端要實現接口對應的方法工具
//HelloWorldImpl.java public class HelloWorldImpl implements HelloWorldServcie.Iface { public String sayHello(String username)throws TException{ System.out.println("server:" + username); return "Hi, "+ username; } }
接口實現了,須要將該實現暴露出去,這裏又涉及了不少Thrift的類,監聽端口.這裏須要研究下如何經過一個端口暴率多個服務類,否則對端口資源太浪費。性能
public class HelloServerDemo { public static final int SERVER_PORT=7911; public void startServer(){ try{ System.out.println("Thrift TThreadPoolServer start..."); TProcessor tprocessor = new HelloWorldServcie.Processor<HelloWorldServcie.Iface>(new HelloWorldImpl()); TServerSocket serverTransport = new TServerSocket(SERVER_PORT); TThreadPoolServer.Args ttpsArgs = new TThreadPoolServer.Args(serverTransport); ttpsArgs.processor(tprocessor); ttpsArgs.protocolFactory(new TBinaryProtocol.Factory()); TServer server = new TThreadPoolServer(ttpsArgs); server.serve(); }catch (Exception e){ System.out.println("Server start error!!!"); e.printStackTrace(); } } public static void main(String[] args){ HelloServerDemo server = new HelloServerDemo(); server.startServer(); } }
客戶端
客戶端引入接口,使用thrift生成代理,來訪問遠程服務對象。ui
public class HelloClientDemo { public static final String SERVER_IP="127.0.0.1"; public static final int SERVER_PORT=7911; public static final int TIMEOUT=30000; public void startClient(String userName){ TTransport transport = null; try{ transport = new TSocket(SERVER_IP,SERVER_PORT,TIMEOUT); TProtocol protocol = new TBinaryProtocol(transport); HelloWorldServcie.Client client = new HelloWorldServcie.Client(protocol); transport.open();; String result = client.sayHello(userName); System.out.println("Thrify client result = " + result); }catch(TTransportException e){ e.printStackTrace(); }catch(TException e1){ e1.printStackTrace(); }finally{ if(null !=transport){ transport.close(); } } } public static void main(String[] args){ HelloClientDemo client = new HelloClientDemo(); client.startClient("Linda"); } }