You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Cloud Gateway后置过滤器在下游服务宕机时未执行问题求助

Spring Cloud Gateway GlobalPostFilter 处理下游服务宕机场景的解决方案

问题原因

当下游服务宕机时,chain.filter(exchange)会抛出异常,原代码中使用的.then(Mono.just(exchange))仅在流成功完成时执行,异常会直接终止流,导致后续的响应头设置逻辑完全跳过,因此500错误时后置过滤器未生效。

修复后的代码

public GlobalFilter customGlobalPostFilter() {
    return (exchange, chain) -> chain.filter(exchange)
            // 捕获下游服务异常,设置500状态码并让流继续执行
            .onErrorResume(ex -> {
                exchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
                return Mono.empty();
            })
            // 无论成功/失败,最终都会执行此回调
            .doFinally(signalType -> {
                HttpStatus statusCode = exchange.getResponse().getStatusCode();
                String headerValue;
                
                if (HttpStatus.OK.equals(statusCode)) {
                    headerValue = "It worked";
                } else if (HttpStatus.INTERNAL_SERVER_ERROR.equals(statusCode)) {
                    headerValue = "Service unavailable, please try again later";
                } else {
                    headerValue = "Request completed with status: " + statusCode;
                }
                
                // 确保响应未提交时再修改头,避免报错
                if (!exchange.getResponse().isCommitted()) {
                    exchange.getResponse().getHeaders().set("CUSTOM-RESPONSE-HEADER", headerValue);
                }
            })
            .then();
}

代码说明

  • onErrorResume:捕获下游服务抛出的异常,手动设置500状态码,返回空Mono保证流不会中断,让后续的doFinally逻辑能正常执行。
  • doFinally:覆盖流的所有终止场景(成功完成、异常终止、取消),在这里统一处理响应头的设置,确保无论请求结果如何都能添加自定义头。
  • isCommitted()检查:避免在响应已经提交给客户端后尝试修改头,防止抛出IllegalStateException。

内容的提问来源于stack exchange,提问作者Abhijit Mondal Abhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:47:44