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
英文地址,請注明出處:http://en.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;…