2509-Druid監控功能的深入使用與配置-基於SpringBoot-完全使用 .properties配置文件



java實現的數據庫連接池有很多,c3p0,dbcp等,還有號稱速度最快的HikariCP,並且springboot2.0.2版本默認使用的就是HikariCP。
為什么選用Druid呢?
- 性能夠好,比c3p0,dbcp強一些
- 經過考驗,畢竟是阿里開源出來的項目
- 最關鍵的是帶一個建議的數據庫監控

能監控哪些數據呢?

image

  1. 數據源
  2. SQL監控 對執行的MySQL語句進行記錄,並記錄執行時間、事務次數等
  3. SQL防火牆 對SQL進行預編譯,並統計該條SQL的數據指標
  4. Web應用 對發布的服務進行監控,統計訪問次數,並發數等全局信息
  5. URI監控 對訪問的URI進行統計,記錄次數,並發數,執行jdbc數等
  6. Session監控 對用戶請求后保存在服務器端的session進行記錄,識別出每個用戶訪問了多少次數據庫等
  7. Spring監控 (按需配置)利用aop對各個內容接口的執行時間、jdbc數進行記錄

Druid的工程結構

image

比較底層的數據庫連接池可以看看pool包,在此略過,只討論監控相關的內容。

統計相關的內容都在stat包中,比較核心的就是DruidStatService,很多服務通過這個類暴露出來,例如統計數據獲取等。元數據還可以通過DruidStatManagerFacade獲取。

統計頁面主要是通過StatViewServlet來注冊的,這個類的集成結構是 StatViewServlet -> ResourceServlet -> HttpServlet,就是這個Servlet來映射相關的統計界面的,關於監控頁面的源html,可查看support包下的http->resourses

Filter插件,stat功能(監控)、wall功能(sql防火牆)、log4j2功能(監控日志輸出),都是以插件的形式配置的

如何配置?

想達到的目標效果,監控sql,監控sql防火牆,監控url,監控session,監控spring
先說明一下,監控sql、監控url、基礎信息,幾乎不怎么需要配置,集成好druid,配置好監控頁面,就可以顯示

配置大概分為3部分,基礎連接池配置,基礎監控配置,定制化監控配置

1. 完全使用 .properties配置文件

maven的pom文件引入依賴

只引入這個starter即可
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.9</version>
</dependency>


為什么不引入源druid依賴
用IDEA去看 druid-spring-boot-starter項目的pom文件中已經引入了源工程,請勿多此一舉,會導致依賴沖突


基礎連接池配置,主要是配置數據庫的賬戶密碼,還有連接池的參數

spring.datasource.url=jdbc:mysql://數據庫的IP:3306/數據庫名?characterEncoding=utf-8&useSSL=false&useUnicode=true
spring.datasource.username=賬戶
spring.datasource.password=密碼
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 連接池指定 springboot2.02版本默認使用HikariCP 此處要替換成Druid
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

## 初始化連接池的連接數量 大小,最小,最大
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
## 配置獲取連接等待超時的時間
spring.datasource.druid.maxWait=60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
# 是否緩存preparedStatement,也就是PSCache  官方建議MySQL下建議關閉   個人建議如果想用SQL防火牆 建議打開
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
# 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用於防火牆
spring.datasource.druid.filters=stat,wall,log4j
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# !!!請勿配置timeBetweenLogStatsMillis 會定時輸出日志 並導致統計的sql清零
#spring.datasource.druid.timeBetweenLogStatsMillis=20000

基礎監控配置(主要是配置監控的身份驗證信息,畢竟系統運行狀態也是個小秘密)

# WebStatFilter配置,說明請參考Druid Wiki,配置_配置WebStatFilter
#是否啟用StatFilter默認值true
spring.datasource.druid.web-stat-filter.enabled=true
##spring.datasource.druid.web-stat-filter.url-pattern=
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*



# StatViewServlet配置,說明請參考Druid Wiki,配置_StatViewServlet配置
#是否啟用StatViewServlet默認值true
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=false
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123456


其他進階配置:

  1. Spring監控,對內部各接口調用的監控
spring.datasource.druid.aop-patterns=com.company.project.service.*,com.company.project.dao.*,com.company.project.controller.*,com.company.project.mapper.*
  1. 禁止手動重置監控數據
