微服务架构中过滤器(Filter)与拦截器(Interceptor)的区别
在微服务架构中,过滤器(Filter) 和 拦截器(Interceptor) 是处理请求的两种核心机制,分别在网关层和服务层发挥重要作用。它们在功能、执行时机、作用范围等方面存在显著差异。本文以微服务为背景,梳理两者的区别,并结合典型场景进行说明。
一、定义与作用
- 过滤器(Filter):
- 基于 Servlet/Jakarta EE 规范,运行于 Web 容器(如 Tomcat、Jetty),位于 HTTP 请求进入 Servlet 前和响应返回客户端后。
- 在微服务中,常用于网关层(如 Spring Cloud Gateway 或 Zuul)处理全局性、非业务逻辑,如日志记录、跨域处理(CORS)、统一认证等。
- 示例:网关层记录所有请求的 IP 和路径,或验证 API Key。
- 拦截器(Interceptor):
- 基于 Spring 框架(如 Spring MVC),运行于 DispatcherServlet 内部,针对 Controller 请求进行拦截。
- 在微服务中,主要用于具体服务内部处理业务逻辑,如用户权限验证、订单状态检查等。
- 示例:订单服务中拦截请求以验证用户是否登录。
二、核心区别
以下从多个维度对比过滤器与拦截器在微服务中的特点:
1. 执行时机
- 过滤器:在请求到达 DispatcherServlet 之前执行,优先级高于拦截器。
- 微服务场景:网关层在请求进入具体服务前进行统一认证或日志记录。
- 拦截器:在 DispatcherServlet 分发请求后、Controller 处理前后执行(分为 preHandle、postHandle、afterCompletion 三个阶段)。
- 微服务场景:在用户服务中,拦截器在 Controller 处理前验证用户角色。
2. 作用范围
- 过滤器:作用于所有进入 Web 容器的请求,包括静态资源(CSS、JS)和非 Spring 管理的 Servlet 请求。
- 微服务场景:网关层处理所有流量,如为所有请求添加追踪 ID(X-Request-ID)。
- 拦截器:仅作用于 Spring MVC 管理的 Controller 请求,无法处理静态资源或非 Spring 请求。
- 微服务场景:在支付服务中仅拦截支付相关的 API 请求。
3. 配置方式
- 过滤器:
- 通过
web.xml
或@WebFilter
注解配置,运行于 Servlet 容器。 - 示例代码(网关层日志过滤器):
@WebFilter(urlPatterns = "/*") public class LoggingFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {System.out.println("Filter: Request URL = " + ((HttpServletRequest) request).getRequestURI());chain.doFilter(request, response);} }
- 通过
- 拦截器:
- 通过 Spring 配置类或
@Component
注解注入到 Spring MVC。 - 示例代码(订单服务权限拦截器):
@Component public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {String token = request.getHeader("Authorization");if (token == null) {response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}return true;} }
- 通过 Spring 配置类或
4. 依赖性
- 过滤器:依赖 Servlet 容器,与框架无关,适用于网关层或跨框架场景。
- 微服务场景:Spring Cloud Gateway 中使用 Servlet Filter 处理全局请求。
- 拦截器:依赖 Spring 框架,深度集成 Spring 上下文,可直接访问 Spring Bean(如 Service、Repository)。
- 微服务场景:在用户服务中通过拦截器调用 UserService 验证用户权限。
5. 功能特性
- 过滤器:
- 可修改请求/响应对象(如包装 HttpServletRequest 修改参数)。
- 微服务场景:网关层为所有请求添加认证头或设置 CORS 响应头。
- 拦截器:
- 提供更细粒度的控制,支持 preHandle(前置)、postHandle(后置)、afterCompletion(完成)三个阶段,可操作 ModelAndView。
- 微服务场景:在订单服务中拦截器修改 Controller 返回的订单数据。
6. 执行顺序
- 过滤器:按配置顺序在 Servlet 容器中执行,先于拦截器。
- 微服务场景:网关层的过滤器先验证 Token,再由服务层拦截器检查业务逻辑。
- 拦截器:按 Spring 配置顺序在 DispatcherServlet 内执行,晚于过滤器。
- 微服务场景:订单服务中多个拦截器按顺序检查用户身份和订单状态。
三、微服务中的典型场景
在微服务架构中,过滤器和拦截器分层使用,分别在网关层和服务层发挥作用:
- 过滤器(网关层):
- 统一认证:在网关层验证 JWT Token 或 OAuth2 令牌。
- 日志记录:记录所有请求的元信息(如请求时间、路径、IP)。
- 跨域处理:为所有服务统一设置 CORS 响应头。
- 请求过滤:拦截恶意请求(如 SQL 注入、XSS 攻击)。
- 拦截器(服务层):
- 业务权限:在用户服务中验证用户是否有权限访问某个 API。
- 业务日志:记录订单服务中创建订单的具体参数和结果。
- 性能监控:统计支付服务中 Controller 方法的执行时间。
- 数据校验:在库存服务中拦截请求,验证库存是否充足。
四、结合 GlobalFilter 的说明
在 Spring Cloud Gateway 中,GlobalFilter 是一种特殊的过滤器,作用于网关层所有路由,类似于 Servlet Filter,但基于 WebFlux 的响应式编程模型。相比之下:
- GlobalFilter:全局作用于网关所有请求,支持异步处理,常用于限流、认证、请求重写。
- Filter:传统 Servlet 过滤器,同步处理,适用于网关或单体服务。
- Interceptor:服务内部的 Spring MVC 机制,专注于业务逻辑。
示例(GlobalFilter):
@Component
public class LoggingGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("GlobalFilter: Request path = " + exchange.getRequest().getPath());return chain.filter(exchange);}@Overridepublic int getOrder() {return -1; // 优先级}
}
五、总结
- 过滤器(Filter):适用于微服务网关层,处理全局性、非业务逻辑(如认证、CORS),运行于 Servlet 容器,作用范围广,适合跨服务统一处理。
- 拦截器(Interceptor):适用于具体微服务内部,处理业务逻辑(如权限校验、数据处理),运行于 Spring MVC,灵活性高,深度集成 Spring 上下文。
- 在微服务架构中,过滤器 和 拦截器 结合使用:网关层通过过滤器(或 GlobalFilter)处理全局逻辑,服务层通过拦截器处理特定业务逻辑,形成分层处理机制。