SpringBoot配置Druid監控


SpringBoot配置Druid監控

首先我們的項目是基於Druid連接池

 Druid 具有以下特點:

  • 亞秒級 OLAP 查詢,包括多維過濾、Ad-hoc 的屬性分組、快速聚合數據等等。
  • 實時的數據消費,真正做到數據攝入實時、查詢結果實時。
  • 高效的多租戶能力,最高可以做到幾千用戶同時在線查詢。
  • 擴展性強,支持 PB 級數據、千億級事件快速處理,支持每秒數千查詢並發。
  • 極高的高可用保障,支持滾動升級。

 

1.在application.yml文件中添加連接池的配置信息

# spring 配置
spring:
  application:
    name: imodule-nexus-service
  # DataSource Config 數據源配置
  datasource:
    # 數據連接池類型
    type: com.alibaba.druid.pool.DruidDataSource
    # driver-class-name: com.mysql.jdbc.Driver
    # mysql-connector-java 8.0+ 使用這個新的接口
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: ${db.nexus.url}
    username: ${db.nexus.username}
    password: ${db.nexus.password}

    # 初始化時建立物理連接的個數。初始化發生在顯示調用init方法,或者第一次getConnection時
    initial-size: 10
    # 最大連接池連接數量,最大活躍連接數
    max-active: 150
    # 最小連接池連接數量,最小空閑數量
    min-idle: 10
    # 配置獲取連接等待超時的時間
    max-wait: 5000
    # 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數據庫性能提升巨大,比如說oracle。在mysql下建議關閉。
    pool-prepared-statements: false
    # 指定每個連接上PSCache的大小
    # max-pool-prepared-statement-per-connection-size: 20
    # 和上面的等價
    # max-open-prepared-statements:
    # 指定檢測連接sql,如果是null,會影響testWhileIdle、testOnBorrow、testOnReturn失效,如果底層代碼use-ping-method是true,默認使用ping
    validation-query: SELECT 1
    validation-query-timeout: 500
    # 申請連接時會使用validationQuery檢測連接是否有效,true會降低性能,如果是true,並且檢測到連接已關閉,會獲取其它的可用的連接
    test-on-borrow: false
    # 歸還連接時會使用validationQuery檢測連接是否有效,true會降低性能,如果是true,並且檢測到連接已關閉,會獲取其它的可用的連接,放回數據庫線程池
    test-on-return: false
    # 建議配置為true,不影響性能,並且保證安全性。申請連接的時候檢測,如果此連接空閑時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。
    test-while-idle: true
    # 1)配合testWhileIdle=true時使用,如果當前jdbc使用間隔大於timeBetweenEvictionRunsMillis配置的空閑連接過期時間,執行validationQuery檢測連接是否有效。
    # 數據庫會主動超時並斷開連接,因此建議timeBetweenEvictionRunsMillis小於數據庫的連接主動斷開時間(如mysql的wait_timeout和interactive_timeout)
    # 2)配置間隔多久才進行一次檢測,Destroy線程檢測需要關閉的空閑連接的時間,單位是毫秒
    time-between-eviction-runs-millis: 60000
    # 配置一個連接在池中最小生存的時間,單位是毫秒
    min-evictable-idle-time-millis: 30000
    # max-evictable-idle-time-millis:
    # 屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有: 監控統計用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
    # 配置多個英文逗號分隔
    filters: stat,wall,log4j
    # 通過connectProperties屬性來打開mergeSql功能;記錄慢SQL
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

 

2.新增配置類 DruidConfig.java

這里需要注意  @ConfigurationProperties(prefix = "spring.datasource") 指定的是Druid連接池配置信息application.yml 層級關系一定要對應好,后面會指出和這里相關的問題

package com.imodule.demo.service.configuration;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;

/**
 * 線程池監控信息查看配置
 */
@Configuration
public class DruidConfig {
    @Bean
    public ServletRegistrationBean druidServlet() { // 主要實現WEB監控的配置處理
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
                new StatViewServlet(), "/druid/*"); // 現在要進行druid監控的配置處理操作
        servletRegistrationBean.addInitParameter("allow", "127.0.0.1,10.1.1.1"); // 白名單
       // servletRegistrationBean.addInitParameter("deny", "192.168.1.200"); // 黑名單
        servletRegistrationBean.addInitParameter("loginUsername", "admin"); // 用戶名
        servletRegistrationBean.addInitParameter("loginPassword", "admin"); // 密碼
        servletRegistrationBean.addInitParameter("resetEnable", "false"); // 是否可以重置數據源
        return servletRegistrationBean ;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean() ;
        filterRegistrationBean.setFilter(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*"); // 所有請求進行監控處理
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*");
        return filterRegistrationBean ;
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }
}

 

3.項目中用到了Druid的話 肯定會先在pom里面引入相關依賴的,目前我們這個項目中引用的druid 1.1.15

pom.xml (下面兩個選一個就可以了,我試過兩種方案)

1. 使用組件common-dao層的依賴,統一引用的是 druid 1.1.15  (這個各公司的定義不同,意思就是說我們公司自定義的common包中包含了 druid 依賴,指定了版本號為1.1.15 ,所以我只需要直接引用common包就好了)

2.在引用公司的common包的時候排除druid依賴,然后再自己引入 druid-spring-boot-starter 包 

