1.前言
使用thrift心得:
(1)thrift是一個RPC的框架 ,RPC是遠程過程調用協議;用於進行可擴展且跨語言的服務的開發,以構建在C++、Java、Python、PHP、Ruby、Erlang、
Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、and OCaml這些編程語言的服務,thrift實際上是實現了C/S模式,通過代碼生成工具將接口定
義文件生成服務器端和客戶端代碼(可以為不同語言),從而實現服務端和客戶端跨語言的支持。用戶在thrift描述文件中聲明自己的服務,這些服務經過編譯后會
生成相應語言的代碼文件,然后用戶實現服務(客戶端調用服務,服務器端提供服務)便可以了。其中protocol(協議層,定義數據傳輸格式,可以為二進制或者XML等)
和transport(傳輸層,定義數據傳輸方式,可以為TCP/IP傳輸,內存共享或者文件共享等)被用作運行時庫
(2)thrift類似於一個腳本編譯軟件用來編譯thrift腳本轉成相應的Java文件,用於共同約束客戶端和服務端關於 參數、接口、異常等數據的使用,像一個中間件一樣;
(3)服務端需要設置端口號,需要實例腳本的service 【類似於接口】后映射相對應的具體實現類,具體實現類需要繼承寫該service並重寫該service接口的方法;
(4)客戶端需要輸入服務端IP地址和端口號連接,連接成功后需要實例service,並設置參數,這些都需要thrift腳本轉成相應的Java文件的約束,具體使用則直接調用即可,
語法的使用需要配合thrift依賴的方法使用;
(5)客戶端使用結束后,記得關閉連接。
2.
需要提前編譯thrift腳本,window系統可在文件夾新建一個后綴是 .thrift 的文件 ,我這里命名為 login.thrift
內容:
namespace java cn.cen.thrift struct MyRequest{ 1: string username; 2: string psw; } exception MyRequestException{ 1: required i32 code; 2: optional string reason; } //服務名 service MyLoginService{ string doLogin(1: MyRequest myRequest) throws (1:MyRequestException mrqe);//可能拋出異常 }
解釋:
(1)namespace java cn.cen.thrift 的意思是說 【命名空間】【編譯語言】【文件夾路徑】
(2)struct 是塊的意思 ,相當於poji類的使用
(3)exception 是異常類型 , required 是指必須有的參數 ,optional 是可選參數,可有可無
(4)service 是服務類型 ,類似於接口 的使用 ,里面是方法 ,string doLogin 意思是方法doLogin 返回string 類型數據 ,括號的是參數
(5)所有的參數 都需要寫序號
3.
cmd打開指令框,進入有login.thrift這個文件的文件夾,后執行thrift編譯指令
注意,thrift-0.9.3 是exe文件的名字,是可變的,很具實際輸入 -gen java 意思是編譯成java語言 ,后面的是文件名
編譯后會在同文件夾生成一個gen-java文件夾 ,根據命名空間的參數一層層建立文件夾,里面會生成多個java文件
4.
新建一個maven項目,
pom.xml引入依賴包
<!-- thrift依賴包 ,這個不可缺-->
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.3</version>
</dependency>
<!-- 下面兩個日志依賴包,可有可無,雖然不影響thrift,
但是最好有,不然會有警告提示-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.21</version>
</dependency>
5.
項目結構
6.
建立 具體實現類

package doThrift; import org.apache.thrift.TException; import thrift.MyLoginService; import thrift.MyRequest; import thrift.MyRequestException; import java.util.ArrayList; /** * 具體實現類 */ public class LoginServiceImpl implements MyLoginService.Iface { @Override public String doLogin(MyRequest myRequest) throws MyRequestException, TException { System.out.println("設施具體方法位置"); System.out.println(myRequest.getUsername()); System.out.println(myRequest.getPsw()); return myRequest.getUsername() + myRequest.getPsw(); } }
7.
建立 服務端

package server; import doThrift.LoginServiceImpl; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TSimpleServer; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TTransportException; import thrift.MyLoginService; import java.io.IOException; import java.net.ServerSocket; public class MyServer { public static void main(String[] args) throws IOException, TTransportException { //transport ,建立服務端socket的接收,設置端口號 ServerSocket serverSocket = new ServerSocket(8888); TServerSocket tServerSocket = new TServerSocket(serverSocket); //processor處理器 , 實例thrift腳本的service類型數據,生成處理器,映射相應的具體實現類【即具體業務】 MyLoginService.Processor processor = new MyLoginService.Processor(new LoginServiceImpl()); TServer.Args tServerArgs = new TServer.Args(tServerSocket); //在總線添加子處理器 tServerArgs.processor(processor); //server TServer server = new TSimpleServer(tServerArgs); System.out.println("服務端啟動"); //啟動服務 server.serve(); } }
可以直接運行,效果類似於tomcat的啟動
8.
建立 客戶端,並調用服務端 MyLoginService 接口 ,的 doLogin()方法

package client; 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 thrift.MyLoginService; import thrift.MyRequest; public class MyClient { public static void main(String[] args){ TTransport tTransport = null; try { //創建transport,,其實就是設置IP地址和端口號 tTransport = new TSocket("localhost",8888); // 創建TProtocol 協議要與服務端一致 TProtocol tProtocol = new TBinaryProtocol(tTransport); //創建client,,其實就是將thrift腳本的service類型數據實例化,相當於new一個對象 MyLoginService.Client client = new MyLoginService.Client(tProtocol); //建立連接 tTransport.open(); //設置傳入參數,相當於設置pojo類 MyRequest myRequest = new MyRequest().setUsername("愛你喲").setPsw("123456"); //client 調用 server端的方法 ,其實就是調用thrift腳本的service類型里的方法 String res = client.doLogin(myRequest); System.out.println("客戶端返回結果是:"+res); }catch (Exception e){ e.printStackTrace(); }finally { //關閉連接 tTransport.close(); } } }
9.
運行客戶端 ,控制台打印信息
服務端打印的信息:
--------------------
參考博客原址: https://www.jianshu.com/p/166efddfcb20