1. 程式人生 > >springcloud2+gateway閘道器配置中心2(包含熔斷,jwt認證,限流)

springcloud2+gateway閘道器配置中心2(包含熔斷,jwt認證,限流)

下面介紹1未講完的閘道器功能

   1重試功能,配置如下

       

這裡可以不寫實現類,採用預設的方式配置,然後傳送一個http的GET請求,試著斷開服務端檢視後臺:

 證明配置正確,起作用了!

2Jwt攔截器過濾

直接配置在規則路由routes下面,然後寫實現類

所寫的實體類都是要整合AbstractGatewayFilterFactory閘道器攔截器工廠介面。因為都是在filters攔截器下的配置屬性

這裡為啥不做認證配置呢,因為我的專案目前基礎資訊的auth2的認證服務和資源服務都是放在了一個服務上,所以這裡面只需要對請求頭攜帶token判斷,簡化了閘道器所需要的資訊,但也帶出來一個問題,如何來讓未攜帶token認證服務通過閘道器介面呢,目前的設計思路如下

1直接在啟動類手寫Bean類,可以繞過配置服務的規則路由,這樣就可以拿到認證Token

2單獨為login配置一套,參照認證服務簡單的模板,2種方法效果一致

3限流

  

限流幾種方式:介面限流,使用者限流,IP限流

建立配置檔案GatewayConfiguration如下

package com.wjx.gateway.Controller.common.config;

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;

/**
 * 配置限流key
 */
@Configuration
public class GatewayConfiguration {
    /**
     * 介面限流操作
     * @return
     */
    @Bean(name="apiKeyResolver")
    public KeyResolver apiKeyResolver() {

        //根據api介面來限流
        return exchange ->
             Mono.just(exchange.getRequest().getPath().value());

    }

    /**
     * ip限流操作
     * @return
     */
    @Bean
    public KeyResolver ipKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
    }

    /**
     * 使用者限流
     * 使用這種方式限流,請求路徑中必須攜帶userId引數。
     * @return
     */
//    @Bean
//    KeyResolver userKeyResolver() {
//        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
//    }
}

其實這樣配置就應該可以實現限流的目的了(由於本人電腦沒安裝JMTER,效能有點差跑不動這幾個專案了,沒測試)

借鑑其他人寫的方法,其實也可以對限流進行具體的,因為不能測試,所以沒做深入研究,下面只提供方法

去掉預設的限流限定

繼承AbstractGatewayFilterFactory工廠類,寫一個攔截器類和一個限流類

這樣可以比配置檔案更加做到細緻,如果有人做到了這一步,歡迎把測試結果告訴我,謝謝!!!