spring.datasource.druid.stat-view-servlet.reset-enable=false
  1. 設置監控頁面的登錄名和密碼
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123456
  1. 設置不統計哪些URL
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
  1. 設置使用哪些插件
    stat是統計,wall是SQL防火牆,防SQL注入的,log4j是用來輸出統計數據的(我覺得這個沒啥用,輸出日志我又重寫了個工具類)
spring.datasource.druid.filters=stat,wall,log4j
  1. 這里不需要使用javaconfig去注冊監控的servlet,

完整的配置:

spring.datasource.url=jdbc:mysql://數據庫的IP:3306/數據庫名?characterEncoding=utf-8&useSSL=false&useUnicode=true
spring.datasource.username=賬戶
spring.datasource.password=密碼
spring.datasource.driver-class-name=com.mysql.jdbc.Driver



#Druid連接池的配置信息
# 連接池指定 springboot2.02版本默認使用HikariCP 此處要替換成Druid
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
## 初始化大小,最小,最大
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
## 配置獲取連接等待超時的時間
spring.datasource.druid.maxWait=60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
# 是否緩存preparedStatement,也就是PSCache  MySQL下建議關閉
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
# 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用於防火牆
spring.datasource.druid.filters=stat,wall,log4j
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# !!!請勿配置timeBetweenLogStatsMillis 會定時輸出日志 並導致統計的sql清零
#spring.datasource.druid.timeBetweenLogStatsMillis=20000

# 配置Druid的日志輸出
spring.datasource.druid.filter.slf4j.enabled=true
spring.datasource.druid.filter.slf4j.statement-create-after-log-enabled=false
spring.datasource.druid.filter.slf4j.statement-close-after-log-enabled=false
spring.datasource.druid.filter.slf4j.result-set-open-after-log-enabled=false
spring.datasource.druid.filter.slf4j.result-set-close-after-log-enabled=false

# WebStatFilter配置,說明請參考Druid Wiki,配置_配置WebStatFilter
#是否啟用StatFilter默認值true
spring.datasource.druid.web-stat-filter.enabled=true
##spring.datasource.druid.web-stat-filter.url-pattern=
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
spring.datasource.druid.web-stat-filter.session-stat-enable=true
spring.datasource.druid.web-stat-filter.session-stat-max-count=100
# 身份標識 從session中獲取
#spring.datasource.druid.web-stat-filter.principal-session-name=
# 身份標識 從cookie中獲取  例如cookie中存gk=xiaoming 設置屬性為gk即可
# user信息保存在cookie中,你可以配置principalCookieName,使得druid知道當前的user是誰
#spring.datasource.druid.web-stat-filter.principal-cookie-name=
# 配置profileEnable能夠監控單個url調用的sql列表。
spring.datasource.druid.web-stat-filter.profile-enable=true


# StatViewServlet配置,說明請參考Druid Wiki,配置_StatViewServlet配置
#是否啟用StatViewServlet默認值true
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=false
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123456
#spring.datasource.druid.stat-view-servlet.allow=
#spring.datasource.druid.stat-view-servlet.deny=

# Spring監控配置,說明請參考Druid Github Wiki,配置_Druid和Spring關聯監控配置
# Spring監控AOP切入點,如x.y.z.service.*,配置多個英文逗號分隔
spring.datasource.druid.aop-patterns=com.company.project.service.*,com.company.project.dao.*,com.company.project.controller.*,com.company.project.mapper.*

2. 使用javaconfig的方式

參考下一篇文章

3. 使用xml方式(本方式也可移植到SSM的框架集合中)

todo

參考文獻:

  1. Druid中使用log4j2進行日志輸出 (這個配置時使用log4j2輸出,其實用logback也可以) https://github.com/alibaba/druid/wiki/Druid中使用log4j2進行日志輸出
  2. 配置StatViewServlet配置 (這個配置比較老,不適合springboot使用,看看就行) https://github.com/alibaba/druid/wiki/配置_StatViewServlet配置
  3. Druid Spring Boot Starter 用於幫助你在Spring Boot項目中輕松集成Druid數據庫連接池和監控。(這個文檔很適合springboot的項目,但不是每一個配置項都需要寫,全寫了反而會起反效果)
    https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM