背景

今天对项目中的部分依赖进行升级,升级完后启动项目nacos一直报错Client not connected, current status:STARTING ,具体如下图:

一、升级过程

关键依赖升级前后版本对比情况如下表:

依赖名称升级前版本升级后版本Spring Cloud Alibaba内置nacos客户端版本服务端nacos版本
spring-boot-dependencies2.6.8未升级未涉及未涉及
spring-cloud-dependencies2021.0.12021.0.7未涉及未涉及
spring-cloud-alibaba-dependencies2021.0.1.02021.0.5.01.4.2(升级前) / 2.2.0(升级后)2.0.2(升级前) / 2.2.0(升级后)

如表所述,项目中依赖版本调整后,因为Spring Cloud Alibaba 版本由2021.0.1.0升级到2021.0.5.0版本后,内置的nacos client 版本由1.4.2升级到了2.2.0。为了避免出现兼容性问题,于是我将自己的nacos服务端的版本也由2.0.2升级到了2.2.0版本,自以为一切都欧克了,结果启动项目的时候便碰到了文章开头背景里面提到的情况。

二、问题排查
遇到问题不要慌,先百度一番:翻了几篇博文以后,大概知道了是nacos升级到2.x后新增了gRPC的通信方式,因此需要增加2个额外端口进行客户端和服务端以及服务端和服务端的gRPC通信。官网解释如下图:

更多解释移步官网查看:https://nacos.io/zh-cn/docs/v2/upgrading/2.0.0-compatibility.html

于是乎,大概知道了原因,因为我的nacos服务端是docker部署的,之前部署只映射了一个端口,于是删掉了旧的容器,添加了配置后重新启动了新的容器。前后配置如下图:

	修改前:
	docker run -d \
	-e PREFER_HOST_MODE=ip \
	-e MODE=standalone \
	-e SPRING_DATASOURCE_PLATFORM=mysql \
	-e MYSQL_SERVICE_HOST=42.192.***.*** \
	-e MYSQL_SERVICE_PORT=3306 \
	-e MYSQL_SERVICE_USER=root \
	-e MYSQL_SERVICE_PASSWORD=root \
	-e MYSQL_SERVICE_DB_NAME=nacos \
	-e TIME_ZONE='Asia/Shanghai' \
	-v /home/nacos/logs:/home/nacos/logs \
	-p 13214:8848 \
	--name nacos \
	--restart=always \
	nacos/nacos-server:v2.2.0

	修改后(其实就是多加了两个端口):
	docker run -d \
	-e PREFER_HOST_MODE=ip \
	-e MODE=standalone \
	-e SPRING_DATASOURCE_PLATFORM=mysql \
	-e MYSQL_SERVICE_HOST=42.192.***.** \
	-e MYSQL_SERVICE_PORT=3306 \
	-e MYSQL_SERVICE_USER=root \
	-e MYSQL_SERVICE_PASSWORD=root \
	-e MYSQL_SERVICE_DB_NAME=nacos \
	-e TIME_ZONE='Asia/Shanghai' \
	-v /home/nacos/logs:/home/nacos/logs \
	-p 13214:8848 \
	-p 14214:9848 \
	-p 14215:9849 \
	--name nacos \
	--restart=always \
	nacos/nacos-server:v2.2.0
	

因为是我自己玩的项目,用的是腾讯云部署的nacos,所以还要在防火墙开通上述端口,值得注意的是,8848端口对应的13214端口以及9848对应的14214端口是需要客户端和服务端通信的,所以13214和14214都需要在防火墙对外开放,而官网解释9849只是服务端之间进行gRPC通信才用,因此不需要在防火墙开通也是可以的。防火墙配置如下图: