Springboot整合Druid实现对访问的监控方式
作者:一个诺诺前行的后端程序员
Springboot整合Druid实现对访问的监控
使用SpringBoot简单了解Druid的监控系统 ,我们使用Druid可能平常最多的就是连接池,但是Druid还可以实现监控系统,环境这里采用的是Springboot+mybatisPlus+Druid
<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
当我们访问 http://localhost:8080/druid/index.html 的时候
就可以看到druid的面板了,这里可以看到druid 可以监控web,sql, 以及sql 防火墙 ,session 之类的
再之后我们访问http://localhost:8080/message/1?a (看我controller的url)
对web的监控
对url的监控
对session的监控
你看这里的web应用显示的是请求次数7次,
因为我url 访问了7次,并且记录了我的session以及访问的url 信息
之后我们接着来看对慢sql的排查,一般情况下sql查询超过2s就定义为慢sql, 通过Druid我们就可以知道那个sql执行慢
但是我这里用1 是为了好演示效果
我现在新建立一个类 因为项目使用的是mybatisPlus
并且访问localhost:8080/echo
当我不断的访问 这个url时
可以看到 第一我后台打印这个慢sql 日志了 当然在Druid面板上也可以看到
我们点进去也可以看到具体的详情以及明细
这里的数据源显示就显示出你现在数据库的配置信息
再之后我们可以进行一个sql 防火墙的配置,SQL防火墙是数据库层面的防火墙功能,可以防止恶意SQL注入。
比如说 update 后面没有where语句 这样进行update的时候就是全表update了
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进行一个查询以及记录
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。