服务网关Spring Cloud Gateway -- 网关过滤器工厂

阅读更多

 

网关过滤器工厂

      常用的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/(?.*), /$\{segment}  路径重写

                  - 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

 

你可能感兴趣的:(服务网关Spring Cloud Gateway -- 网关过滤器工厂)