Spring Cloud Gateway中WebClient无法调用其他服务该如何排查
问题根因与修复方案
核心问题
你的代码问题出在Reactive响应式编程的执行逻辑上:authClient.getAppUser(token)返回的是Mono类型的异步Publisher,只有被订阅时才会真正执行内部的WebClient调用逻辑。你当前的代码中只是定义了这个流的处理逻辑,既没有主动订阅,也没有将它作为filter方法的返回值交给Spring Cloud Gateway托管订阅,反而直接提前返回了鉴权失败的响应,所以WebClient的请求永远不会被触发。
修复代码
修改AuthenticationFilter的filter方法如下即可:
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); final String token = this.getAuthHeader(request); // 直接返回完整异步处理流,由Spring Cloud Gateway自动订阅执行 return authClient.getAppUser(token) .flatMap(response -> { System.out.println(response); this.populateRequestWithHeaders(exchange, response); return chain.filter(exchange); }) // 异常场景才返回鉴权失败响应 .onErrorResume(error -> this.onError(exchange, "Authorization header is invalid", HttpStatus.UNAUTHORIZED)); }
其他可选排查点
如果修复后仍有问题,可检查以下配置:
- 确认
AuthenticationServiceClientImpl类上添加了@Service/@Component注解,已被Spring上下文扫描托管,否则依赖注入失败会导致逻辑无法执行。 - 开启WebClient调用日志排查请求细节,在配置文件中添加如下日志级别配置:
logging: level: reactor.netty: DEBUG org.springframework.web.reactive.function.client: DEBUG
- 确认9002端口的鉴权服务正常运行,且
/api/authentication-service/get-user-detail接口允许无认证直接调用。
内容的提问来源于stack exchange,提问作者Tareq
相关产品推荐
相关产品推荐

