Spring 项目无法连接 MySQL:Nacos 配置误区排查与解决

news2025/5/13 3:16:21

在开发过程中,我们使用 Nacos 来管理 Spring Boot 项目的配置,其中包括数据库连接配置。然而,在实际操作中,由于一些概念的混淆,我们遇到了一些连接问题。本文将分享我的故障排查过程,帮助大家避免类似的错误。

问题背景

在我的项目中,使用了 Nacos 来管理 Spring Boot 配置。数据库的连接信息(如 MySQL 配置)存储在 Nacos 配置中心的 shared-mysql.yaml 文件中。原本以为是 Nacos 直接连接 MySQL 容器,但事实上,Spring Boot 项目从 Nacos 拉取配置后,最终是通过本机连接开发服务器上的 MySQL。由于在配置时产生了一些混淆,导致项目无法成功连接到 MySQL 数据库。

1. 项目与 Nacos 配置的集成

我们使用 Nacos 来管理数据库连接配置,具体配置如下:

spring:
  cloud:
    nacos:
      username: ${NACOS_USERNAME}
      password: ${NACOS_PASSWORD}
      server-addr: ${NACOS_ADDR}
      discovery:
        namespace: ${NACOS_NAMESPACE}
      config:
        file-extension: yaml
        namespace: ${NACOS_NAMESPACE}
        shared-configs:
          - data-id: shared-mysql.yaml
            group: DEFAULT_GROUP
            refresh: false

其中,shared-mysql.yaml 是存储数据库连接信息的配置文件,Spring Boot 项目会从 Nacos 中读取该文件并解析为 MySQL 配置。

shared-mysql.yaml 文件内容如下:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://mysql:3306/db
    username: root
    password: xxxx
    hikari:
      max-lifetime: 30000
      maximum-pool-size: 10

这部分配置在容器化的环境中是可以工作的,mysql 是 Docker 容器的主机名,它会被解析为对应容器的 IP 地址。

2. 问题现象

启动 Spring Boot 项目时并没有出现问题,测试请求登录接口报错:

2025-05-07 20:20:18.740  INFO 33828 --- [nio-9091-exec-1] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2025-05-07 20:20:19.747 ERROR 33828 --- [nio-9091-exec-1] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
	at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-j-8.0.32.jar:8.0.32]
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-j-8.0.32.jar:8.0.32]
	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:824) ~[mysql-connector-j-8.0.32.jar:8.0.32]
	at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:444) ~[mysql-connector-j-8.0.32.jar:8.0.32]
	at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:237) ~[mysql-connector-j-8.0.32.jar:8.0.32]

进一步排查发现,问题的根源是 Spring Boot 项目无法连接到 MySQL 容器。错误信息中提到的 mysql:3306 主机名无法解析为正确的 MySQL 主机地址,导致数据库连接失败。

但是我就纳闷了,我已经配置了容器的网络,mysql跟nacos都处于同一个网络内,所以我觉得连接信息写容器名称应该能够连接上数据库,但是,我发现有一点我混淆了。

3. 排查过程

3.1 确认 Nacos 配置是否正确

首先,我们检查了 Nacos 配置是否正确注册和读取。通过以下配置,项目应该能够从 Nacos 中获取 shared-mysql.yaml 文件内容:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://mysql:3306/db
    username: root
    password: xxxx
    hikari:
      max-lifetime: 30000
      maximum-pool-size: 10

在这里,url 地址使用了容器名称 mysql 作为主机名。然而,mysql 是在 Docker 容器内部使用的主机名,外部的 Spring Boot 项目并不能直接解析该主机名。因此,项目无法通过此地址连接到 MySQL。

3.2 理解问题的根本

经过分析,问题并不在于 Nacos 配置本身,而在于数据库连接的主机地址错误。实际上,Spring Boot 项目需要通过宿主机的 IP 地址连接到 MySQL,而不是通过容器名称 mysql。我在url上直接写容器名称是以为直接在Nacos容器连接mysql容器,并且已经配置了他们在同一个网络,但其实项目只是将配置读取再从本机连接服务器的,所以url中的容器名称需要更改为服务器IP公网地址。

3.3 解决方案:修改 MySQL 主机地址

为了解决这个问题,我们修改了 shared-mysql.yaml 配置中的 url 地址,将 mysql:3306 替换为开发服务器的 公网 IP 地址

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://<服务器公网IP>:3306/db
    username: root
    password: xxxx
    hikari:
      max-lifetime: 30000
      maximum-pool-size: 10

