如果想要監控自己的項目的訪問情況及查看配置信息,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、配置監控統計功能1
3.1 配置Servlet
package org.lzm.springbootnew.druid;
import com.alibaba.druid.support.http.StatViewServlet;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
/**
- Create with Intellij idea
- User:lzm
- 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
package org.lzm.springbootnew.druid;
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、配置監控系統方式2
以上配置的監控方式是使用了原生的servlet,filter方式,然后通過@ServletComponentScan進行啟動掃描包的方式進行處理的,你會發現我們的servlet,filter根本沒有任何的編碼。
在這里我們將使用另外一種方式進行處理:使用代碼注冊Servlet:
@ConfigurationProperties會把配置文件的參數自動賦值到dataSource里。
druidStatViewServlet()配置監控界面。
druidWebStatViewFilter()編寫過濾器,配合druid監控的使用。
package org.lzm.springbootnew.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:lzm
- 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
/
@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
-
/
@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
出現以下頁面 -
-
輸入用戶名:admin和密碼:123456就可以登錄成功了,然后查看監控信息。