网关过滤器工厂
常用的filters配置
filters:
- AddRequestHeader=X-Request-Foo, Bar
- SetRequestHeader=X-Response-Foo, Bar
- RemoveRequestHeader=X-Request-Foo
- RequestHeaderToRequestUri=X-New-Url
- AddResponseHeader=X-Response-Foo, Bar
- SetResponseHeader=X-Response-Foo, Bar
- RemoveResponseHeader=X-Response-Foo
- RewriteResponseHeader=X-Response-Foo, , password=[^&]+, password=***
- AddRequestParameter=foo, bar
- PreserveHostHeader 将检查的请求属性,以确定是否应发送原始主机头,而不是http客户端确定的主机头。
- SecureHeaders 为请求头添加安全相关的属性
- PrefixPath=/mypath 裁剪路径前缀
- StripPrefix=2 裁剪路径的层级个数
- RewritePath=/foo/(?
- RedirectTo=302, http://acme.org
- SetPath=/{segment}
- SaveSession
- SetStatus=401
filters:
- name: Hystrix
args:
name: fetchIngredients
fallbackUri: forward:/fallback
filters:
- name: Retry
args:
retries: 3
statuses: BAD_GATEWAY
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
filters:
- name: FallbackHeaders
args:
executionExceptionTypeHeaderName: Test-Header
filters:
- name: RequestSize
args:
maxSize: 5000000
自定义网关过滤器工厂
网关过滤器工厂的顶级接口是GatewayFilterFactory,可以直接继承它的两个抽象类来简化开发AbstractGatewayFilterFactory和AbstractNameValueGatewayFilterFactory,这两个抽象类的区别就是前者接收一个参数,后者接收两个参数。
自定义类名格式必须为 filterName + GatewayFilterFactory,比如类名为Custom1GatewayFilterFactory的话,则filterName就是Custom1。
Custom1GatewayFilterFactory类源码:
public class Custom1GatewayFilterFactory extends AbstractGatewayFilterFactory{ public Custom1GatewayFilterFactory(){ //需要将Config类传递到父类 super(Config.class); } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { //pre生命周期:在chain.filter之前的代码 System.out.println("message=" + config.getMessage()); exchange.getAttributes().put("startTime", System.currentTimeMillis()); //post生命周期:在then里面的代码 return chain.filter(exchange).then( Mono.fromRunnable(() -> { Long startTime = exchange.getAttribute("startTime"); if(startTime != null){ System.out.println(exchange.getRequest().getURI().getRawPath() + ": " + (System.currentTimeMillis() - startTime)); } }) ); }; } public static class Config{ private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } }
在启动类定义Bean对象:
@Bean public Custom1GatewayFilterFactory getPreGatewayFilterFactory(){ return new Custom1GatewayFilterFactory(); }
自定义过滤器类的配置使用:
spring: cloud: gateway: routes: - id: a uri: lb://service-consumer-1 predicates: - Path=/cjm/** filters: - name: Custom1 #自定义过滤器类 args: message: message value
也可以通过spring.cloud.gateway.default-filters配置在全局,作用在所有路由上。
spring: cloud: gateway: default-filters: - name: Custom1 args: message: message value