springboot項目中實現訪問druid內置監控頁面


1、首先加入druid依賴

1
2
3
4
5
< dependency >
     < groupId >com.alibaba</ groupId >
     < artifactId >druid-spring-boot-starter</ artifactId >
     < version >1.1.9</ version >
</ dependency >

2、設置配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 數據庫訪問配置
# 主數據源,默認的
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
spring.datasource.username=root
spring.datasource.password= 123456
  
# 下面為連接池的補充設置,應用到上面所有數據源中
# 初始化大小,最小,最大
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
spring.datasource.testWhileIdle= true
spring.datasource.testOnBorrow= false
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

3、啟動項目后

訪問頁面http://127.0.0.1:8001/druid/sql.html,就可以訪問監控頁面了,其中ip和端口號為項目的ip和端口號。

頁面效果如下:

 

 

 

4、設置druid訪問頁面的用戶名和密碼

只需要在springboot啟動類中加入@bean配置即可:

1
2
3
4
5
6
7
8
9
10
@Bean
public ServletRegistrationBean<StatViewServlet> druidStatViewServlet() {
     ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>( new StatViewServlet(),  "/druid/*" );
     registrationBean.addInitParameter( "allow" , "127.0.0.1" ); // IP白名單 (沒有配置或者為空,則允許所有訪問)
     registrationBean.addInitParameter( "deny" , "" ); // IP黑名單 (存在共同時,deny優先於allow)
     registrationBean.addInitParameter( "loginUsername" , "root" );
     registrationBean.addInitParameter( "loginPassword" , "1234" );
     registrationBean.addInitParameter( "resetEnable" , "false" );
     return registrationBean;
}

 

 

druid監控頁面的配置和使用

Druid運用背景

Druid是由阿里巴巴團隊開發的,能夠提供強大的監控和擴展功能的數據庫連接池。github地址

本項目的項目框架為SpringBoot+Mybatis+Security,並將druid到項目中,作為一個輔助工具幫助提升項目的性能。

Druid配置

1、設置項目依賴

1
2
3
4
5
< dependency >
  < groupId >com.alibaba</ groupId >
      < artifactId >druid-spring-boot-starter</ artifactId >
      < version >1.1.10</ version >
  </ dependency >

