在開發(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/**
ModifyRequestBody 和 MyLog 是過濾器的名字,他們都繼承了AbstractGatewayFilterFactory,這樣gateway在啟動的時候,就會把配置的名字加上GatewayFilterFactory的后綴作為bean的名字進行加載,在這個例子中就是 ModifyRequestBodyGatewayFilterFactory 和 MyLogGatewayFilterFactory 這個兩個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