使用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 {
@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);
return statFilter;
}
@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:
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:
就可以看到druid的面板了,这里可以看到druid 可以监控web,sql, 以及sql 防火墙 ,session 之类的
再之后我们访问http:
对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:
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
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
filter:
stat:
merge-sql: true
log-slow-sql: true
slow-sql-millis: 1
防火墙的配置
wall:
enabled: true
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进行一个查询以及记录