一、报错详情
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with
name 'memoryMonitor' defined in URL [jar:file:/home/nacos/target/nacos-server.jar!/BOOT-
INF/lib/nacos-config-2.1.0.jar!/com/alibaba/nacos/config/server/monitor/MemoryMonitor.class]:Unsatisfied dependency expressed through constructor parameter 0; nested exception is
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with
name 'asyncNotifyService': Unsatisfied dependency expressed through field 'dumpService';
nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'externalDumpService': Invocation of init method failed; nested exception is ErrCode:500
, ErrMsg:Nacos Server did not start because dumpservice bean construction failure :
No DataSource set
- 核心问题:Nacos 未正确加载数据库配置
Caused by: java.lang.IllegalStateException: No DataSource set
二、原因排查
(1)两容器是否挂载在同一网络下
//查看mysql容器的具体信息
docker inspect mysql
//查看nacos容器的具体信息
docker inspect nacos
- 若此处显示的网络相同,那么说明两容器都已成功挂载在同一网络下,也就是确保 MySQL 服务可达。
若显示不在同一网络下,那么就需要将 Nacos 连接到 MySQL 网络
# 创建自定义网络
docker network create nacos_network
# 将 MySQL 和 Nacos 加入同一网络
docker network connect nacos_network mysql
docker network connect nacos_network nacos
(2)检查防火墙是否关闭,以及端口是否正常开放
- 要想保证两容器能正常相连,那么需要保证此时的防火墙是已经关闭的
//检查防火墙状态
systemctl status firewalld
//关闭防火墙
systemctl stop firewalld
//开启防火墙
systemctl start firewalld
①检查mysql与nacos是否连接上各自的端口
//检查mysql是否连接上3306端口
sudo lsof -i :3306
//检查nacos是否连接上8848端口
sudo lsof -i :8848
查看输出结果中的 PID(进程ID) 或服务名称,确定是哪个进程/服务占用了端口。
②检查虚拟机是否开放mysql与nacos的端口
//是否开放mysql的3306端口
sudo firewall-cmd --list-all | grep 3306
//是否开放nacos的8848端口
sudo firewall-cmd --list-all | grep 8848
如果输出中包含 3306/tcp(或8848/tcp),表示端口已放行;若无结果,则未放行。
③放行3306 端口
# iptables
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
sudo service iptables save && sudo service iptables restart# firewalld
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload# ufw
sudo ufw allow 3306/tcp
sudo ufw reload
(3)Nacos容器启动优先级高于Mysql(重点错误原因!!)
由于nacos会先于mysql启动,而nacos又设置了持久化在mysql中,如果mysql没启动,nacos就会报错找不到数据源。所以需要先启动mysql容器再重启nacos容器,具体解决办法如下:
- 在启动虚拟机后,nacos报错,mysql不报错,使用datagrip等客户端都能正常连接至mysql,那么说明问题出现在nacos上。
- 检查nacos是否在mysql中实现持久化
像这样绑定好了nacos登录的账号与密码就是已经持久化 - 解决办法:在确保虚拟机中防火墙已关闭以及mysql容器已启动的情况下,重启Nacos容器。
//查看全部容器的状态
docker ps -a
//重启nacos容器
docker stop nacos
docker start nacos
//进入nacos日志,查看是否正常启动
docker logs -f nacos
- 看到successfully则是已经成功启动Nacos