在SpringBoot中設定 Druid 資料來源及密碼加密的方法
前文整合 MyBatis Plus,實現了一組增刪改查介面。在啟動服務時,從控制檯中可以看出 Spring Boot 預設使用 Hikari
作為資料庫連線池,Hikari
效能很優秀。在國內使用較多的連線池還屬阿里開源的 Druid
,中文發音為德魯伊
。Druid
結合了 C3P0、DBCP 等 DB 池的優點,同時還加入了紀錄檔監控,可以很好的監控 DB 池連線和 SQL 的執行情況。
在 Spring Boot 中整合 Druid 可通過三種方式實現:
@configuration
整合 Druid;@WebServlet
、WebFilter
、@ServletComponentScan
等註解整合。如果使用到多資料來源,需要採用後面兩種方式來設定。我們這個demo裡面只有一個資料來源,使用 yml 方式設定就行了。
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>
在 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 連線池設定的部分引數解析:
想在瀏覽器中存取監控統計頁面,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 的監控統計頁面
在上面的資料來源的設定中,資料庫密碼(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)學習結束,期待關注留言分享~~