天天看點

springboot中使用druid和監控配置

如果想要監控自己的項目的通路情況及檢視配置資訊,druid是一個很好的選擇,可能你會問druid是什麼?有什麼用?優點是什麼?

Druid簡介

Druid是阿裡巴巴開源的資料庫連接配接池,号稱是Java語言中最好的資料庫連接配接池,能夠提供強大的監控和擴充功能。GitHub位址:​​https://github.com/alibaba/druid。​​​Druid有以下優點:

1) 可以監控資料庫通路性能,Druid内置提供了一個功能強大的StatFilter插件,能夠詳細統計SQL的執行性能,這對于線上分析資料庫通路性能有幫助。

2) 替換DBCP和C3P0,Druid提供了一個高效、功能強大、可擴充性好的資料庫連接配接池。

3) 資料庫密碼加密。直接把資料庫密碼寫在配置檔案中,這是不好的行為,容易導緻安全問題。DruidDriver和DruidDataSource都支援PasswordCallback。

4) SQL執行日志,Druid提供了不同的LogFilter,能夠支援Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的資料庫通路情況。

5) 擴充JDBC,如果你要對JDBC層有程式設計的需求,可以通過Druid提供的Filter-Chain機制,很友善編寫JDBC層的擴充插件。

Spring Boot預設的資料源是:org.apache.tomcat.jdbc.pool.DataSource

下面來說明如何在 spring Boot 中配置使用Druid

整體步驟:

1 —— Druid簡單介紹,具體看官網;

2 —— 在pom.xml配置druid依賴包;

3 —— 配置application.properties加入資料庫源類型等參數;

4 —— 編寫druid servlet和filter提供監控頁面通路;

5 —— 輸入位址進行測試;

1、添加依賴

如果想要使用druid,首先要先添加druid依賴如下。

<!--druid監控配置 -->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

<version>1.0.18</version>

</dependency>

2、配置資料源相關資訊(application.properties)

# Mysql資料庫連接配接 alibaba資料源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=
# 資料源初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# 配置擷取連接配接等待逾時的時間
spring.datasource.maxWait=60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接配接,機關是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一個連接配接在池中最小生存的時間,機關是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
# 建議配置為true,不影響性能,并且保證安全性。申請連接配接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接配接是否有效。
spring.datasource.testWhileIdle=true
# 申請連接配接時執行validationQuery檢測連接配接是否有效,做了這個配置會降低性能。
spring.datasource.testOnBorrow=false
# 歸還連接配接時執行validationQuery檢測連接配接是否有效,做了這個配置會降低性能
spring.datasource.testOnReturn=false
# 打開PSCache,并且指定每個連接配接上PSCache的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置監控統計攔截的filters,去掉後監控界面sql無法統計,’wall’用于防火牆
spring.datasource.filters=stat,wall,log4j
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多個DruidDataSource的監控資料
spring.datasource.useGlobalDataSourceStat=true      

這時候啟動應用就可以看到看到列印資訊就是使用我們配置的資料源了:

