Druid的监控统计功能是通过filter-chain扩展实现,采集的信息非常全面,包括SQL执行、并发、慢查、执行时间区间分布等。并且Druid内部提供了一个Servlet用于展示Druid的统计信息。
想要集成SQL监控页面需要在yml中增加如下内容:
spring:
datasource:
druid:
# StatViewServlet配置 sql监控
stat-view-servlet:
enabled: true
url-pattern: "/druid/*"
reset-enable: false
login-username: druid
login-password: druid123
#允许那些ip
allow: 127.0.0.1,192.168.120.93,10.10.231.126
#禁止那些ip
deny: 192.168.120.93
# WebStatFilter配置 web-jdbc关联监控
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
在工程中加载这些配置项是通过druid-spring-boot-starter。Druid Spring Boot Starter 配置属性的名称完全遵照 Druid,你可以通过 Spring Boot 配置文件来配置Druid数据库连接池和监控,如果没有配置则使用默认值。
查看源码可以看到加载这些配置核心类为DruidDataSourceAutoConfigure:
@Configuration
@ConditionalOnClass(DruidDataSource.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class,
DruidStatViewServletConfiguration.class,
DruidWebStatFilterConfiguration.class,
DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);
@Bean(initMethod = "init")
@ConditionalOnMissingBean
public DataSource dataSource() {
LOGGER.info("Init DruidDataSource");
return new DruidDataSourceWrapper();
}
}
- @Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
- @ConditionalOnClass注解表示在工程中能找到DruidDataSource类才会构建这个bean。
- @AutoConfigureBefore 设置自动加载顺序。使用@AutoConfigureBefore会优先加载当前的配置类,然后再去加载before中的配置类。这里的作用是先加载DruidDataSourceAutoConfigure,后加载Spring的DataSourceAutoConfiguration。
- @EnableConfigurationProperties注解的作用是将用 @ConfigurationProperties 注解的类生效。这里包括Druid的properties类DruidStatProperties(前缀spring.datasource.druid)和Spring的DataSourceProperties类(前缀spring.datasource)
- @Import注解是用来导入配置类或者一些需要前置加载的类。IOC容器会自动注册这些组件。在这里可看到会加载servlet、filter等。
以监控数据展现的StatViewServlet为列
@ConditionalOnWebApplication
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true")
public class DruidStatViewServletConfiguration {
private static final String DEFAULT_ALLOW_IP = "127.0.0.1";
@Bean
public ServletRegistrationBean statViewServletRegistrationBean(DruidStatProperties properties) {
DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean();
registrationBean.setServlet(new StatViewServlet());
registrationBean.addUrlMappings(config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*");
if (config.getAllow() != null) {
registrationBean.addInitParameter("allow", config.getAllow());
} else {
registrationBean.addInitParameter("allow", DEFAULT_ALLOW_IP);
}
if (config.getDeny() != null) {
registrationBean.addInitParameter("deny", config.getDeny());
}
if (config.getLoginUsername() != null) {
registrationBean.addInitParameter("loginUsername", config.getLoginUsername());
}
if (config.getLoginPassword() != null) {
registrationBean.addInitParameter("loginPassword", config.getLoginPassword());
}
if (config.getResetEnable() != null) {
registrationBean.addInitParameter("resetEnable", config.getResetEnable());
}
return registrationBean;
}
}
这里使用的ServletRegistrationBean是SpringBoot中的Servlet注册类,它注册了StatViewServlet,其继承于ResourceServlet,是一个HttpServlet类。在ResourceServlet类中实现了访问口令验证和IP访问控制。
Druid Spring Boot Starter 可帮助你在Spring Boot项目中轻松集成Druid数据库连接池和监控。会读取以spring.datasource.druid为前缀的配置项,创建Druid自己的数据源DruidDataSource以及进行SQL监控所需的filter和servlet等。