故障现象:gateway-server 网关服务在宿主机(Linux)上通过脚本或手动运行初始化时,出现无法正常完成启动、日志追踪异常、jdk 路径不匹配以及在生命周期末期抛出异常崩溃的现象。

涉及组件:gateway-server (Spring Boot 2.7.16 / Spring Cloud)、Nacos v2.2.3 (Docker 部署)、自定义工具包 springboot.toolbox、Shell 启动脚本。
排查结论:Nacos 自身网络、端口映射及底层连接在全链路(HTTP 端口 28096 与 gRPC 端口 29096)上均正常。真正的故障根源表现为多维度的综合问题:
start 动作及 taillog 日志监控函数存在逻辑错误并已被临时注释(comment out)。现象:早期怀疑是 Docker 容器网络隔离导致宿主机访问失败。
测试与验证:
在宿主机分别对 127.0.0.1、私网 IP(172.31.39.235)及公网 IP 的 28096(HTTP)和 29096(gRPC)进行 curl 及 nc 连通性测试,结果全部返回 HTTP 200 且 TCP 握手成功:
复制代码[root@ip-172-31-39-235 gateway-server]# curl -I http://172.31.39.235:28096/nacos/
HTTP/1.1 200 OK
结论:底层网络、Docker 端口映射及防火墙/安全组配置均无异常。
现象:通过直接运行 java -jar gateway-server.jar 观察详细启动日志。
日志提取:
复制代码2026-07-21 01:42:31.646 | INFO ... Try to connect to server on start up, server: {serverIp = '127.0.0.1', server main port = 28096}
2026-07-21 01:42:31.646 | INFO ... Success to connect to server [127.0.0.1:28096] on start up, connectionId = 1784598151416_172.19.0.1_47722
结论:Spring Boot 客户端成功与 Nacos 服务端建立了 gRPC 长连接并完成了配置加载与服务注册。Nacos 连接本身完全正常,排除 Nacos 故障。
现象:通过脚本管理时无法正确拉起服务或检测日志。
排查发现:
JDK 路径错误:脚本中配置了服务器上实际不存在的 JDK 路径,导致通过脚本启动时直接因找不到 Java 运行环境而失败。
启动动作与日志追踪缺陷:脚本的 start 动作逻辑存在缺陷,且用于监听启动状态的 taillog() 函数因超时或逻辑匹配问题已被注释处理:
复制代码# 脚本中被注释的日志检查与状态判定逻辑
# timeout 5m tail -f $filename | sed -e '/Application had been ready since/q 1'
现象:服务在提示 Started GatewayServerApplication 准备就绪后,突发 Application run failed 并抛出容器生命周期异常。
核心错误日志:
复制代码org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'internalAsyncEventBus': Singleton bean creation not allowed while singletons of this factory are in destruction
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:220)
at com.github.javaclub.toolbox.spring.BeanFactory.getBean(BeanFactory.java:41)
at springboot.toolbox.SpringBootAutoConfiguration.onApplicationEvent(SpringBootAutoConfiguration.java:161)
故障定位:
springboot.toolbox 中的 SpringBootAutoConfiguration。onApplicationEvent 第 161 行),强行通过编码调用 BeanFactory.getBean(...) 获取单例 Bean。修改目标:检查并修改自定义组件库(或项目内部引入的 springboot.toolbox)中的 SpringBootAutoConfiguration.java。
整改措施:
ApplicationReadyEvent 或生命周期销毁监听器中直接动态调用 BeanFactory.getBean() 获取非懒加载单例。@Autowired)完成,或者判断当前容器状态是否处于活动中(context.isActive()),防止在销毁阶段强制索取 Bean。JAVA_HOME 或 java 命令路径,确保其指向宿主机上实际存在的可用 JDK(例如 /usr/lib/jvm/java-1.8.0-openjdk-...)。start 动作及被注释的 taillog() 函数,确保能够正确配合 application.log 的输出内容判定服务是否启动成功,避免因脚本逻辑死板导致误判。127.0.0.1:28096(走标准回环网卡),避免因 Linux 内核路由策略导致使用私网 IP 自连接时产生间歇性卡顿。