[main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited

3、配置監控統計功能

3.1 配置Servlet

import com.alibaba.druid.support.http.StatViewServlet;

import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;

    /**
     * Create with Intellij idea
     * User: mingtian
     * Date:2018/7/10
     * Time:22:10
     * druid資料源狀态監控.
     **/
    @WebServlet(urlPatterns = "/druid/",
            initParams = {
                    @WebInitParam(name = "allow", value = "127.0.0.1"), //ip白名單(沒有配置為空,則允許所有通路)
                    @WebInitParam(name = "deny", value = ""),//ip黑名單(存在時,deny優先于allow)
                    @WebInitParam(name = "loginUsername", value = "admin1"), //使用者名
                    @WebInitParam(name = "loginPassword", value = "123456"),//密碼
                    @WebInitParam(name = "resetEnable", value = "false")//禁用HTML頁面上的"resetAll"功能
            })
    public class DruidStatViewServlet extends StatViewServlet {
        private static final long serialVersionID = 1L;
    }      

3.2配置Filter

import com.alibaba.druid.support.http.WebStatFilter;

import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

    /**
     * Create with Intellij idea
     * User:lzm
     * Date:2018/7/10
     * Time:22:06
     * druid過濾器
     **/
    @WebFilter(filterName = "druidWebStatFilter", urlPatterns = "/",
            initParams = {
                    @WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.css,*.ico,/druid/*")
                    //忽略資源
            })
    public class DruidStatFilter extends WebStatFilter {
    }      

需要在啟動類上面添加@ServletComponentScan注解(使spring能夠掃描到我們自己編寫的servlet和filter),不然通路不到頁面(404)。

4、配置監控系統方式

以上配置的監控方式是使用了原生的servlet,filter方式,然後通過​​@ServletComponentScan​​​進行啟動掃描包的方式進行處理的,你會發現我們的servlet,filter根本沒有任何的編碼。

在這裡我們将使用另外一種方式進行處理:使用代碼注冊Servlet:

​​​@ConfigurationProperties​​​會把配置檔案的參數自動指派到dataSource裡。

druidStatViewServlet()配置監控界面。

druidWebStatViewFilter()編寫過濾器,配合druid監控的使用。

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
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 java.sql.SQLException;

    /**
     * Create with Intellij idea
     * User: mingtian
     * Date:2018/7/10
     * Time:17:43
     */
    @Configuration
    public class DruidConfig {
        private Logger logger = LoggerFactory.getLogger(DruidConfig.class);

        @Bean
        @ConfigurationProperties(“spring.datasource”)
        public DruidDataSource druidDataSource() {

            DruidDataSource druidDataSource = new DruidDataSource();
            return druidDataSource;
        }
    }      

注冊一個StatViewServlet

/**
     * 注冊一個StatViewServlet
     **/
    @Bean
    public ServletRegistrationBean druidStatViewServlet() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),” / druid /“)
        ;
        //添加初始化參數initParams
        //白名單
        servletRegistrationBean.addInitParameter(“allow”,” 127.0 .0 .1”);

        //ip黑名單(存在共同時,deny優先于allow) : 如果滿足deny的話提示:Sorry, you are not permitted to view this page.
        servletRegistrationBean.addInitParameter(“deny”,””);
        //登入檢視資訊的賬号和密碼
        servletRegistrationBean.addInitParameter(“loginUsername”,”admin”);
        servletRegistrationBean.addInitParameter(“loginPassword”,”123456”);
        //是否能夠重置資料
        servletRegistrationBean.addInitParameter(“resetEnable”,” false”);
        return servletRegistrationBean;
    }      

注冊一個 filterRegistrationBean

/**
     * 注冊一個:filterRegistrationBean
     *
     * @return
     **/
    @Bean
    public FilterRegistrationBean druidStatFilter() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        //添加過濾規則
        filterRegistrationBean.addUrlPatterns(“ /“);
        //filterRegistrationBean.addInitParameter(“urlPatterns”,”/“);
        //添加不需要忽略的格式資訊
        filterRegistrationBean.addInitParameter(“exclusions”,”.js, gif,.jpg,.png,.css,.ico,/druid2 /“);
        return filterRegistrationBean;
    }      

在注入的兩個bean中,一個是StatViewServlet(),一個是WebStatFilter()

StatViewServlet是一個标準的javax.servlet.http.HttpServlet

1.配置url-pattern

根據配置中的url-pattern來通路内置監控頁面,如果是上面的配置/druid/*,内置監控頁面的首頁是/druid/index.html

2.配置allow和deny

判斷規則:

deny優先于allow,如果在deny清單中,就算在allow清單中,也會被拒絕。

如果allow沒有配置或者為空,則允許所有通路

其中

128.242.127.1/24

24表示,前面24位是子網路遮罩,比對的時候,前面24位相同就比對。

不支援IPV6

由于比對規則不支援IPV6,配置了allow或者deny之後,會導緻IPV6無法通路。

3.配置resetEnable

在StatViewSerlvet輸出的html頁面中,有一個功能是Reset All,執行這個操作之後,會導緻所有計數器清零,重新計數。你可以通過配置參數關閉它。

WebStatFilter用于采集web-jdbc關聯監控的資料。

exlusions配置

經常需要排除一些不必要的url,比如.js,/jslib/等等。配置在init-param中。

以上2種配置監控的方式,個人還是比較喜歡第2種方式。

啟動應用就可以通路:​​​http://127.0.0.1:8080/druid/index.html​​​出現以下頁面

  • springboot中使用druid和監控配置