1. 程式人生 > >Spring Boot使用thrift 入門

Spring Boot使用thrift 入門

thrift是一個RPC框架,我們使用SpringBoot可以對外暴露http介面,但是系統內部呼叫如果需要較高的效率,需要使用RPC介面,因此我們會需要使用thrift 再暴露一些內部介面

假設我們有一個service類,裡面實現了一個login方法,如果要暴露http的介面,我們需要使用springboot做一個controller,然後在controller裡呼叫這個login,這樣完成一個http介面

但如果我們想對外暴露RPC的login介面,這就需要使用thrift 

前提:新增依賴

<dependency>
    <groupId>org.apache.thrift</
groupId> <artifactId>libthrift</artifactId> <version>0.10.0</version> </dependency>

使用thrift主要分為如下幾步

1、生成thrift 介面檔案(這個介面檔案不是自己寫的java類,是需要使用thrift工具生成的)

由於這個介面檔案是thrift 工具自動生成的,因此我們需要先用thrift 的描述語言寫一下這個介面的定義,然後再用thrift 工具生成

1.1寫介面描述檔案

介面描述檔案是一個字尾名為.thrift的檔案,這面這個檔案是RPCNetAuthService.thrift,是一個介面描述檔案,namespace是最後生成的介面檔案的包名

namespace java com.xxx.mbe.thrift.rpcInterface.auth
service RPCNetAuthService{
    bool login(1:string userAccount,2:string password)
}

1.2生成介面類

根據RPCNetAuthService.thrift生成介面類有兩種方式,一種是下載thrift.exe,使用它的命令生成,另外一種是使用IEDA的thrift外掛來生成

1.2.1 使用thrift.exe生成

網上下載thrift.exe,假設放到了D:\thrift\thrift.exe,將RPCNetAuthService.thrift也放到這個目錄

開啟cmd視窗 執行

cd D:\thrift

thrift --gen java RPCNetAuthService.thrift

這樣在這個目錄下會生成RpcNetAuthService.java,這個就是生成的介面類

1.2.2使用外掛生成

開啟File->Settings->Plugins->搜尋thrift,安裝外掛

然後配置外掛(我專門建立了一個thrift專案,在這個專案裡儲存了所有的thrift檔案,在ProjectStructure裡配置了thrift和輸入路徑輸入語言型別,這樣編譯後會自動將.thrift檔案輸出為對應的java檔案)

將輸出的RpcNetAuthService.java放到一個公共地方(客戶端和伺服器端都能用到)

2、伺服器端實現thrift 介面

下面伺服器端要實現這個介面,新建一個類RPCNetAuthServiceImpl

import com.xxx.mbe.auth.service.NetAuthService;
import com.xxx.mbe.auth.service.impl.NetAuthServiceImpl;
import com.xxx.mbe.thrift.rpcInterface.auth.RPCNetAuthService;
import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

/**
 * Created by Test on 2017/7/10.
 */
@Controller
public class RPCNetAuthServiceImpl implements RPCNetAuthService.Iface {
    private static final Logger logger = LoggerFactory.getLogger(RPCNetAuthServiceImpl.class);

    @Autowired
    private NetAuthService netAuthService =new NetAuthServiceImpl();//這裡本來想用注入的方法使用,但是service啟動的時候是靜態類直接new的,所以沒法注入,所以這裡就new了
    @Override
    public boolean login(String userAccount, String password) throws TException {
  

        return netAuthService.login(userAccount,password);//這裡呼叫了Service的方法
    }
}

3、伺服器端啟動服務

啟動服務程式碼如下,在main方法中呼叫下

	private  static void   startRPCServer()
	{
		try {
			// 設定協議工廠為 TBinaryProtocol.Factory
			TBinaryProtocol.Factory proFactory = new TBinaryProtocol.Factory();
			// 關聯處理器與 Hello 服務的實現
			TMultiplexedProcessor processor = new TMultiplexedProcessor();
			TServerTransport t = new TServerSocket(9090);
			TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(t).processor(processor));
			processor.registerProcessor(RPCNetAuthService.class.getSimpleName(), new RPCNetAuthService.Processor<RPCNetAuthService.Iface>(new RPCNetAuthServiceImpl()));
//         TSimpleServer server = new TSimpleServer(new Args(t).processor(processor));
			System.out.println("the serveris started and is listening at 9090...");
			server.serve();
		} catch (TTransportException e) {
			e.printStackTrace();
		}
	}


這樣服務就啟動了,下面需要客戶端呼叫

4、客戶端呼叫介面

首先先建立一個client類

import com.xxx.mbe.thrift.rpcInterface.auth.RPCAuthService;
import com.xxx.mbe.thrift.rpcInterface.auth.RPCNetAuthService;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TMultiplexedProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransportException;
import org.springframework.boot.autoconfigure.security.SecurityProperties;

/**
 * Created by Test on 2017/7/10.
 */
public class AuthClient {

    private  RPCNetAuthService.Client rpcNetAuthService;
    private TBinaryProtocol protocol;
    private TSocket transport ;
    public RPCAuthService.Client getRpcAuthService() {
        return rpcAuthService;
    }

    public RPCNetAuthService.Client getRpcNetAuthService() {
        return rpcNetAuthService;
    }

    public  void  open() throws TTransportException {
        transport.open();
    }
    public  void  close()
    {
        transport.close();
    }
    public   AuthClient() throws TTransportException {
        transport = new TSocket("localhost",9090);
        protocol = new TBinaryProtocol(transport);  

        TMultiplexedProtocol mp2 = new TMultiplexedProtocol(protocol, RPCNetAuthService.class.getSimpleName());
        rpcNetAuthService = new RPCNetAuthService.Client(mp2);
    }
}