这样,Spring Boot 项目就能够通过宿主机的公网 IP 地址连接到 MySQL,问题得到了解决。

3.4 确认 Nacos 服务地址与权限

此外,我们还需要确认 Nacos 服务地址是否正确配置,以及是否可以正常访问。可以使用以下命令进行验证:

curl http://<NACOS_ADDR>:8848/nacos/v1/ns/catalogs

如果无法访问 Nacos,可能是网络问题或 Nacos 地址配置错误。

3.5 检查 MySQL 容器的访问权限

由于 MySQL 容器默认只允许本地连接,我们需要确保它允许外部访问。可以通过以下命令设置 MySQL 允许外部主机连接:

docker exec -it mysql mysql -uroot -pxxxx
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

4. 完整解决方案

4.1 修改 Nacos 配置文件

shared-mysql.yaml 配置中的 url 地址从 mysql:3306 改为 公网IP:3306,并将配置发布到 Nacos。

4.2 确保 Nacos 配置服务可用

检查 Nacos 服务是否正常运行,确保 NACOS_ADDR 配置正确,能够从项目中访问到。

4.3 确保 MySQL 容器外部可访问

通过以下命令确认 MySQL 容器允许外部连接:

docker exec -it mysql mysql -uroot -pxxxx
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

4.4 项目配置验证

确认项目的 application.yml 配置正确,并确保 Spring Boot 项目能够从 Nacos 获取正确的 MySQL 配置信息。

4.5 网络连接测试

验证 Spring Boot 项目是否能正常连接到 MySQL,尤其是是否能成功解析 MySQL 主机地址。

5. 总结

通过调整 Nacos 配置文件中的 MySQL 主机地址,并确保 MySQL 容器允许外部访问,最终解决了 Spring Boot 项目无法连接 MySQL 的问题。这个问题的根源是对容器网络与 Nacos 配置的理解偏差,导致了数据库连接地址的配置错误。

希望这篇文章能够帮助大家避免类似的配置误区,快速定位并解决类似问题。如果你有其他问题,欢迎留言讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统入门第十二章 --Shell编程之正则表达式

一、正则表达式 之前学习了 Shell 脚本的基础用法&#xff0c;已经可以利用条件判断、循环等语句编辑 Shell脚本。接下来我们将开始介绍一个很重要的概念-正则表达式(RegularExpression&#xff0c;RE) 1.正则表达式的定义 正则表达式又称正规表达式、常规表达式。在代码中常…

[架构之美]Spring Boot多环境5种方案实现Dev/Test/Prod环境隔离

[架构之美]Spring Boot多环境5种方案实现Dev/Test/Prod环境隔离&#xff08;十六&#xff09; 摘要&#xff1a;本文深入剖析Spring Boot多环境配置的5种实现方案&#xff0c;涵盖YAML分组配置、Maven Profile集成、Kubernetes适配等企业级实践&#xff0c;并附赠配置加密方案…

C++STL——stack,queue

stack与queue 前言容器适配器deque 前言 本篇主要讲解stack与queue的底层&#xff0c;但并不会进行实现&#xff0c;stack的接口 queue的接口 &#xff0c;关于stack与queue的接口在这里不做讲解&#xff0c;因为通过前面的对STL的学习&#xff0c;这些接口都是大同小异的。 …

解决社区录音应用横屏状态下,录音后无法播放的bug

最近看到社区有小伙伴反映&#xff0c;社区录音应用横屏时&#xff0c;录音后无法播放的问题。现分享解决办法。 社区录音应用的来源&#xff1a;https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-5.0.2-Release/code/SystemFeature/Media/Recorder …

专业级软件卸载工具:免费使用,彻底卸载无残留!

在数字生活节奏日益加快的今天&#xff0c;我们的电脑就像每天都在"吃进"各种软件。但您是否注意到&#xff0c;那些看似消失的程序其实悄悄留下了大量冗余文件&#xff1f;就像厨房角落里积攒的调味瓶空罐&#xff0c;日积月累就会让系统变得"消化不良"。…

JVM对象创建内存分配

对象创建的主要流程&#xff1a; 检查加载类–》分配内存–》初始化–》设置对象头–》实例化&#xff0c;执行init方法。 在内存分配中&#xff0c;虚拟机将为新生对象内存分配 Minor GC : 新生代垃圾收集&#xff0c;特点是频繁&#xff0c;回收速度快&#xff1b; Full GC …

PySide6 GUI 学习笔记——常用类及控件使用方法(常用类边距QMarginsF)

