Springboot整合Druid实现对访问的监控

使用SpringBoot简单了解Druid的监控系统 ,我们使用Druid可能平常最多的就是连接池,但是Druid还可以实现监控系统,环境这里采用的是Springboot+mybatisPlus+Druid

Springboot整合Druid实现对访问的监控_第1张图片

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--MySQL依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--springboot test依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--mybatis-plus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-`在这里插入代码片`starter</artifactId>
            <version>1.1.10</version>
        </dependency>



# 配置Druid的配置类
@Configuration
public class DruidMonitroConfiguration {
        // 1. 对于当前这个配置仅仅是让一个Druid监控界面可以启动起来  但是具体里面的监控项目还不能够直接给我们提供支持,如果你要想使用以上这些所有的监控项来监控当前的系统状态暂时都无法使用,因为这些组件都是需额外的配置
    
    @Bean("druidStatViewServlet")
    public ServletRegistrationBean<StatViewServlet> getDruidStatViewServlet() {
        # druid的访问路径
        ServletRegistrationBean<StatViewServlet> registrationBean
                = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");

        registrationBean.addInitParameter(StatViewServlet.PARAM_NAME_ALLOW, "127.0.0.1");//白名单
# 黑名单没有        registrationBean.addInitParameter(StatViewServlet.PARAM_NAME_DENY, "");//黑名单
        registrationBean.addInitParameter(StatViewServlet.PARAM_NAME_USERNAME, "admin");//用户名
        registrationBean.addInitParameter(StatViewServlet.PARAM_NAME_PASSWORD, "admin");//密码
        registrationBean.addInitParameter(StatViewServlet.PARAM_NAME_RESET_ENABLE, "true");//允许重置
        return registrationBean;
  }
######################2. 添加Druid对web的访问控制
    @Bean("webStatFilter")
    public WebStatFilter getWebStatFilter() {
        WebStatFilter statFilter = new WebStatFilter();
        statFilter.setSessionStatEnable(true);// 对session进行监控
        return statFilter;
    }

    // 配置好了一个web监控的处理
    @Bean
    @DependsOn("webStatFilter")
    public FilterRegistrationBean<WebStatFilter> getDruidStatViewServlet(WebStatFilter webStatFilter) {
        FilterRegistrationBean<WebStatFilter> registrationBean
                = new FilterRegistrationBean<>(webStatFilter);
        registrationBean.addUrlPatterns("/*"); //对所有的路径都进行监控配置
        registrationBean.addInitParameter
                (WebStatFilter.PARAM_NAME_EXCLUSIONS, "*.js,*.gif,/druid/*");// 排除路径
        return registrationBean;


    }

}
yaml
spring:

    datasource:
      # 1. DRUID 数据源的类型
      type: com.alibaba.druid.pool.DruidDataSource
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/lvhao?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
      username: root
      password: root
      druid: # 定义数据库连接处所需要的相关配置项
        initial-Size: 5  # 初始化连接池大小
        min-idle: 10  # 最小维持连接池大小
        max-active: 40 #最大可提供链接数量  你有多少人可以链接 呢么如果现在链接都满的话 就等待
        max-wait: 5000 #等待时间  如果连接池满的话 最长的等待时间
        time-between-eviction-runs-millis: 4000 # 关闭空闲链接间隔 长期不使用的链接(我需要释放)
        min-evictable-idle-time-millis: 3000 #l链接的最小生存时间
        validation-query: SELECT 1 FROM DUAL #数据库的状态的链接检查
        test-while-idle: true # 判断是否为可用链接 拿到一个可用链接之后 在进行一个后续可用处理
        test-on-borrow: false #  在链接前是否需要测试
        test-on-return: false #归还链接前是否要测试
配置好Druid对web的支持 ,再写一个test类,这样我们就可以 访问一个controller 

Springboot整合Druid实现对访问的监控_第2张图片

当我们访问 http://localhost:8080/druid/index.html 的时候
就可以看到druid的面板了,这里可以看到druid 可以监控web,sql, 以及sql 防火墙 ,session 之类的
再之后我们访问http://localhost:8080/message/1?a (看我controller的url)

