10.Spring Cloud Alibaba 網(wǎng)關(guān)全局過濾

目錄:Spring Cloud Alibaba 教程
上一篇:9.Spring Cloud Alibaba 路由網(wǎng)關(guān)(Gateway)
下一篇:11. Spring Cloud Alibaba 服務(wù)配置

概述


全局過濾器作用于所有的路由闪朱,不需要單獨(dú)配置粘优,我們可以用它來實(shí)現(xiàn)很多統(tǒng)一化處理的業(yè)務(wù)需求,比如權(quán)限認(rèn)證钞瀑,IP 訪問限制等等毕箍。

注意:截止2019年06月,Spring Cloud Gateway 正式版為 2.0.2 其文檔并不完善,并且有些地方還要重新設(shè)計(jì)判耕,這里僅提供一個(gè)基本的案例

詳見:Spring Cloud Gateway Documentation

聲明周期



Spring Cloud Gateway 基于 Project Reactor 和 WebFlux,采用響應(yīng)式編程風(fēng)格翘骂,打開它的 Filter 的接口 GlobalFilter 你會(huì)發(fā)現(xiàn)它只有一個(gè)方法 filter壁熄。

創(chuàng)建全局過濾器


實(shí)現(xiàn) GlobalFilter, Ordered 接口并在類上增加 @Component 注解就可以使用過濾功能了帚豪,非常簡(jiǎn)單方便

package com.wsl.hello.gateway.filters;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Map;

/**
 * 鑒權(quán)過濾器
 */
@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("token");

        if (token == null || token.isEmpty()) {
            ServerHttpResponse response = exchange.getResponse();

            // 封裝錯(cuò)誤信息
            Map<String, Object> responseData = Maps.newHashMap();
            responseData.put("code", 401);
            responseData.put("message", "非法請(qǐng)求");
            responseData.put("cause", "Token is empty");

            try {
                // 將信息轉(zhuǎn)換為 JSON
                ObjectMapper objectMapper = new ObjectMapper();
                byte[] data = objectMapper.writeValueAsBytes(responseData);

                // 輸出錯(cuò)誤信息到頁面
                DataBuffer buffer = response.bufferFactory().wrap(data);
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
                return response.writeWith(Mono.just(buffer));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        return chain.filter(exchange);
    }

    /**
     * 設(shè)置過濾器的執(zhí)行順序
     *
     * @return
     */
    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}
目錄結(jié)構(gòu)

測(cè)試過濾器


瀏覽器訪問:http://localhost:9000/nacos-consumer/test/app/name 網(wǎng)頁顯示

瀏覽器訪問:http://localhost:9000/nacos-consumer/test/app/name?token=123456 網(wǎng)頁顯示

Hello Nacos Discovery nacos-consumer i am from port 8082

附:Spring Cloud Gateway Benchmark


Spring 官方人員提供的網(wǎng)關(guān)基準(zhǔn)測(cè)試報(bào)告 GitHub

Proxy Avg Latency Avg Req/Sec/Thread
gateway 6.61ms 3.24k
linkered 7.62ms 2.82k
zuul 12.56ms 2.09k
none 2.09ms 11.77k
說明
  • 這里的 Zuul 為 1.x 版本,是一個(gè)基于阻塞 IO 的 API Gateway
  • Zuul 已經(jīng)發(fā)布了 Zuul 2.x草丧,基于 Netty狸臣,非阻塞的,支持長(zhǎng)連接昌执,但 Spring Cloud 暫時(shí)還沒有整合計(jì)劃
  • Linkerd 基于 Scala 實(shí)現(xiàn)的烛亦、目前市面上僅有的生產(chǎn)級(jí)別的 Service Mesh(其他諸如 Istio、Conduit 暫時(shí)還不能用于生產(chǎn))懂拾。

目錄:Spring Cloud Alibaba 教程
上一篇:9.Spring Cloud Alibaba 路由網(wǎng)關(guān)(Gateway)
下一篇:11. Spring Cloud Alibaba 服務(wù)配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末煤禽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子岖赋,更是在濱河造成了極大的恐慌檬果,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唐断,死亡現(xiàn)場(chǎng)離奇詭異选脊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)脸甘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門知牌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斤程,你說我怎么就攤上這事角寸。” “怎么了忿墅?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵扁藕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我疚脐,道長(zhǎng)亿柑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任棍弄,我火速辦了婚禮望薄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呼畸。我一直安慰自己痕支,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布蛮原。 她就那樣靜靜地躺著卧须,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上花嘶,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天笋籽,我揣著相機(jī)與錄音,去河邊找鬼椭员。 笑死车海,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隘击。 我是一名探鬼主播侍芝,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼闸度!你這毒婦竟也來了竭贩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤莺禁,失蹤者是張志新(化名)和其女友劉穎留量,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哟冬,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡楼熄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浩峡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片可岂。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翰灾,靈堂內(nèi)的尸體忽然破棺而出缕粹,到底是詐尸還是另有隱情,我是刑警寧澤纸淮,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布平斩,位于F島的核電站,受9級(jí)特大地震影響咽块,放射性物質(zhì)發(fā)生泄漏绘面。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一侈沪、第九天 我趴在偏房一處隱蔽的房頂上張望揭璃。 院中可真熱鬧,春花似錦亭罪、人聲如沸瘦馍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扣墩。三九已至哲银,卻和暖如春扛吞,著一層夾襖步出監(jiān)牢的瞬間呻惕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工滥比, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亚脆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓盲泛,卻偏偏與公主長(zhǎng)得像濒持,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寺滚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容