spring cloud gateway 二次開發(fā)之 配置默認filter

在開發(fā)網(wǎng)關的時候,我們可以為我們的所有路由器定義同樣的filter,這樣就不用為每個route單獨進行配置,有幾種實現(xiàn)方式:
一:通過配置繼承了AbstractGatewayFilterFactory的bean來進行

在配置文件中增加default-filters

spring:
  application:
    name: gateway
  profiles:
    active: prod
  cloud:
    gateway:
      default-filters:
        - name: ModifyRequestBody
        - name: MyLog
      routes:
        - id: route1
          uri: lb://route1
          predicates:
            - Path=/route1/**
        - id: route2
          uri: lb://route2
          predicates:
            - Path=/route2/**

ModifyRequestBodyMyLog 是過濾器的名字,他們都繼承了AbstractGatewayFilterFactory,這樣gateway在啟動的時候,就會把配置的名字加上GatewayFilterFactory的后綴作為bean的名字進行加載,在這個例子中就是 ModifyRequestBodyGatewayFilterFactoryMyLogGatewayFilterFactory 這個兩個bean,其中ModifyRequestBodyGatewayFilterFactory是gateway自帶的類,MyLogGatewayFilterFactory是我自己實現(xiàn)的類,大家可以通過這樣的方式自定義自己的過濾器。

但這種方式有一個問題,要注意一下,眾所周知,路由器除了配置文件,還可以通過java 代碼的方式進行配置,如下:

@Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/test/**")
                        .uri("lb://test")
                        .order(0)
                        .id("test")
                )
                .build();
    }

或者我們也可以自己進行動態(tài)路由的配置,網(wǎng)上有很多例子,我就不貼出來了

而上邊那種通過yml或properties文件配置默認過濾器的方式,對 java代碼配置的路由器不生效
只對配置文件和動態(tài)配置的路由生效(這個坑我進行了一上午的嘗試對比才發(fā)現(xiàn))

因為通過使用代碼定義路由使用的是 RouteLocator 這個類
而通過配置文件或者外部存儲器配置路由使用的是 RouteDefinitionLocator 的實現(xiàn)類進行的,有 4個實現(xiàn)類:

  • PropertiesRouteDefinitionLocator ,從配置文件( 例如,YML / Properties 等 ) 讀取
  • RouteDefinitionRepository ,從存儲器( 例如,內存 / Redis / MySQL 等 )讀?。J使用的是從內存)
  • DiscoveryClientRouteDefinitionLocator ,從注冊中心( 例如,Eureka / Zookeeper 等 )讀取
  • CompositeRouteDefinitionLocator ,組合多種 RouteDefinitionLocator 的實現(xiàn)

這里應該是,配置gateway自帶的過濾器還是生效的,但是自己繼承了AbstractGatewayFilterFactory的類就不生效,因為之前的項目配置過自帶的Hystrix過濾器生效了

如果想讓自己的過濾器對所有的路由生效,就用到這第二種方式

二:通過實現(xiàn)GlobalFilter的方式進行,
這樣的過濾器對所有的路由都生效,而想要gateway中已有的過濾器功能,可以把其中的代碼邏輯扣出來放進自己的類中。可以參照這篇 《spring cloud gateway 二次開發(fā)之 處理 requestBody》 http://www.itdecent.cn/p/a5fc8039d236

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容