Springboot整合Druid实现对访问的监控_第3张图片
Springboot整合Druid实现对访问的监控_第4张图片

对web的监控

Springboot整合Druid实现对访问的监控_第5张图片

对url的监控

Springboot整合Druid实现对访问的监控_第6张图片

对session的监控

Springboot整合Druid实现对访问的监控_第7张图片

你看这里的web应用显示的是请求次数7次,因为我url 访问了7次,
并且记录了我的session以及访问的url 信息
之后我们接着来看对慢sql的排查,一般情况下sql查询超过2s就定义为慢sql, 通过Druid我们就可以知道那个sql执行慢
但是我这里用1 是为了好演示效果

Springboot整合Druid实现对访问的监控_第8张图片

我现在新建立一个类   因为项目使用的是mybatisPlus
并且访问localhost:8080/echo

Springboot整合Druid实现对访问的监控_第9张图片

当我不断的访问 这个url时

Springboot整合Druid实现对访问的监控_第10张图片
Springboot整合Druid实现对访问的监控_第11张图片

可以看到 第一我后台打印这个慢sql 日志了 当然在Druid面板上也可以看到
我们点进去也可以看到具体的详情以及明细

Springboot整合Druid实现对访问的监控_第12张图片

这里的数据源显示就显示出你现在数据库的配置信息

Springboot整合Druid实现对访问的监控_第13张图片

 再之后我们可以进行一个sql 防火墙的配置,SQL防火墙是数据库层面的防火墙功能,可以防止恶意SQL注入。
 比如说 update 后面没有where语句 这样进行update的时候就是全表update了
 

Springboot整合Druid实现对访问的监控_第14张图片

spring:

    datasource:
      # 1. DRUID 数据源的类型
      type: com.alibaba.druid.pool.DruidDataSource
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/lvhao?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
      username: root
      password: abce1qaz
      druid: # 定义数据库连接处所需要的相关配置项
        initial-Size: 5  # 初始化连接池大小
        min-idle: 10  # 最小维持连接池大小
        max-active: 40 #最大可提供链接数量  你有多少人可以链接 呢么如果现在链接都满的话 就等待
        max-wait: 5000 #等待时间  如果连接池满的话 最长的等待时间
        time-between-eviction-runs-millis: 4000 # 关闭空闲链接间隔 长期不使用的链接(我需要释放)
        min-evictable-idle-time-millis: 3000 #l链接的最小生存时间
        validation-query: SELECT 1 FROM DUAL #数据库的状态的链接检查
        test-while-idle: true # 判断是否为可用链接 拿到一个可用链接之后 在进行一个后续可用处理
        test-on-borrow: false #  在链接前是否需要测试
        test-on-return: false #归还链接前是否要测试
        #--------------man sql
        filter:
          stat:
            merge-sql: true # 统计相同的sql
            log-slow-sql: true # 记录慢sql
#            slow-sql-millis: 2000 # 慢slq执行时间标准
            slow-sql-millis: 1 # 慢slq执行时间标准
		防火墙的配置
          wall:
            enabled: true #k开启sql防火墙
            config:
              multi-statement-allow: true #允许执行批处理
              delete-allow: false # 不允许执行删除



比如说

@RestController
@RequestMapping("/echo/test")
public class TestController3 {
    @Autowired
    private UserDAO userDAO;

    @GetMapping("/insert")
    public Object echo() {
        for (int i = 0; i < 5; i++) {
            User user = new User();

            user.setId("11"+i);
            user.setName("zhangsan"+i );
            user.setAge(11);
            user.setBir(new Date());
            userDAO.insert(user);
        }
        return "1";
    }
    @GetMapping("/delete")
    public Object delete() {
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.eq("id",110);
        userDAO.delete(objectQueryWrapper);
        return "1";
    }

}
当我访问 /echo/test/insert 的时候是允许批量访问的
当我当问 /echo/test/delete 的时候会报错的 因为 我此时的防火墙设置的不允许执行删除
这样我们就可以对我们的sql 以及慢sql进行一个查询以及记录

你可能感兴趣的:(spring,boot,mybatis,java)