文章目录 类简介方法总览关键说明示例代码 类简介 QMarginsF 用于定义四个浮点型边距&#xff08;左、上、右、下&#xff09;&#xff0c;描述围绕矩形的边框尺寸。所有边距接近零时 isNull() 返回 True&#xff0c;支持运算符重载和数学运算。 方法总览 方法名/运算符参数返…

STM32实现九轴IMU的卡尔曼滤波

在嵌入式系统中&#xff0c;精确的姿态估计对于无人机、机器人和虚拟现实等应用至关重要。九轴惯性测量单元&#xff08;IMU&#xff09;通过三轴加速度计、陀螺仪和磁力计提供全面的运动数据。然而&#xff0c;这些传感器数据常伴随噪声和漂移&#xff0c;单独使用无法满足高精…

机器学习-简要与数据集加载

一.机器学习简要 1.1 概念 机器学习即计算机在数据中总结规律并预测未来结果&#xff0c;这一过程仿照人类的学习过程进行。 深度学习是机器学习中的重要算法的其中之一&#xff0c;是一种偏近现代的算法。 1.2 机器学习发展历史 从上世纪50年代的图灵测试提出、塞缪尔开发…

算法训练营第十三天|226.翻转二叉树、101. 对称二叉树、 104.二叉树的最大深度、111.二叉树的最小深度

递归 递归三部曲&#xff1a; 1.确定参数和返回值2.确定终止条件3.确定单层逻辑 226.翻转二叉树 题目 思路与解法 第一想法&#xff1a; 递归&#xff0c;对每个结点进行反转 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, le…

二叉树的遍历与构造

好想回家&#xff0c;我想回家跟馒头酱玩&#xff0c;想老爸老妈。如果上天再给我一次选择的机会&#xff0c;我会选择当一只小动物&#xff0c;或者当棵大树也好&#xff0c;或者我希望自己不要有那么多多余的情绪&#xff0c;不要太被别人影响&#xff0c;开心点&#xff0c;…

MYSQL服务的使用流程

MYSQL是一个单进程多线程&#xff0c;支持多用户&#xff0c;基于客户机/服务器的关系数据库管理系统。与其他数据库管理系统相比&#xff0c;MYSQL具有体积小&#xff0c;易于安装&#xff0c;运行速度快&#xff0c;功能齐全&#xff0c;成本低廉以及开源等特点。MYSQL可运行…

【java】使用iText实现pdf文件增加水印功能

maven依赖 <dependencies><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.5</version><type>pom</type></dependency> </dependencies>实现代码 前…

socket套接字-TCP

上一篇&#xff1a;socket套接字-UDP&#xff08;下&#xff09;https://blog.csdn.net/Small_entreprene/article/details/147569071?fromshareblogdetail&sharetypeblogdetail&sharerId147569071&sharereferPC&sharesourceSmall_entreprene&sharefromfr…

MiM: Mask in Mask Self-SupervisedPre-Training for 3D Medical Image Analysis

Abstract Vision Transformer在3D医学图像分析的自监督学习&#xff08;Self-Supervised Learning&#xff0c;SSL&#xff09;中展现了卓越的性能。掩码自编码器&#xff08;Masked Auto-Encoder&#xff0c;MAE&#xff09;用于特征预训练&#xff0c;可以进一步释放ViT在各…

【STM32 学习笔记】I2C通信协议

注&#xff1a;通信协议的设计背景 3:00~10:13 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由Phiilps公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c; 不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广…

深入理解卷积神经网络的输入层:数据的起点与预处理核心

内容摘要 本文围绕卷积神经网络输入层展开&#xff0c;详细介绍其在网络中的重要作用&#xff0c;包括接收不同领域数据的形式及传递数据的过程。深入解读数据预处理的关键操作&#xff0c;如去均值、归一化和PCA/白化。助力读者透彻理解输入层&#xff0c;为构建高效卷积神经…

redis bitmap数据类型调研

一、bitmap是什么&#xff1f; redis原文&#xff1a; Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type . This means that bitmaps can be used with string commands, and most importantly with SET and GET. 翻…

LabVIEW 2019 与 NI VISA 20.0 安装及报错处理

在使用 Windows 11 操作系统的电脑上&#xff0c;同时安装了 LabVIEW 2019 32 位和 64 位版本的软件。此前安装的 NI VISA 2024 Q1 版&#xff0c;该版本与 LabVIEW 2019 32 位和 64 位不兼容&#xff0c;之后重新安装了 NI VISA 20.0。从说明书来看&#xff0c;NI VISA 20.0 …