在使用的地方如下呼叫

        AuthClient client = new  AuthClient();
        client.open();
            boolean loginResult = client.getRpcNetAuthService().login(userEntity.getUserName(),userEntity.getPassword());
        client.close();

這樣就可以呼叫伺服器端的方法了

相關推薦

Spring MVC入門實例

not 入門實例 mod 註解 ner art adding pac eclipse 1.web.xml配置 <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www

spring boot入門

pom.xml evel 建議 主函數 log 16px eight dev 連接數 一、對spring boot的解釋:(百度百科) Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該

spring boot 入門

pack 負責 aml tools 讀取 點擊 roo depend 團隊 什麽是spring boot Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人

Java - Struts框架教程 Hibernate框架教程 Spring框架入門教程(新版) sping mvc spring boot spring cloud Mybatis

java ee cloud pac .cn java get pin nat 輕量級 https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html

Spring Security入門(2-3)HttpSecurity的使用

登錄 一個 最終 指定 ebs row pat ati 是我 到目前為止我們的 SecurityConfig 只包含了關於如何驗證我們的用戶的信息。 Spring Security怎麽知道我們想對所有的用戶進行驗證?Spring Security怎麽知道我們需要支持基於表單

Spring Boot入門——JDBCTemplate使用及其相關問題解決

oca accounts abs method const error mas exist release 1、在pom.xml文件中引入相應依賴 <!-- mysql依賴 --> <dependency> <

Spring Boot入門——集成Mybatis

style help 獲取自增 文件 依賴 添加 ice 配置 font 步驟: 1、新建maven項目 2、在pom.xml文件中引入相關依賴 3、創建啟動類App.java,添加自動掃描mapper 4、在application.properties文件中添加配置信息

Spring Boot入門——全局異常處理

app 異常 span () system depend 關閉 font exec 1、後臺處理異常   a、引入thymeleaf依賴 <!-- thymeleaf模板插件 --> <dependency> <

一、spring boot入門(web+freemarker)

value mls mar 使用 blog doctype web app span 啟動 1.配置maven文件pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://

像屎一樣的 Spring Boot入門,總算有反應了

zone context frame .org ret clas schema -1 eating 我特麽最煩的就是現在Java不知道抽什麽風,喜歡用maven這種,怎麽搞都會有錯誤提示的玩意。搞個spring boot,官方的所謂http://start.spring.i

Spring Boot 入門(四)微服務之 Config Server 統一配置中心

bootstra pan pat 默認 star default client efault localhost 一、目錄結構 二、pom文件 <!-- 配置服務依賴 --> <dependency> &l

Spring Boot入門第二天:一個基於Spring Boot的Web應用,使用了Spring Data JPA和Freemarker。

per pan let mysq 應用 posit ble host thead 今天打算從數據庫中取數據,並展示到視圖中。不多說,先上圖: 第一步:添加依賴。打開pom.xml文件,添加必要的依賴,完整代碼如下: <?xml version="1.0" enco

Spring Cloud 入門教程(三): 配置自動刷新

入門 stc pro 解決方案 con log clas ring color 之前講的配置管理, 只有在應用啟動時會讀取到GIT的內容, 之後只要應用不重啟,GIT中文件的修改,應用無法感知, 即使重啟Config Server也不行。 比如上一單元(Spring Clo

Spring Cloud 入門教程(四): 分布式環境下自動發現配置服務

.html article png discover ice conf label tail 註釋 前一章, 我們的Hello world應用服務,通過配置服務器Config Server獲取到了我們配置的hello信息“hello world”. 但自己的配置文件中必須配

《01.Spring Boot連載:Spring Boot入門介紹》

spring boot maven 1 Spring Boot的概述Spring Boot是開發者和Spring 本身框架的中間層,幫助開發者統籌管理應用的配置,提供基於實際開發中常見配置的默認處理(即習慣優於配置),簡化應用的開發,簡化應用的運維;總的來說,其目的Spring Boot就是為了對Ja

Spring Boot 入門之持久層篇(三)

imp 配置文件 bat catch map ann 文件 save values 原文地址:Spring Boot 入門之持久層篇(三) 博客地址:http://www.extlight.com 一、前言 上一篇《Spring Boot 入門之 Web 篇(二)》介紹

Spring Boot入門(四)——使用模板FreeMaker

junit boot.s char pack utf put 常見 節點 簡單的 這周主要學習怎麽在Spring Boot中使用模板引擎FreeMaker,主要從以下幾方面進行學習。 (1) freemarker介紹: FreeMarker是一款模板引擎: 即

Spring boot入門到精通視頻教程

圖片 進階 內存 技術 後臺 har class cloud init 14套java精品高級架構課,緩存架構,深入Jvm虛擬機,全文檢索Elasticsearch,Dubbo分布式Restful 服務,並發原理編程,SpringBoot,SpringCloud,Rock

1.Spring框架入門

-- doc face ref cas 步驟 div 路徑 ica **Spring框架的IOC核心功能快速入門(必須掌握開發的步驟)** 0. 什麽是IOC的功能? * IOC -- Inverse of Control,控制反轉,將對象的創建權反轉給Spr

spring boot入門 -- 介紹和第一個例子

image 目錄結構 scope for odi 服務架構 引用 ima 要求 轉載:https://www.cnblogs.com/junyang/p/8151802.html “越來越多的企業選擇使用spring boot 開發系統,spring boot牛在什麽地方?