在SpringBoot中配置 Druid 數據源及密碼加密的方法 前文集成 MyBatis Plus,實現了一組增刪改查介面。在啟動服務時,從控制臺中可以看出 Spring Boot 預設使用 Hikari 作為資料庫連接池,Hikari性能很優秀。在國內使用較多的連接池還屬阿裡開源的 Druid, ...
在SpringBoot中配置 Druid 數據源及密碼加密的方法
前文集成 MyBatis Plus,實現了一組增刪改查介面。在啟動服務時,從控制臺中可以看出 Spring Boot 預設使用 Hikari
作為資料庫連接池,Hikari
性能很優秀。在國內使用較多的連接池還屬阿裡開源的 Druid
,中文發音為德魯伊
。Druid
結合了 C3P0、DBCP 等 DB 池的優點,同時還加入了日誌監控,可以很好的監控 DB 池連接和 SQL 的執行情況。
1 集成 Druid
在 Spring Boot 中集成 Druid 可通過三種方式實現:
- 純 yml 方式:在 yml 中配置連接池信息和druid 有關參數即可;
- Java Config 方式:編寫配置類,在配置類中創建 druid 所需的實例,通過註解
@configuration
集成 Druid; - 註解方式:通過
@WebServlet
、WebFilter
、@ServletComponentScan
等註解集成。
如果使用到多數據源,需要採用後面兩種方式來配置。我們這個demo裡面只有一個數據源,使用 yml 方式配置就行了。
1.1 添加依賴
Druid 與 Spring Boot 整合可以使用封裝好的 starter: druid-spring-boot-starter。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
1.2 配置 yml
在 application.yml 文件中,前面已經配置了數據源的驅動(driver-class-name)、連接地址(url)、用戶名(username)、密碼(password),現在需要追追加連接池類型配置、druid 連接池參數配置、druid 監控頁面配置。
最後 spring.datasource
的配置如下:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/hero_springboot_demo?useUnicode=true&characterEncoding=utf8&useSSL=true
username: root
password: Mysql.123
# 指定數據源為 DruidDataSource,預設值為 HikariDataSource
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 5
min-idle: 5
max-active: 5
max-wait: 30000
min-evictable-idle-time-millis: 30000
time-between-eviction-runs-millis: 30000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 5
filters: stat,wall
use-global-data-source-stat: true
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: 111111
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: /druid/*, *.js, *.jpeg, *.jpg, *.png, *.gif, *.css
filter:
stat:
merge-sql: true
slow-sql-millis: 3000
log-slow-sql: true
Druid 連接池配置的部分參數解析:
- initial-size:連接池初始化時創建的連接數量。
- min-idle:連接的最小空閑數量。
- max-active:最大活躍的連接數量。
- max-wait:等待超時時間。當遇到 DB 操作時,如果連接池中活躍的連接達到 max-active 就會等待,等待超過 max-wait 就會報錯。
- min-evictable-idle-time-millis:連接允許的最大空閑時長(回收空閑連接的最小時長)
- time-between-eviction-runs-millis:多久檢測一次連接池裡連接的空閑時長
- validation-query:檢測連接是否有效的 SQL
- filters:配置 druid 的擴展插件。stat - 用於監控統計的filter;wall - 用於預防 SQL 註入的filter。其他還有 log4j、config。
- filter:配置過濾器的參數:
- filter.stat.merge-sql:是否開啟 mergeSQL的功能;
- filter.stat.slow-sql-millis:超過多久才是慢SQL
- stat-view-servlet 和 web-stat-filter 用於配置監控頁面的 servlet 和 filter
想在瀏覽器中訪問監控統計頁面,stat-view-servlet.enabled 和 web-stat-filter.enable 都需要配置為 true。
配置完成後,在瀏覽器中訪問:(前面已配置 stat-view-servlet.url-pattern 為 /druid/
)
http://localhost:9099/druid/
輸入 stat-view-servlet
配置的 login-username
和 login-password
,進入 druid 的監控統計頁面
2 配置文件密碼加密
在上面的數據源的配置中,資料庫密碼(spring.datasource.password)明文存儲。在現實企業級開發中,通常採用配置中心的方式來解決。配置文件存儲在配置中心上,而配置中心有許可權控制,敏感環境(UAT、生產環境等)的配置文件只有特定人員或特定環境能夠訪問。但是如果無論什麼環境,都對密碼加密,是非常有必要的操作。
由於已經集成了 druid,可以使用 druid 提供的 ConfigTools 來進行加密,該類採用非對稱方式加密。咱使用單元測試類來生成公鑰、私鑰、加密後的密碼。新建一個單元測試類 com.yygnb.demo.ConfigToolsTest
:
package com.yygnb.demo;
import org.junit.Test;
import static com.alibaba.druid.filter.config.ConfigTools.encrypt;
import static com.alibaba.druid.filter.config.ConfigTools.genKeyPair;
public class ConfigToolsTest {
@Test
public void testPassword() throws Exception {
String password = "Mysql.123";
String[] arr = genKeyPair(512);
System.out.println("privateKey:" + arr[0]);
System.out.println("publicKey:" + arr[1]);
System.out.println("password:" + encrypt(arr[0], password));
}
}
將該方法中的變數 password
值替換成你自己的密碼。執行該單元測試,會在控制臺中分別輸出私鑰 privateKey
、公鑰publicKey
和加密後的密碼 password
:
- 修改配置
spring.datasource.password
,值為上面的生成的加密後的密碼 - 添加公鑰配置
publicKey
,值為上面生成的公鑰 - 添加連接屬性配置
spring.datasource.druid.connection-properties
,值為:config.decrypt=true;config.decrypt.key=${publicKey}
- 啟用配置
spring.datasource.druid.filter.config.enabled
,值為true
如果重啟成功,則加密成功。此時如果將密碼或公鑰修改為錯誤的、或者 pring.datasource.druid.filter.config.enabled 設置 false,服務都會啟動失敗。
今日優雅哥(✔ youyacoder)學習結束,期待關註留言分享~~