Thrift框架-具體使用


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();
    }
}
View Code

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();
    }


}
View Code

 

可以直接運行,效果類似於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();
        }
    }
}
View Code

9.

運行客戶端 ,控制台打印信息

 

 

 服務端打印的信息:

 

 

 

--------------------

 

參考博客原址:  https://www.jianshu.com/p/166efddfcb20

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM