目录
一、核心定位(微服务必知)
层级执行顺序
二、生产环境微服务 Filter 两大使用场景划分
1. 网关层优先使用(90% 通用全局需求放这里)
2. 业务微服务内部 Servlet Filter(仅单服务独有需求)
三、微服务中 Servlet Filter 生产实战场景(服务内部)
场景 1:生产必备 - 可重复读取 Body 过滤器(最高频)
场景 2:微服务统一编码 + 响应头安全配置过滤器
场景 3:服务本地接口防刷 + 简易限流过滤器
场景 4:第三方回调接口专用验签过滤器
场景 5:微服务本地链路追踪透传过滤器
四、微服务中 Filter 生产避坑十大要点
1. 依赖注入大坑(生产最常见 BUG)
2. 过滤器执行顺序规范
3. 禁止在 Filter 写业务逻辑
4. 微服务内部 Filter 不要做全局跨域
5. 异步接口慎用原生 Filter
6. 生产环境关闭无用过滤器
7. 过滤路径精准匹配,禁止无脑 /*
8. Filter 异常统一捕获
9. 高并发微服务精简 Filter 逻辑
10. 集群部署注意事项
五、Filter、Interceptor、Gateway 过滤器 微服务生产选型表
六、微服务生产标准请求完整链路(带所有组件)
七、面试生产高频问答
八、直接可用生产完整配置
1. 启动类开启 Servlet 组件扫描
2. 统一注册 Filter 配置类(线上推荐)
一、核心定位(微服务必知)
微服务架构请求链路:客户端 → 网关 Gateway → 微服务集群 → 各个服务内部Filter 分两类使用场景:
- 网关层:SpringCloud Gateway 内置全局过滤器(GatewayFilter/GlobalFilter)
- 服务内部:传统 Servlet Filter(业务微服务内嵌 Tomcat 生效)
层级执行顺序
客户端请求 ↓ Gateway 全局过滤器(最外层,微服务网关统一拦截) ↓ 路由转发至目标微服务 ↓ 微服务内置 Tomcat → 原生 Servlet Filter ↓ SpringMVC 拦截器 Interceptor ↓ Controller → Service核心结论
- 网关过滤器:全集群统一管控,做全局流量、鉴权、路由、灰度、限流
- 服务内部 Filter:单服务私有底层处理,做请求体包装、编码、日志、本地防刷、敏感处理
二、生产环境微服务 Filter 两大使用场景划分
1. 网关层优先使用(90% 通用全局需求放这里)
适用:所有微服务统一规则,不用每个服务重复开发
- 统一 Token 鉴权、登录认证
- 全局跨域配置
- 请求溯源、链路追踪 ID 生成传递
- 黑白名单 IP 拦截、流量限流熔断
- 请求路由重写、灰度发布、环境隔离
- 统一请求日志打印、耗时统计
- 统一请求头清洗、安全字段过滤
2. 业务微服务内部 Servlet Filter(仅单服务独有需求)
网关做不了、只能服务内部处理:
- 重复读取请求体(JSON 报文重复解析)
- 接口底层编码强制统一
- 本地接口防刷、接口独立限流
- 第三方回调接口专属报文解密 / 验签
- 静态资源、内部本地接口拦截
- 原生 Servlet 协议层异常预处理
生产规范:通用能力下沉网关,私有底层逻辑放服务内 Filter,业务权限放 Interceptor
三、微服务中 Servlet Filter 生产实战场景(服务内部)
场景 1:生产必备 - 可重复读取 Body 过滤器(最高频)
痛点微服务中拦截器 / 工具类多次读取request.getInputStream()会流关闭,只能读一次,导致接口报错。生产解决方案:自定义包装 Request 过滤器,缓存请求体。
import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; // 全局请求体缓存过滤器 @WebFilter("/*") public class RepeatReadBodyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 包装原生request,实现流可重复读取 HttpServletRequest httpRequest = (HttpServletRequest) request; BodyCacheHttpServletRequest wrapper = new BodyCacheHttpServletRequest(httpRequest); chain.doFilter(wrapper, response); } }配套包装类(生产直接复用)
public class BodyCacheHttpServletRequest extends HttpServletRequestWrapper { private final byte[] body; public BodyCacheHttpServletRequest(HttpServletRequest request) throws IOException { super(request); body = IOUtils.toByteArray(request.getInputStream()); } @Override public ServletInputStream getInputStream() { return new ByteArrayServletInputStream(body); } @Override public BufferedReader getReader() { return new BufferedReader(new InputStreamReader(getInputStream())); } }生产用途
- 统一日志打印完整请求 JSON
- 接口签名二次校验
- 全局请求参数统一解密