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

在开发过程中,我们使用 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: yamlnamespace: ${NACOS_NAMESPACE}shared-configs:- data-id: shared-mysql.yamlgroup: DEFAULT_GROUPrefresh: false

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

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

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://mysql:3306/dbusername: rootpassword: xxxxhikari:max-lifetime: 30000maximum-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 failureThe 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.Driverurl: jdbc:mysql://mysql:3306/dbusername: rootpassword: xxxxhikari:max-lifetime: 30000maximum-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.Driverurl: jdbc:mysql://<服务器公网IP>:3306/dbusername: rootpassword: xxxxhikari:max-lifetime: 30000maximum-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.pswp.cn/diannao/82534.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/82534.shtml

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

相关文章

LabVIEW与 IMAQ Vision 机器视觉应用

在工业生产及诸多领域&#xff0c;精确高效的检测至关重要。基于 LabVIEW 与 IMAQ Vision 的机器视觉应用&#xff0c;深入剖析其原理、系统构成、软件设计及优势&#xff0c;为相关领域工程师提供全面技术参考。 ​ 一、技术原理 &#xff08;一&#xff09;机器视觉技术基础…

【STM32 学习笔记】USART串口

注意&#xff1a;在串口助手的接收模式中有文本模式和HEX模式两种模式&#xff0c;那么它们有什么区别&#xff1f;   文本模式和Hex模式是两种不同的文件编辑或浏览模式&#xff0c;不是完全相同的概念。文本模式通常是指以ASCII编码格式表示文本文件的编辑或浏览模式。在文…

【WPS】怎么解决“word的复制表格”粘贴到“excel的单元格”变多行单元格的问题

把 word文档复制表格到这个excel表格上面的话&#xff0c;会出现由单个单元格变成多行单元格的情况。 现在&#xff0c;就这个问题怎么解决&#xff0c;提出了一个方案&#xff0c;就是先查找是什么导致了这个换行&#xff0c;然后再将换行的这个字符进行一个整体的替换&#x…

嵌入式开发面试题详解:STM32 与嵌入式开发核心知识全面解析

一、STM32 共有几种基本时钟信号&#xff1f; 题目 STM32 共有几种基本时钟信号&#xff1f; 解答 STM32 包含 4 种基本时钟信号&#xff0c;分别为 HSI&#xff08;内部高速时钟&#xff09;、HSE&#xff08;外部高速时钟&#xff09;、LSI&#xff08;内部低速时钟&…

华为策略路由

路由策略&#xff1a;是对路由条目进行控制&#xff0c;通告控制路由条目影响报文的转发路径。路由策略为控制平面。 策略路由&#xff1a;是根据报文特征&#xff0c;认为的控制报文从某个即可转发出去&#xff0c;不修改路由表。即策略路由为在转发平面。 路由策略 策略路由…

# YOLOv3:深度学习中的目标检测利器

YOLOv3&#xff1a;深度学习中的目标检测利器 引言 在计算机视觉领域&#xff0c;目标检测是一项核心任务&#xff0c;它涉及到识别图像或视频中的物体&#xff0c;并确定它们的位置。随着深度学习技术的快速发展&#xff0c;目标检测算法也在不断进步。YOLO&#xff08;You …

红黑树删除的实现与四种情况的证明

&#x1f9ed; 学习重点 删除节点的三种情况红黑树如何恢复性质四种修复情况完整可运行的 C 实现 一、红黑树删除的基础理解 红黑树删除比插入复杂得多&#xff0c;因为&#xff1a; 删除的是黑节点可能会破坏“从根到叶子黑节点数相等”的性质。删除红节点无需修复&#xf…

vue配置代理解决前端跨域的问题

文章目录 一、概述二、报错现象三、通过配置代理来解决修改request.js中的baseURL为/api在vite.config.js中增加代理配置 四、参考资料 一、概述 跨域是指由于浏览器的同源策略限制&#xff0c;向不同源(不同协议、不同域名、不同端口)发送ajax请求会失败 二、报错现象 三、…

T-SQL在SQL Server中判断表、字段、索引、视图、触发器、Synonym等是否存在

