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

Spring Boot内嵌Netty服务器调用同服务端点时死锁问题求助

Spring Cloud Gateway 线程死锁问题排查与临时解决

环境与路由配置

  • 技术栈:Spring Cloud Gateway + Spring Boot WebFlux Starter + 默认内嵌Netty服务器
  • 路由定义:
    • Route1:路径/api/v1/task,通过多组过滤器修改请求路径后代理至后端服务,响应返回前由自定义过滤器修改响应内容及头部
    • Route2:路径/api/v1/general,过滤器中通过RestTemplate调用本地localhost/api/v1/task,修改响应后执行return exchange.mutate().response(res).build().getResponse().setComplete();终止过滤器链并返回结果

死锁现象与触发逻辑

  • 服务偶发死锁,分析后定位触发条件:当Route2运行的reactor-http-nio线程与内部调用Route1的线程为同一线程时,服务卡住无法处理其他请求
  • 必现复现方式:将Netty workerCount设为1,单独调用Route1正常,调用Route2则直接触发死锁,必须重启服务才能恢复
  • 线程dump信息:RestTemplate.execute方法处于阻塞等待响应状态,即便存在空闲线程也无法接收新请求
  • 业务场景:应用包含10+路由,Route2需携带不同参数调用其他路由,单次请求涉及50+次本地API调用

临时解决方案

  • 调整Netty workerCount至80,通过增加线程池容量降低线程冲突概率
  • 使用CompletableFuture封装RestTemplate调用并设置超时时间,超时则直接返回500错误

核心矛盾说明

  • Route2依赖XSLT构造响应,XSLT中包含需调用的其他API路由地址,通过javax.xml.TransformerFactory处理XSLT,使用Saxon库的ExtensionFunctionDefinition实现自定义阻塞函数获取API响应
  • 尝试替换为WebClient的阻塞方法(如block())时,触发异常:java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-1

内容的提问来源于stack exchange,提问作者Abhishek Verma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:52:36