首页 > 技术文章 > springboot中使用druid和监控配置

ming-blogs 2019-01-18 17:32 原文

如果想要监控自己的项目的访问情况及查看配置信息,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

出现以下页面

输入用户名:admin和密码:123456就可以登录成功了,然后查看监控信息。

参考

https://www.jianshu.com/p/e3cd2e1c2b0c

推荐阅读