SQL Server创建或者删除表、字段、索引、视图、触发器前判断是否存在。 目录 1. SQL Server创建表之前判断表是否存在 2. SQL Server新增字段之前判断是否存在 3. SQL Server删除字段之前判断是否存在 4. SQL Server新增索引之前判断是否存在 5. SQL Server判断视图是否存…

金融企业如何借力运维监控强化合规性建设?

日前&#xff0c;国家金融监督管理总局网站公布行政处罚信息&#xff0c;认定某银行存在多项违规并对其进行罚款。其中&#xff0c;国家金融监督管理总局认定该银行主要违规内容包括&#xff1a; 一、部分重要信息系统识别不全面&#xff0c;灾备建设和灾难恢复能力不符合监管要…

leetcode hot100 技巧

如有缺漏谬误&#xff0c;还请批评指正。 1.只出现一次的数字 利用异或运算相同得0的特点。所有出现过两次的数字都会在异或运算累加过程中被抵消。 class Solution { public:int singleNumber(vector<int>& nums) {int res0;for(int i0;i<nums.size();i) res^n…

git做commit信息时的校验

亲测可用&#xff01;不行你来打我&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1. 文件基本信息 属性说明文件名commit-msg&#xff08;必须无扩展名&#xff0c;如 .sh 或 .txt 会导致失效&#xff09;位置仓库的 .git/hooks/ 目录下&#xff08;或全局模…

4.9/Q1,GBD数据库最新文章解读

文章题目&#xff1a;The burden of diseases attributable to high body mass index in Asia from 1990 - 2019: results from the global burden of disease study 2019 DOI&#xff1a;10.1080/07853890.2025.2483977 中文标题&#xff1a;1990 年至 2019 年亚洲高体重指数导…

Activity动态切换Fragment

Activity 动态切换 Fragment 是 Android 开发中常见的需求&#xff0c;用于构建灵活的用户界面。 以下是实现 Activity 动态切换 Fragment 的几种方法&#xff0c;以及一些最佳实践&#xff1a; 1. 使用 FragmentManager 和 FragmentTransaction (推荐) 这是最常用和推荐的方…

FreeRTOS Semaphore信号量-笔记

FreeRTOS Semaphore信号量-笔记 **一、信号量与互斥量的核心区别****二、二值信号量&#xff08;Binary Semaphore&#xff09;****1. 功能与使用场景****2. 示例&#xff1a;ADC中断与任务同步** **三、计数信号量&#xff08;Counting Semaphore&#xff09;****1. 功能与使用…

音频类网站或者资讯总结

我爱音频网&#xff1a; 我爱音频网 - 我们只谈音频&#xff0c;丰富的TWS真无线蓝牙耳机拆解报告 (52audio.com) 其他更多资讯 音频行业全品类深度剖析&#xff0c;2024市场趋势解读汇总-EDN 电子技术设计 (ednchina.com)

16.Excel:数据收集

一 使用在线协作工具 简道云。 excel的在线表格协作在国内无法使用&#xff0c;而数据采集最需要在线协作。 二 使用 excel 1.制作表格 在使用excel进行数据采集的时候&#xff0c;会制作表头给填写人&#xff0c;最好还制作一个示例。 1.输入提示 当点击某个单元格的时候&am…

JAVA虚拟机(JVM)总结,很清晰,很好理解!!

目录 java编译相关知识 Java文件编译过程 java的可跨平台性 JVM内存结构 运行期数据区域&#xff08;JDK8之后&#xff09; 本地方法栈 虚拟方法栈 程序计数器 堆 本地内存 栈帧里面的局部变量表和方法区&#xff08;元空间的区别&#xff09; 类加载器 启动类加载…

前端项目中单元测试与集成测试的管理实践

前端项目中单元测试与集成测试的管理实践 在现代前端工程化中&#xff0c;单元测试&#xff08;Unit Test&#xff09;和集成测试&#xff08;Integration Test&#xff09;已成为保障项目质量的重要手段。合理地组织和管理测试代码&#xff0c;不仅有助于持续集成&#xff0c…

【Redis】缓存和分布式锁

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、缓存&#xff08;Cache&#xff09; 概述 Redis最主要的应用场景便是作为缓存。缓存&#xff08;Cache&#xff09;是一种用于存储数据副本的技术或组件&#xff0c;…