2、application.yml中配置Druid數據源,並設置監控參數。YAML文件格式化校驗(https://old.qqe2.com/jsontool/yaml.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
spring:
     #####DruidDataSource配置#####################
     type: com.alibaba.druid.pool.DruidDataSource
     initialSize: 5
     minIdle: 5
     maxActive: 20
     # 配置獲取連接等待超時的時間
     maxWait: 60000
     # 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
     timeBetweenEvictionRunsMillis: 60000
     # 配置一個連接在池中最小生存的時間,單位是毫秒
     minEvictableIdleTimeMillis: 300000
     validationQuery: SELECT 1 FROM DUAL
     testWhileIdle: true
     testOnBorrow: false
     testOnReturn: false
     # 打開PSCache,並且指定每個連接上PSCache的大小
     poolPreparedStatements: true
     maxPoolPreparedStatementPerConnectionSize: 20
     # 配置監控統計攔截的filters,去掉后監控界面sql無法統計, 'wall' 用於防火牆
     filters: stat,wall,slf4j
     # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
     connectionProperties: druid.stat.mergeSql= true ;druid.stat.slowSqlMillis= 5000
     #合並多個DruidDataSource的監控數據
     useGlobalDataSourceStat: true

3、設置druid訪問頁面的用戶名和密碼,只需要在springboot啟動類中加入@bean配置即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**                                                                                                           
  * @description 注冊一個StatViewServlet,進行druid監控頁面配置                                                              
  * @return servlet registration bean                                                                          
  */                                                                                                           
@Bean                                                                                                         
public ServletRegistrationBean druidStatViewServlet() {
    //先配置管理后台的servLet,訪問的入口為/druid/                                                      
     ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(                            
            new StatViewServlet(), "/druid/*" );
     // IP白名單 (沒有配置或者為空,則允許所有訪問)
     servletRegistrationBean.addInitParameter( "allow" , "127.0.0.1" );
     // IP黑名單 (存在共同時,deny優先於allow)                                                     
  servletRegistrationBean.addInitParameter( "deny" , "" );          
     servletRegistrationBean.addInitParameter( "loginUsername" , "admin" );                                       
     servletRegistrationBean.addInitParameter( "loginPassword" , "sdb3309" );                                     
     servletRegistrationBean.addInitParameter( "resetEnable" , "false" );                                         
     return servletRegistrationBean;                                                                           
}

4、注冊一個過濾器,允許Druid監控頁面的正常瀏覽

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**                                                                                                                     
  * @description 注冊一個過濾器,允許頁面正常瀏覽                                                                  
  * @return filter registration bean                                                                                     
  */                                                                                                                     
@Bean                                                                                                                   
public FilterRegistrationBean druidStatFilter(){                                                                        
     FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(                                         
             new WebStatFilter());                                                                                       
     // 添加過濾規則.                                                                                                          
     filterRegistrationBean.addUrlPatterns( "/*" );                                                                        
     // 添加不需要忽略的格式信息.                                                                                                    
     filterRegistrationBean.addInitParameter( "exclusions" , "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" );               
     return filterRegistrationBean;                                                                                      
}

5、啟動項目后,訪問頁面http://ip:port/druid/sql.html(其中ip和端口號為項目的ip和端口號),使用配置的用戶名與密碼登錄,就可以訪問監控頁面了。

 

 

 

Druid詳細配置

開啟慢sql監控

SQL監控中,有一項關於sql執行最慢執行時間的統計,但是只有一個值,就是一條sql語句最慢的執行時間記錄,其他執行時間是看不到的,只能通過總時間來進行粗略的估計;一旦項目重啟,這些記錄就全部消失,因此需要制定相應的日志輸出策略。

具體步驟:

1、配置慢sql及日志攔截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**                         
  * @description 配置慢sql攔截器       
  * @return                  
  */                         
  @Bean (name = "statFilter" )                                                
  public StatFilter statFilter(){                                           
      StatFilter statFilter = new StatFilter();                             
      //慢sql時間設置,即執行時間大於200毫秒的都是慢sql                                        
      statFilter.setSlowSqlMillis( 30 );                                      
      statFilter.setLogSlowSql( true );
      statFilter.setMergeSql( true );                                       
      return statFilter;                                                    
  }                                                                         
   /**                         
  * @description 配置日志攔截器       
  * @return                  
  */                                                                        
  @Bean (name = "logFilter" )                                                 
  public Slf4jLogFilter logFilter(){                                        
      Slf4jLogFilter slf4jLogFilter = new Slf4jLogFilter();                 
      slf4jLogFilter.setDataSourceLogEnabled( true );                         
      slf4jLogFilter.setStatementExecutableSqlLogEnable( true );              
      return slf4jLogFilter;                                                
  }

2、修改application.yml,增加慢sql日志的輸出策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
logging:
   pattern: #配置日志格式 %d:日期 , %msg:日志信息 ,%n換行
    console: "%d - %msg%n" #設置控制台打印格式
   file: "%d{yyyy/MM/dd-HH:mm} %-5level %logger- %msg%n"
level:
  root: INFO
     org:
       springframework:
       security: ERROR
       web: ERROR
       hhu.yu: INFO
file:
  name: YU.log
     max-history: 30

3、修改數據源配置,設置慢sql攔截器和sql攔截器

1
2
3
4
5
6
7
8
9
10
11
@Bean                                                                   
  @Primary                     
  @Qualifier ( "mainDataSource" )                                            
  @ConfigurationProperties (prefix = "spring.datasource.main" )             
  DataSource mainConfig() throws SQLException{                            
      DruidDataSource build = DruidDataSourceBuilder.create().build();    
      List<Filter> filters = new ArrayList<>();                           
      filters.add(statFilter());                                          
      filters.add(logFilter());                                           
      build.setProxyFilters(filters);                                     
      return build;

重啟系統后查看druid監控后台,由於設置了慢sql的時間為大於200毫秒,所以執行時間大於200毫秒的都會被紅色標注。查看日志文件,可以看到日志文件中存在慢sql記錄的數據(包括慢sql以及這條sql語句執行的時間)

開啟Spring監控

在監控面板中開啟spring監控功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Configuration
@EnableAspectJAutoProxy (proxyTargetClass = true )
public class DruidAspectConfig {
     @Bean
     public DruidStatInterceptor druidStatInterceptor() {
         DruidStatInterceptor dsInterceptor = new DruidStatInterceptor();
         return dsInterceptor;
     }
     @Bean
     @Scope ( "prototype" )
     public JdkRegexpMethodPointcut druidStatPointcut() {
         JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
         pointcut.setPatterns( "com.qa.cloud.mapper.*" , "com.qa.cloud.service.*" );
         return pointcut;
     }
     @Bean
     public DefaultPointcutAdvisor druidStatAdvisor(DruidStatInterceptor druidStatInterceptor, JdkRegexpMethodPointcut druidStatPointcut) {
         DefaultPointcutAdvisor defaultPointAdvisor = new DefaultPointcutAdvisor();
         defaultPointAdvisor.setPointcut(druidStatPointcut);
         defaultPointAdvisor.setAdvice(druidStatInterceptor);
         return defaultPointAdvisor;
     }
轉自:https://www.jb51.net/article/215301.htm


免責聲明!

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



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