NacosException: Client not connected, current status:STARTING异常解决
异常描述
最近新部署了一套Nacos环境,然后SpringCloud项目启动一直报错,先贴一下原始的异常堆栈信息:
com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTINGat com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:639) ~[nacos-client-2.2.0.jar:na]at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:619) ~[nacos-client-2.2.0.jar:na]at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:356) ~[nacos-client-2.2.0.jar:na]at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.doRegisterService(NamingGrpcClientProxy.java:209) ~[nacos-client-2.2.0.jar:na]at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.registerService(NamingGrpcClientProxy.java:123) ~[nacos-client-2.2.0.jar:na]at com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate.registerService(NamingClientProxyDelegate.java:98) ~[nacos-client-2.2.0.jar:na]at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:152) ~[nacos-client-2.2.0.jar:na]at com.alibaba.cloud.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:75) ~[spring-cloud-starter-alibaba-nacos-discovery-2021.0.6.1.jar:2021.0.6.1]at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.register(AbstractAutoServiceRegistration.java:232) [spring-cloud-commons-3.1.8.jar:3.1.8]at com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration.register(NacosAutoServiceRegistration.java:78) [spring-cloud-starter-alibaba-nacos-discovery-2021.0.6.1.jar:2021.0.6.1]at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.start(AbstractAutoServiceRegistration.java:133) [spring-cloud-commons-3.1.8.jar:3.1.8]at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.bind(AbstractAutoServiceRegistration.java:98) [spring-cloud-commons-3.1.8.jar:3.1.8]at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.onApplicationEvent(AbstractAutoServiceRegistration.java:86) [spring-cloud-commons-3.1.8.jar:3.1.8]at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.onApplicationEvent(AbstractAutoServiceRegistration.java:47) [spring-cloud-commons-3.1.8.jar:3.1.8]at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:178) [spring-context-5.3.39.jar:5.3.39]at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:171) [spring-context-5.3.39.jar:5.3.39]at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145) [spring-context-5.3.39.jar:5.3.39]at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:430) [spring-context-5.3.39.jar:5.3.39]at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:387) [spring-context-5.3.39.jar:5.3.39]at org.springframework.boot.web.reactive.context.WebServerManager.start(WebServerManager.java:57) [spring-boot-2.7.18.jar:2.7.18]at org.springframework.boot.web.reactive.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:40) [spring-boot-2.7.18.jar:2.7.18]at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:183) [spring-context-5.3.39.jar:5.3.39]at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:58) [spring-context-5.3.39.jar:5.3.39]at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:365) [spring-context-5.3.39.jar:5.3.39]at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_411]at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:160) [spring-context-5.3.39.jar:5.3.39]at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:128) [spring-context-5.3.39.jar:5.3.39]at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:949) [spring-context-5.3.39.jar:5.3.39]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:594) [spring-context-5.3.39.jar:5.3.39]at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66) ~[spring-boot-2.7.18.jar:2.7.18]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[spring-boot-2.7.18.jar:2.7.18]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:409) ~[spring-boot-2.7.18.jar:2.7.18]at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.18.jar:2.7.18]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) ~[spring-boot-2.7.18.jar:2.7.18]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289) ~[spring-boot-2.7.18.jar:2.7.18]at com.ims.gateway.GatewayServerApplication.main(GatewayServerApplication.java:13) ~[classes/:na]2024-10-24 12:11:14.905 | WARN 56080 | main [TID: N/A] onfigReactiveWebServerApplicationContext | Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is java.lang.reflect.UndeclaredThrowableException
2024-10-24 12:11:17.330 | INFO 56080 | main [TID: N/A] ConditionEvaluationReportLoggingListener |
官方的解决方案:
专家官方解答 :com.alibaba.nacos.api.exception.nacosexception: clien | Nacos 官网
遇到com.alibaba.nacos.api.exception.NacosException: client not connect, current status:STARTING
的问题,可以按照以下步骤分析和解决:
-
检查Nacos服务器地址配置:首先确认应用程序中配置的Nacos服务器地址(serverAddr)和端口是否正确,确保它们与实际运行的Nacos服务器地址匹配。如果使用了endpoint和endpointPort,请同样检查这些配置项。
-
版本兼容性检查:根据错误提示,此问题可能是由于客户端版本与服务端版本不兼容导致。请确认当前使用的Nacos客户端版本是否为2.0以上,而Nacos服务端版本是否为1.X。如果是版本不匹配的情况,请将Nacos服务端升级到2.X或更高版本以兼容客户端。
-
网络连通性测试:在出现错误的客户端节点上,执行网络诊断命令来检测到Nacos服务器的连通性:
Terminal window
ping ${nacos_host}
telnet ${nacos_host} 8848
确保能够成功ping通Nacos服务器地址,并且telnet能够连接到8848端口(默认配置)。如果存在网络问题,请与网络管理员协作解决。
-
日志检查:查看客户端日志(通常位于
${user.home}/logs/nacos/
目录下,具体路径可能因语言和版本不同而异),寻找更详细的错误信息或警告,这有助于进一步定位问题。注意,如果使用的是Spring Cloud,可能存在日志配置被覆盖的情况,需要适当调整以确保能查看到Nacos相关的日志。 -
环境变量与JVM参数检查:确认没有环境变量或JVM参数错误地指定了Nacos服务器地址,导致连接到了错误的地址。
如果经过上述步骤仍然未能解决问题,建议查看Nacos服务端的日志和系统监控,检查是否有服务端故障、高负载或配置不当等情况。同时,考虑是否有安全组规则、防火墙设置或其他网络策略限制了客户端到Nacos服务器的连接。
异常分析神器:DEBUG
网上找了一圈,跟官方的解答差不多,主要就是配置不对、客户端与服务端版本不匹配或者环境变量设置不对啥的。都尝试过,没用。最后没办法,现成得便宜捡不着,只能拿起重拾神器DEBUG,看看什么原因。
先看异常堆栈信息中的主要类和方法:
RpcClient和NamingGrpcClientProxy。
说起来也尴尬,要是对Nacos原理稍微有过深入了解,可能看见NamingGrpcClientProxy就大概猜到了问题所在。我这还是DEBUG才发现,就是客户端通过GRPC向Nacos服务端发起连接和请求,结果连接不上。
一般情况我们配置在项目中的地址都是IP+8848端口,所以通常我们也首先考虑的是IP通不通,8848端口通过通。这也跟官方的解答差不多。不过当你反复确认,结果两者没问题。
看看源码:
发起连接请求的不是用的8848而是9848。在项目部署的电脑上试试9848,发现真不通。
1、检查nacos部署服务器的9848端口是否被占用。(正常情况应该是nacos的进程占用,如果不是那就纠正)
2、检查部署nacos服务器的防火墙,看看9848端口有没有对外开放。
两步的操作命令这里就不贴了,网上很多。我的问题就是9848端口被防火墙拦住了。打开即可。
解决方案总结:
1、仔细看堆栈信息。
2、根据堆栈信息找异常的类、方法、行代码。
3、有空多看看Nacos原理,O(∩_∩)O
4、补充说明:
Nacos默认需要放开以下四个端口号:
- 8848:这是Nacos服务的主端口,用于客户端、控制台以及OpenAPI的HTTP通信。
- 9848:客户端gRPC请求服务端的端口,客户端通过此端口向Nacos服务端发起连接和请求。
- 9849:服务端gRPC请求服务端的端口,主要用于服务间的同步等操作。
- 7848:Jraft请求服务端的端口,用于处理服务端之间的Raft相关请求。
这些端口是基于Nacos服务端的主端口(默认8848)并通过固定的偏移量计算得出。通常情况下,只需公开主端口(8848)和服务端gRPC端口(9848)即可满足大多数场景下的网络配置需求,尤其是在使用VIP或负载均衡器的情况下。
关于Nacos端口的配置和指定,可以参考Nacos官方文档提供的详细信息:
- Nacos部署文档
- Nacos兼容性与升级指南
此外,对于客户端想要自定义gRPC端口偏移量的情况,可以通过设置JVM参数-D nacos.server.grpc.port.offset
来实现,但需要注意确保服务端通过VIP/SLB正确映射相应的端口以避免访问问题。
关于Nacos版本的选择,推荐使用最新的2.X稳定版本,具体版本信息可从以下链接获取:
- Nacos官网下载页面
- GitHub Release页面
请根据实际部署环境和需求,参照上述信息进行端口配置与版本选择。