一、概述
Gateway是Spring Cloud中的一部分,提供了一种灵活的、可扩展的方式来构建API网关,是整个微服务架构的入口和出口。Gateway过滤器位于Gateway请求处理流程的关键位置,可以对请求进行预处理或后处理。
Gateway默认提供了一些常用的过滤器,如路由、重试等,同时也可以自定义过滤器。本文将从过滤器的类型、实现方式、应用场景等方面对Gateway过滤器进行详解。
二、Gateway过滤器类型
Gateway过滤器根据实现方式可以分为Global Filter和Scoped Filter两种类型。
1. Global Filter
Global Filter是在整个Gateway路由请求流程中都会执行的过滤器,可以实现一些全局的功能,如请求鉴权、请求日志等。
Global Filter的实现方式很简单,只需要实现GatewayFilter接口并将其注册到RouteLocator中即可:
public class AuthFilter implements GatewayFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 鉴权逻辑 return chain.filter(exchange); } } @Configuration public class GatewayConfig { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("auth_route", r -> r.path("/api/**").filters(f -> f.filter(new AuthFilter())) .uri("lb://auth-service")) .build(); } }
2. Scoped Filter
Scoped Filter是在指定路由规则下执行的过滤器,可以实现路由相关的功能,如路由重试、请求头修改等。
Scoped Filter的实现方式也很简单,只需要在RouteDefinition中将其注册即可:
@Configuration public class GatewayConfig { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("retry_route", r -> r.path("/api/**").filters(f -> f.rewritePath("/api/(?<name>.*)", "/${name}") .addRequestHeader("X-Request-ID", UUID.randomUUID().toString()) .retry(3)) .uri("lb://service")) .build(); } }
三、Gateway过滤器实现
Gateway过滤器需要实现GatewayFilter接口,并在filter方法中编写自定义的过滤逻辑。需要注意的是,filter方法返回的是Mono<Void>类型,表示过滤完成后需要继续调用下一个过滤器。
过滤器可以获取到ServerWebExchange对象,可以通过该对象对请求或响应进行修改或获取各种必要信息。
以下是一个自定义的限流过滤器实现:
public class RateLimiterFilter implements GatewayFilter { private final RateLimiter rateLimiter; public RateLimiterFilter(RateLimiter rateLimiter) { this.rateLimiter = rateLimiter; } @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { Mono<Boolean> isAllowed = rateLimiter.isAllowed(exchange.getRequest().getRemoteAddress().getAddress()); return isAllowed.flatMap(allowed -> { if (allowed) { return chain.filter(exchange); } else { exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS); return exchange.getResponse().setComplete(); } }); } } @Configuration public class GatewayConfig { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder, RateLimiter rateLimiter) { return builder.routes() .route("rate_limit_route", r -> r.path("/api/**").filters(f -> f.filter(new RateLimiterFilter(rateLimiter))) .uri("lb://service")) .build(); } }
四、Gateway过滤器应用场景
Gateway过滤器的应用场景非常广泛,可以通过过滤器实现各种功能,以下是一部分常见场景:
1. 请求鉴权
通过过滤器对请求进行鉴权,如校验请求头、Token等。
2. 请求日志
通过过滤器实现请求日志记录,方便问题排查和性能优化。
3. 限流
通过过滤器实现请求的限流功能,避免被恶意攻击或高并发请求拖垮服务。
4. 敏感信息过滤
通过过滤器实现敏感信息的过滤,如过滤手机号、银行卡号等。
5. 请求重试
通过过滤器实现请求的重试功能,避免因为下游服务不可用而导致的请求失败。
五、总结
Gateway过滤器是Spring Cloud Gateway中非常重要的一部分,可以对请求进行预处理或后处理,实现各种功能。本文从过滤器类型、实现方式、应用场景等方面对Gateway过滤器进行了详细的介绍,并提供了相关的代码示例。