微服務配置中心實戰:Spring + MyBatis + Druid + Nacos

在結合場景談服務發現和配置中我們講述了 Nacos 配置中心的三個典型的應用場景,包括如何在 Spring Boot 中使用 Nacos 配置中心將數據庫連接信息管控起來,而在“原生”的 Spring 中可以怎麼使用 Nacos 配置中心呢?很多基於 Spring MVC 框架的 Web 開發中,Spring + MyBatis + Druid 是一個黃金組合,在此基礎上融入 Nacos 配置中心,將會發生什麼特別的變化呢?

本文將通過一個用戶信息查詢示例,演示在 Spring Web 項目中如何將數據庫連接池的配置存放到 Nacos 中,統一運維管控,達到配置治理與降低數據洩露風險的目的。

數據表

在測試數據庫中新建 user 表,其中包含用戶名稱等字段,與接下來的 User model 類相對應。

CREATE TABLE `user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL DEFAULT '' COMMENT '名字',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';

添加一行測試數據:

INSERT INTO `user` (`name`, `create_time`, `update_time`) 
VALUES ('Nacos', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

Spring

該示例是 Spring 常規的 Web 項目,項目結構如下:

微服務配置中心實戰:Spring + MyBatis + Druid + Nacos

pom.xml

引入 Nacos Spring 的依賴包 nacos-spring-context:


com.alibaba.nacos
nacos-spring-context
${latest.version}

筆者在撰寫本文時,nacos-spring-context 的最新版本為:0.2.2-RC1

dispatcher-servlet.xml

dispatcher-servlet.xml 為示例中 Spring MVC 的入口配置,在其中通過 import 引入了 Nacos、Druid、MyBatis 的配置,其內容如下:


xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">







nacos.xml

關鍵看 nacos.xml ,nacos-spring-context 的擴展了 Spring 的 XML Schema 機制,自定義了 等元素,詳細配置內容如下:


xmlns="http://www.springframework.org/schema/beans"
xmlns:nacos="http://nacos.io/schema/nacos"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://nacos.io/schema/nacos
http://nacos.io/schema/nacos.xsd">



其中通過 設置 Nacos Server 的連接地址,通過 從 Nacos 配置中心加載了 dataId 為 datasource.properties 的配置,nacos-spring-context 會解析獲取到的配置內容並添加到 Spring Environment 的 PropertySources 中,使得後續初始化 Druid 連接池的時候能獲取到數據庫連接地址、賬號密碼、初始連接池大小等信息。這就是 Nacos 配置中心與 Spring 結合的關鍵點。

datasource.xml

這是數據庫連接池的配置,初始化了 DruidDataSource 的 Spring Bean,並將其通過 DataSourceTransactionManager 設置為 Spring 的數據庫連接池。


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
init-method="init" destroy-method="close">






class="org.springframework.jdbc.datasource.DataSourceTransactionManager">




從上面的配置內容看一看到,數據庫連接池不需要因為引入 Nacos 配置中做任何特殊的改變。

其他

User 的 Model、Service 等也跟不使用 Nacos 配置中心時完全一致,這裡就不一一貼出,完整示例代碼可以在 nacos-examples 獲取:https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-example/nacos-spring-config-datasource-example

Nacos

參照 Nacos 官網的快速開始:https://nacos.io/zh-cn/docs/quick-start.html

從 Nacos 的 github 上下載最新穩定版本的 nacos-server:https://github.com/alibaba/nacos/releases

解壓後到 Nacos 的 bin 目錄下,執行 startup 啟動腳本以單機模式啟動 Nacos Server, Windows 請使用 cmd startup.cmd ,Linux/Unix/Mac 環境請使用 sh startup.sh -m standalone 。

啟動後,瀏覽器訪問:http://localhost:8848/nacos/index.html 就可以來到 Nacos 的控制檯,新增 dataId 為 datasource.properties 的配置,對應上面 Spring 的 nacos.xml 中的 dataId。

配置內容則與 Spring 的 datasource.xml 中的連接池屬性一一對應,示例如下:

datasource.url=jdbc:mysql://localhost:3306/test
datasource.username=root
datasource.password=root
datasource.initial-size=1
datasource.max-active=20
微服務配置中心實戰:Spring + MyBatis + Druid + Nacos

運行

示例中是 UserController#get() 通過 UserServce 調用 Mybatis 的 Mapper 類(UserMapper)從數據庫中查詢指定 ID 的用戶信息,假設該示例是運行在端口為 8080 的 Tomcat 上,訪問:http://localhost:8080/users?id=1 地址將返回:

{
"id": 1,
"name": "Nacos"
}

總結

本文通過一個示例演示在“原生” Spring 中如何使用 Nacos 配置中心,從示例可以看出,對原有的 Spring 項目基本沒有任何侵入,只需在 pom.xml 中添加 nacos-spring-context 的依賴,然後再定義並引入 nacos.xml 配置,就可以將數據庫連接池信息管控起來,做到統一運維,並降低數據洩露的風險。

試想,如果你有多個項目連接同一個數據庫或一個項目部署很多實例,當數據庫密碼修改時,你不需要去修改每個項目的 datasource.properties 文件,再走一次應用的部署發佈流程,而是到 Nacos 的控制檯上修改一個配置項,再去重啟應用實例即可。當然,如果你是自己管理數據庫連接池,則可以做到連“重啟應用實例”都不需要了,只需在監聽到 Nacos 配置變化時重新初始化數據庫連接池即可。

將 Spring 配置放置到 Nacos 配置中,還能用上“動態推送”、“版本管理”、“快速回滾”、“監聽查詢”,以及後續的 “灰度發佈”、“配置加密”、“權限管控”等功能,為 Spring + MyBatis + Druid 插上“飛翔”的翅膀。

作為 Nacos 配置中心的阿里雲免費產品 ACM:https://www.aliyun.com/product/acm,已經提供了上面所有的功能,如果您不想自己部署運維 Nacos Server 或者想使用“推送軌跡”、“細粒度權限控制”、“ECS 實例 RAM 角色”等高級特性,不妨嘗試下免費的 ACM。

完整示例代碼:

  • Nacos: https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-example/nacos-spring-config-datasource-example
  • ACM: https://github.com/nacos-group/nacos-examples/tree/acm/nacos-spring-example/nacos-spring-config-datasource-example


分享到:


相關文章: