Spring Cloud Gateway 是 Spring Cloud 家族中的新一代微服务网关框架,它为构建 API 网关提供了强大的功能。Spring Cloud Gateway 的核心组件之一就是过滤器,本文将详细介绍 GlobalFilter
、GatewayFilter
和 AbstractGatewayFilterFactory
三种过滤器的实现方式,并探讨如何在实践中高效地使用它们。
全局过滤器 (GlobalFilter
) 是一种可以在所有路由请求上执行的过滤器。它可以用于实现一些通用的功能,如日志记录、认证授权等。
创建全局过滤器:kotlin
代码解读复制代码import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class LoggingFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
System.out.println("LoggingFilter: " + request.getMethodValue());
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0; // 顺序越小,执行越早
}
}
注册全局过滤器: 无需显式注册,因为全局过滤器通过 @Component
注解自动扫描。
GlobalFilter
接口即可。路由过滤器 (GatewayFilter
) 可以被指定到特定的路由上,提供了更细粒度的控制能力。
创建GatewayFilter:typescript
代码解读复制代码import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class SignatureVerificationGatewayFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
// 验证签名
if (!validateSignature(request)) {
return Mono.error(new RuntimeException("Invalid signature"));
}
return chain.filter(exchange);
}
private boolean validateSignature(ServerHttpRequest request) {
// 实现签名验证逻辑
return true; // 假设验证成功
}
@Override
public int getOrder() {
return 0; // 顺序越小,执行越早
}
}
配置路由: 请注意,由于 GatewayFilter
通过 @Component
注解自动扫描,无需显式注册。kotlin
代码解读复制代码import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/api/signed")
.filters(f -> f.filter(new SignatureVerificationGatewayFilter()))
.uri("http://localhost:8080"))
.build();
}
}
@Component
注解自动扫描,无需显式注册。AbstractGatewayFilterFactory
自定义过滤器工厂提供了一个更加灵活的方式来创建 GatewayFilter
实例。这种方式允许你定义配置选项,并且可以通过工厂模式来创建多个不同的过滤器实例。与 GatewayFilter
类似,AbstractGatewayFilterFactory
也可以通过 @Component
注解自动扫描。
创建自定义工厂类:scala
代码解读复制代码import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class SignatureVerificationGatewayFilterFactory extends AbstractGatewayFilterFactory<SignatureVerificationGatewayFilterFactory.Config> {
public SignatureVerificationGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
// 验证签名
if (!validateSignature(request)) {
return Mono.error(new RuntimeException("Invalid signature"));
}
return chain.filter(exchange);
};
}
private boolean validateSignature(ServerHttpRequest request) {
// 实现签名验证逻辑
return true; // 假设验证成功
}
public static class Config {}
}
配置路由: AbstractGatewayFilterFactory
可以通过 YAML 文件来配置,这里提供一个 YAML 示例:yaml
代码解读复制代码spring:
cloud:
gateway:
routes:
- id: signed_route
uri: http://localhost:8080
predicates:
- Path=/api/signed
filters:
- name: SignatureVerificationGatewayFilterFactory
args: {}
@Component
注解自动扫描,无需显式注册。@Component
注解自动扫描。@Component
注解自动扫描。根据你的需求和项目特性,你可以选择最适合的方式。如果需要全局性的操作,GlobalFilter
是一个不错的选择;如果需要更精细的控制,则可以选择 GatewayFilter
;而对于高度定制化的场景,AbstractGatewayFilterFactory
则更为合适,并且可以通过 YAML 文件来配置。
以上就是 Spring Cloud Gateway 中 GlobalFilter
、GatewayFilter
以及 AbstractGatewayFilterFactory
的详细解析与实践指南。希望能够帮助您更好地理解和运用这些过滤器来优化您的网关应用程序。
Spring Cloud