SpringBoot集成Druid内置监控详解

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等。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peterwanghao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值