保持一致,我使用的是方案一,整體統一哈哈哈哈(如果你們在使用的時候沒有其他包引用了druid ,自己手動將以下其中依賴信息添加到pom.xml即可,具體版本信息可能還需要對應一下哦)

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.9</version>
</dependency>   

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.15</version>
</dependency>                      

 

4.啟動SpringBoot項目,執行main方法,啟動成功后訪問druid 

druid監控訪問地址: http://ip:port/context-path/druid/index.html

          eg:http://127.0.0.1:8080/demo/druid/login.html (這里的IP需要是上面配置文件中白名單指定的哦,多個可以使用逗號分割)

進入如下登錄頁面,用戶名及密碼就是在DruidConfig.java中配置的信息(本例中是:admin/admin)

 

登錄成功后,即可看到如下信息

 

5.配置Druid監控過程中出現過兩個問題

問題1:

Failed to bind properties under 'spring.datasource' to javax.sql.DataSource:

Property: spring.datasource.filters
Value: stat,wall,log4j
Origin: class path resource [application.yml]:53:14
Reason: org.apache.log4j.Logger

原因: spring.datasource下面的filters對日志的配置有問題,因為我項目中的日志為 slf4j,而連接池中配置的是log4j,所以出錯了

處理方案: 將 application.yml 里面的 spring.datasource.filter 的 log4j 更改為 slf4j

 

問題2:啟動沒報錯,也能正常訪問Druid,但是Druid監控里面sql信息沒有顯示出來,數據源配置顯示正常,連接池配置信息顯示不正常,如下圖所示

 

SQL監控:(執行查詢數據庫的腳本也沒有任何信息顯示)

 

這個問題糾結了我一上午了,查了無數遍,有人說是包的版本不對,也有人說是日志配置有問題... 都嘗試了,不行

后來我眼睛一精,發現原來是我的配置文件 application.yml里面的內容定義有問題

原版配置文件在指定數據源配置信息: spring.datasource.DBINFO   spring.datasource.druid.DRUIDINFO

配置文件如下:

 

這個配置層級關系不對呀,在DruidConfig.java類中,我們指定的配置信息讀取路徑是 spring.datasource ,關於連接池信息又多了一層 druid(spring.datasource.druid),所以連接池相關配置信息沒有被讀取到,只讀取到了數據源信息,這就出現了上方問題2的錯誤現象了

處理方案: 將druid這一層移除,調整后的配置文件如下

 

6.調整之后再次啟動項目,訪問druid監控,發現一切都正常了

 

7.最后提供一下完整的關於druid監控的application.yml

# spring 配置
spring:
  application:
    name: demo-service
  # DataSource Config 數據源配置
  datasource:
    # 數據連接池類型
    type: com.alibaba.druid.pool.DruidDataSource
    # driver-class-name: com.mysql.jdbc.Driver
    # mysql-connector-java 8.0+ 使用這個新的接口
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: ${db.nexus.url}
    username: ${db.nexus.username}
    password: ${db.nexus.password}
    # 初始化時建立物理連接的個數。初始化發生在顯示調用init方法,或者第一次getConnection時
    initial-size: 10
    # 最大連接池連接數量,最大活躍連接數
    max-active: 150
    # 最小連接池連接數量,最小空閑數量
    min-idle: 10
    # 配置獲取連接等待超時的時間
    max-wait: 5000
    # 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數據庫性能提升巨大,比如說oracle。在mysql下建議關閉。
    pool-prepared-statements: false
    # 指定每個連接上PSCache的大小
    # max-pool-prepared-statement-per-connection-size: 20
    # 和上面的等價
    # max-open-prepared-statements:
    # 指定檢測連接sql,如果是null,會影響testWhileIdle、testOnBorrow、testOnReturn失效,如果底層代碼use-ping-method是true,默認使用ping
    validation-query: SELECT 1
    validation-query-timeout: 500
    # 申請連接時會使用validationQuery檢測連接是否有效,true會降低性能,如果是true,並且檢測到連接已關閉,會獲取其它的可用的連接
    test-on-borrow: false
    # 歸還連接時會使用validationQuery檢測連接是否有效,true會降低性能,如果是true,並且檢測到連接已關閉,會獲取其它的可用的連接,放回數據庫線程池
    test-on-return: false
    # 建議配置為true,不影響性能,並且保證安全性。申請連接的時候檢測,如果此連接空閑時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。
    test-while-idle: true
    # 1)配合testWhileIdle=true時使用,如果當前jdbc使用間隔大於timeBetweenEvictionRunsMillis配置的空閑連接過期時間,執行validationQuery檢測連接是否有效。
    # 數據庫會主動超時並斷開連接,因此建議timeBetweenEvictionRunsMillis小於數據庫的連接主動斷開時間(如mysql的wait_timeout和interactive_timeout)
    # 2)配置間隔多久才進行一次檢測,Destroy線程檢測需要關閉的空閑連接的時間,單位是毫秒
    time-between-eviction-runs-millis: 60000
    # 配置一個連接在池中最小生存的時間,單位是毫秒
    min-evictable-idle-time-millis: 30000
    # max-evictable-idle-time-millis:
    # 屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有: 監控統計用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
    # 配置多個英文逗號分隔
    filters: stat,wall,slf4j
    # 通過connectProperties屬性來打開mergeSql功能;記錄慢SQL
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

  


免責聲明!

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



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