java微服务网关统一异常处理核心是errorwebexceptionhandler全局兜底+globalfilter前置拦截+resilience4j策略化容错,覆盖超时、连接、状态码等异常并标准化响应。

Java 微服务网关中统一捕获下游服务异常,核心不是靠层层 try-catch,而是依托响应式框架机制 + 策略化拦截点,把异常当作可观测信号来处理。
用 ErrorWebExceptionHandler 做全局兜底
这是最可靠、最推荐的方式,能覆盖路由匹配失败、转发超时、下游返回 5xx/4xx、连接中断等绝大多数网关层异常。
- 实现 ErrorWebExceptionHandler 接口,加上
@Component和@Order(-1),确保它优先于 Spring Cloud Gateway 默认处理器生效 - 在
handle()方法里先检查response.isCommitted(),避免重复写入已提交的响应 - 对常见异常分类响应:比如
TimeoutException→ HTTP 504;ConnectException→ 503;ResponseStatusException→ 直接取其状态码;其他未识别异常统一转为 500 并记录完整堆栈 - 构造标准 JSON 响应体(含
code、message、requestId),设置Content-Type: application/json
用 GlobalFilter 拦截转发链中的异常
适合做前置校验(如参数合法性、鉴权)或捕获路由执行后、但尚未被 ErrorWebExceptionHandler 捕获的异常(比如自定义过滤器抛出的异常)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 实现
GlobalFilter,用@Order(-2)保证早于路由过滤器执行 - 在
chain.filter(exchange).onErrorResume()中捕获异常,区分类型处理:是ResponseStatusException就设对应状态码;否则设 500 并打 error 日志 - 调用
exchange.getResponse().setComplete()终止后续过滤器执行,防止重复响应 - 注意:Resilience4j 的熔断器、限流器默认抛出的异常不会进这里,需显式包装成
ResponseStatusException才能统一处理
让下游异常“可识别、可收敛”
网关不能只被动收异常,还要主动协同下游服务规范错误输出。
- 若下游未按约定返回标准 JSON 错误(比如返回 HTML 或空体),网关应在
ErrorWebExceptionHandler中识别并重写为统一格式 - 统一注入
X-Request-ID到请求头和响应体,方便前后端联查;错误日志必须带上该 ID - 对下游返回的 4xx/5xx 响应体,不直接透传,而是提取其
code字段映射为网关级错误码(如USER_NOT_FOUND→GATEWAY_USER_NOT_FOUND),屏蔽下游实现差异
配合 Resilience4j 实现有策略的失败响应
捕获只是起点,关键在于“捕获后怎么响应”——重试、降级、熔断才是高容错的核心。
- 对网络类瞬时异常(
SocketTimeoutException、ConnectException),配置 Resilience4j Retry,指数退避最多 3 次 - 对下游连续失败(如 5 次 5xx),触发 CircuitBreaker,后续请求直接短路,返回预设降级响应(如
{"code":"SERVICE_UNAVAILABLE","msg":"当前服务繁忙,请稍后再试"}) - fallback 方法自身也需用 try-catch 包裹,防止降级逻辑出错导致二次崩溃
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










