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
相关产品推荐
相关产品推荐

