跳到主要内容

Gateway过滤器工厂

Spring Cloud Gateway 是一个基于 Spring 5、Spring Boot 2 和 Project Reactor 的 API 网关,旨在为微服务架构提供简单、有效的方式来路由请求。在 Gateway 中,过滤器工厂(Filter Factory)是核心组件之一,它允许开发者在请求被路由到目标服务之前或之后对请求和响应进行处理。

什么是过滤器工厂?

过滤器工厂是 Spring Cloud Gateway 中用于创建过滤器的工厂类。过滤器可以用于修改请求或响应,例如添加请求头、修改请求路径、记录日志等。每个过滤器工厂都对应一个特定的功能,开发者可以通过配置来启用这些过滤器。

Spring Cloud Gateway 提供了许多内置的过滤器工厂,同时也支持自定义过滤器工厂。通过过滤器工厂,开发者可以轻松地实现各种网关级别的功能。

内置过滤器工厂

Spring Cloud Gateway 提供了多种内置的过滤器工厂,以下是一些常用的过滤器工厂:

  1. AddRequestHeader:在请求中添加一个请求头。
  2. AddResponseHeader:在响应中添加一个响应头。
  3. PrefixPath:在请求路径前添加前缀。
  4. StripPrefix:从请求路径中去除指定数量的前缀。
  5. Retry:在请求失败时进行重试。
  6. Hystrix:为路由提供熔断功能。

示例:使用 AddRequestHeader 过滤器工厂

以下是一个简单的示例,展示如何使用 AddRequestHeader 过滤器工厂在请求中添加一个请求头:

yaml
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: http://example.org
filters:
- AddRequestHeader=X-Request-Foo, Bar

在这个示例中,所有匹配该路由的请求都会在请求头中添加 X-Request-Foo: Bar

示例:使用 PrefixPath 过滤器工厂

以下是一个使用 PrefixPath 过滤器工厂的示例,它在请求路径前添加前缀 /api

yaml
spring:
cloud:
gateway:
routes:
- id: prefix_path_route
uri: http://example.org
filters:
- PrefixPath=/api

在这个示例中,如果原始请求路径是 /user,那么经过 PrefixPath 过滤器处理后,请求路径将变为 /api/user

自定义过滤器工厂

除了使用内置的过滤器工厂,开发者还可以创建自定义的过滤器工厂。自定义过滤器工厂需要实现 GatewayFilterFactory 接口,并通过 @Component 注解将其注册为 Spring Bean。

示例:自定义过滤器工厂

以下是一个简单的自定义过滤器工厂示例,它在请求中添加一个自定义的请求头:

java
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

@Component
public class CustomHeaderGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomHeaderGatewayFilterFactory.Config> {

public CustomHeaderGatewayFilterFactory() {
super(Config.class);
}

@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
exchange.getRequest().mutate().header(config.getHeaderName(), config.getHeaderValue());
return chain.filter(exchange);
};
}

public static class Config {
private String headerName;
private String headerValue;

// Getters and setters
}
}

在配置文件中,可以像使用内置过滤器工厂一样使用自定义过滤器工厂:

yaml
spring:
cloud:
gateway:
routes:
- id: custom_header_route
uri: http://example.org
filters:
- CustomHeader=My-Header, My-Value

实际应用场景

场景 1:请求日志记录

在微服务架构中,记录请求日志是非常常见的需求。通过自定义过滤器工厂,可以在请求进入网关时记录请求的详细信息,例如请求路径、请求方法、请求头等。

场景 2:请求头验证

在某些情况下,可能需要对请求头进行验证,以确保请求的合法性。通过自定义过滤器工厂,可以在请求被路由到目标服务之前对请求头进行验证,如果验证失败,则返回错误响应。

总结

Spring Cloud Gateway 的过滤器工厂为开发者提供了强大的工具来处理请求和响应。通过内置的过滤器工厂,开发者可以轻松实现常见的网关功能,而通过自定义过滤器工厂,开发者可以扩展网关的功能以满足特定的需求。

附加资源

练习

  1. 尝试使用 AddResponseHeader 过滤器工厂,在响应中添加一个自定义的响应头。
  2. 创建一个自定义过滤器工厂,用于记录请求的响应时间。
  3. 使用 Retry 过滤器工厂,配置在请求失败时进行重试。

通过完成这些练习,你将更深入地理解 Spring Cloud Gateway 的过滤器工厂及其应用。