在微服务架构中,过滤器和网关(如Spring Cloud Gateway)的配合使用是构建统一入口、实现横切关注点(cross-cutting concerns)的核心机制。以下是两者的协同工作方式及典型应用场景:
一、角色分工
-
网关的核心作用
- 作为所有微服务的统一入口,负责路由转发 (将请求分发到不同服务实例)和负载均衡 (通过
lb://
协议集成Ribbon或Spring Cloud LoadBalancer)。 - 提供动态路由能力,支持通过配置中心(如Nacos)实时更新路由规则,无需重启服务。
- 作为所有微服务的统一入口,负责路由转发 (将请求分发到不同服务实例)和负载均衡 (通过
-
过滤器的功能定位
- 全局过滤器(GlobalFilter):处理所有路由的公共逻辑(如认证、日志、跨域)。
- 路由过滤器(GatewayFilter):针对特定路由的定制化处理(如路径重写、限流)。
二、协作流程
-
请求处理链路
-
路由匹配 :网关根据请求的路径、Header等属性匹配路由规则(通过
Predicate
实现)。 -
过滤器链执行:
- Pre阶段 :执行认证、参数校验、限流等逻辑(如
JwtAuthFilter
验证Token)。 - 路由转发:将请求代理到目标服务(支持负载均衡)。
- Post阶段 :修改响应头、记录日志或统计指标(如添加
X-Response-Time
)。
- Pre阶段 :执行认证、参数校验、限流等逻辑(如
-
-
动态配置集成
- 过滤器参数(如限流阈值、白名单路径)可通过配置中心动态调整,例如从Nacos读取
maxRequestsPerSecond
值实现实时限流。
- 过滤器参数(如限流阈值、白名单路径)可通过配置中心动态调整,例如从Nacos读取
三、典型应用场景
-
统一安全控制
-
全局过滤器拦截所有请求,验证JWT令牌或OAuth2权限,未授权请求直接返回401。
-
示例:
kotlin@Component public class AuthFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { if (!checkToken(exchange.getRequest())) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } }
-
-
流量治理
- 结合
RequestRateLimiter
过滤器实现令牌桶限流,保护下游服务免受过载。 - 动态路由实现灰度发布,根据Header或参数将请求路由到不同版本服务。
- 结合
-
请求/响应改写
- 使用
RewritePath
过滤器修改请求路径(如将/api/user/**
重写为/user/**
)。 - 通过
ModifyBodyFilter
解密或加密请求体内容。
- 使用
四、最佳实践
-
执行顺序控制
- 通过
@Order
注解或Ordered
接口明确过滤器优先级,确保认证逻辑先于限流执行。
- 通过
-
性能优化
- 避免在过滤器中阻塞操作(如同步数据库查询),使用WebFlux的异步非阻塞模型。
-
异常处理
- 在过滤器中统一捕获异常,返回标准化错误响应(如JSON格式)。
五、注意事项
- 线程安全:过滤器是单例的,避免使用成员变量存储请求级数据。
- 与微服务间调用的区分:网关通常仅处理外部请求,服务间调用通过Feign直接通信,不经过网关。
通过上述协作模式,Spring Cloud Gateway与过滤器共同构建了高扩展性、安全可靠的微服务入口层。