十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能

十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能

文章目录

  • 十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能
  • 1. Druid 的基本介绍
  • 2. 准备工作:
  • 3. Druid 监控功能
    • 3.1 Druid 监控功能 —— Web 关联监控
    • 3.2 Druid 监控功能 —— SQL监控
    • 3.3 Druid 监控功能 —— SQL防火墙
    • 3.4 Druid 监控功能 —— Session 监控
  • 4. Druid Spring Boot Starter
  • 5. 总结:
  • 6. 最后:


1. Druid 的基本介绍

官方文档 :https://github.com/alibaba/druid

在这里插入图片描述

https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

在这里插入图片描述

HiKariCP:是目前市场上非常优秀的数据源,是 Spring Boot2默认数据源。关于这一点的测试,大家可以移步至 ✏️✏️✏️ 十五,Spring Boot 整合连接数据库(详细配置)-CSDN博客

Druid:性能优秀,Druid提供的监控功能外{Java基础},还集成了SQL监控。可以清楚知道连接池和 SQL的工作情况。所以根据项目需要,我们也要掌握Druid和SpringBoot整合。

Druid到 Spring-Boot方式:两种方式:

  1. 自定义方式

  2. 引入 starter 方式

2. 准备工作:

准备好我们需要测试的数据表,

# 创建 furns_ssm
DROP DATABASE if EXISTS spring_boot
CREATE DATABASE spring_bootUSE spring_boot # 创建家居表 数据表
CREATE TABLE furn (
id INT(11) PRIMARY KEY auto_increment, -- id
name VARCHAR(64) not NULL, -- 家具名
maker VARCHAR(64) not null,  -- 厂商
`price` DECIMAL(11,2) not null, -- 价格
`sales` INT(11) not null,  -- 销量
`stock` INT(11) not null,  -- 库存
`img_path` VARCHAR(256) not null  -- 照片路径-- 注意:不是单引号
);SELECT * from  furn;INSERT into furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(null,'北欧风格小桌子','熊猫家居',100,666,7,'assets/images/producth')
INSERT into furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(null,'简约风格小椅子','熊猫家居',200,666,7,'assets/images/producth')
INSERT into furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(null,'典雅风格小桌子','蚂蚁家居',100,666,7,'assets/images/producth')
INSERT into furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(null,'温馨风格小桌子','蚂蚁家居',100,666,7,'assets/images/producth')

在这里插入图片描述

导入相关的 jar 依赖。

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.rainbowsea</groupId><artifactId>springboot_druid</artifactId><version>1.0-SNAPSHOT</version><!--    导入SpringBoot 父工程-规定写法--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version></parent><!--    导入web项目场景启动器:会自动导入和web开发相关的jar包所有依赖【库/jar】--><!--    后面还会在说明spring-boot-starter-web 到底引入哪些相关依赖--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--引入lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--        进行数据库开发,引入 data-jdbc starter  spring boot 自带的数据库连接池HikariDataSource--><!--        注意:spring boot 导入的该 jdbc  HikariDataSource 数据源1. HikariDataSource 数据源2. jdbc 数据链接3. tx  事务4. 注意:spring boot 并不能知道,你的项目想要操作的是什么数据库,所以你需要指定你想要的数据库,告诉spring boot 你想要连接的数据库--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><!--1, 引入mysql 驱动,这里我们引入的是 8.0.262. 这个mysql驱动的版本要和实际安装的mysql版本一致3. 我们的spring-boot mysql 区别仲裁版本是   <mysql.version>8.0.26</mysql.version>4. 这个mysql 驱动的版本,也可以在pom.xml properties 配置文件当中指定。--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><!--            <version>8.0.26</version>--></dependency><!--        如何开发springboot 测试类,我们需要引入  spring-boot-starter-test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--        引入 druid 依赖--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency></dependencies></project>

注意:这里我们需要导入的 Druild 的依赖

<!--        引入 druid 依赖--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>

创建数据表 furn 映射在Java当中的 Bean 对象。这里我们使用了 lombok 插件进行。

在这里插入图片描述

package com.rainbowsea.springboot.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;@Data
@AllArgsConstructor
@NoArgsConstructor  // 使用 lombok 插件进行自动配置
public class Furn {private Integer id;private String name;private String maker;private BigDecimal price;private  Integer sales;private  Integer stock;private String imgPath = "assets/images/product-image/1.jpg";
}

编写启动程序:

在这里插入图片描述

package com.rainbowsea.springboot;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class Application {public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(Application.class, args);}
}

我们需要在类路径下 resources 创建一个名为 application.yaml 文件,编写连接的数据库信息。

在这里插入图片描述

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8username: rootpassword: MySQL123

这里我们通过定义配置类的方式 ——> 将Spring Boot 当中默认的 HikariDataSource 数据库连接池,换成是我们需要的 Druid数据库连接池

在这里插入图片描述

在这里插入图片描述

package com.rainbowsea.springboot.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.SpringBootConfiguration;
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 javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Arrays;@Configuration  // 标注配置类
public class DruidDataSourceConfig {// 编写方法,注入 DruidDataSource@Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称// 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的@ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml// 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。// 注入到 ioc 容器当中。public DataSource dataSource() throws SQLException {// 1.配置了 @ConfigurationProperties("spring.datasource")// 就可以读取到application.yaml的配置// 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联DruidDataSource druidDataSource = new DruidDataSource();//druidDataSource.setUrl();//druidDataSource.setUsername();//druidDataSource.setPassword();return druidDataSource;}}

注意:对应的配置类,要加上 @Configuration 标注配置类。

  • @Bean // 注入到 ioc 容器当中,不然SpringBoot 无法使用,没有指明名字,默认方法名就是 id/名称
  • @ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。

运行测试,看看,我们是否成功切换数据库了。

在这里插入图片描述

在这里插入图片描述

为什么引入了 druid的依赖,就切换为了 Druid数据库连接池了

DataSourceAutoConfiguration.java 类。

在这里插入图片描述

@Configuration(proxyBeanMethods = false)@Conditional({DataSourceAutoConfiguration.PooledDataSourceCondition.class})@ConditionalOnMissingBean({DataSource.class, XADataSource.class})@Import({Hikari.class, Tomcat.class, Dbcp2.class, OracleUcp.class, Generic.class, DataSourceJmxConfiguration.class})protected static class PooledDataSourceConfiguration {protected PooledDataSourceConfiguration() {}}

@ConditionalOnMissingBean({DataSource.class, XADataSource.class}) // 默认的数据源是如配置?
解读通过: @ConditionalOnMissingBean({DataSource.class, XADataSource.class}) 判断如果容器有DataSource Bean 就不注入HiKariDatasource

3. Druid 监控功能

1.第一种方式是:在 web.xml 当中配置,需要在你web应用中的 WEB-INF/web.xml
根据配置中的url-pattern来访问内置监控页面,如果
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE

在这里插入图片描述

根据配置中的 url-pattern 来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html

首先配置druid的监控页功能, 这里我们使用配置类的方式:注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入。

在这里插入图片描述

    // 配置druid的监控页功能, 注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入@Bean // 注意要注入到 ioc 容器当中public ServletRegistrationBean staatViewServlet() {// 创建 StatViewServletStatViewServlet statViewServlet = new StatViewServlet();ServletRegistrationBean<StatViewServlet>statViewServletServletRegistrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");// statViewServlet, "/druid/*") 表示映射的路径// 设置 init-parameter,就是设置进入 Druid的账号和密码;statViewServletServletRegistrationBean.addInitParameter("loginUsername", "rainbowsea");statViewServletServletRegistrationBean.addInitParameter("loginPassword", "666");return statViewServletServletRegistrationBean;}
package com.rainbowsea.springboot.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.SpringBootConfiguration;
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 javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Arrays;@Configuration  // 标注配置类
public class DruidDataSourceConfig {// 编写方法,注入 DruidDataSource@Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称// 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的@ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml// 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。// 注入到 ioc 容器当中。public DataSource dataSource() throws SQLException {// 1.配置了 @ConfigurationProperties("spring.datasource")// 就可以读取到application.yaml的配置// 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联DruidDataSource druidDataSource = new DruidDataSource();//druidDataSource.setUrl();//druidDataSource.setUsername();//druidDataSource.setPassword();return druidDataSource;}// 配置druid的监控页功能, 注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入@Bean // 注意要注入到 ioc 容器当中public ServletRegistrationBean staatViewServlet() {// 创建 StatViewServletStatViewServlet statViewServlet = new StatViewServlet();ServletRegistrationBean<StatViewServlet>statViewServletServletRegistrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");// statViewServlet, "/druid/*") 表示映射的路径// 设置 init-parameter,就是设置进入 Druid的账号和密码;statViewServletServletRegistrationBean.addInitParameter("loginUsername", "rainbowsea");statViewServletServletRegistrationBean.addInitParameter("loginPassword", "666");return statViewServletServletRegistrationBean;}}

说明:

配置 druid 的监控页功能, 注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入。

不要漏了 @Bean 注解注入到 ioc 容器当中,才能被Spring Boot 使用起来。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

运行测试:

在这里插入图片描述

在这里插入图片描述

3.1 Druid 监控功能 —— Web 关联监控

官方文档:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter

Druid 监控功能——> web 关联监控,是配置 WebStatFilter。从 WebStatFilter 见名之意,我们就明显的看出,这是一个 Filter 过滤器了。

在这里插入图片描述

在这里插入图片描述

// 配置 WebStatFilter,用于采集 web-jdbc 关联的监控数据// 注意用的是 Filter 过滤器@Beanpublic FilterRegistrationBean webStatFilter() {// 创建 WebStatFilter ,WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);// 默认对所有的url请求进行监控,// 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));// 排除指定的urlwebStatFilterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return webStatFilterFilterRegistrationBean;/*<filter><filter-name>DruidWebStatFilter</filter-name><filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class><init-param><param-name>exclusions</param-name><param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value></init-param></filter><filter-mapping><filter-name>DruidWebStatFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>*/}
package com.rainbowsea.springboot.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.SpringBootConfiguration;
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 javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Arrays;@Configuration  // 标注配置类
public class DruidDataSourceConfig {// 编写方法,注入 DruidDataSource@Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称// 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的@ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml// 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。// 注入到 ioc 容器当中。public DataSource dataSource() throws SQLException {// 1.配置了 @ConfigurationProperties("spring.datasource")// 就可以读取到application.yaml的配置// 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联DruidDataSource druidDataSource = new DruidDataSource();//druidDataSource.setUrl();//druidDataSource.setUsername();//druidDataSource.setPassword();return druidDataSource;}// 配置 WebStatFilter,用于采集 web-jdbc 关联的监控数据// 注意用的是 Filter 过滤器@Beanpublic FilterRegistrationBean webStatFilter() {// 创建 WebStatFilter ,WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);// 默认对所有的url请求进行监控,// 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));// 排除指定的urlwebStatFilterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return webStatFilterFilterRegistrationBean;/*<filter><filter-name>DruidWebStatFilter</filter-name><filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class><init-param><param-name>exclusions</param-name><param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value></init-param></filter><filter-mapping><filter-name>DruidWebStatFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>*/}}

说明:

在这里插入图片描述

在这里插入图片描述

运行测试:

在这里插入图片描述

3.2 Druid 监控功能 —— SQL监控

官网地址:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter

在这里插入图片描述

// 将数据库连接池加入到 druid监视当中
druidDataSource.setFilters(“stat”);

在这里插入图片描述

只需要在配置 DataSource数据源时,添加如下代码即可。druidDataSource.setFilters("stat")

 druidDataSource.setFilters("stat");
// 编写方法,注入 DruidDataSource@Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称// 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的@ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml// 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。// 注入到 ioc 容器当中。public DataSource dataSource() throws SQLException {// 1.配置了 @ConfigurationProperties("spring.datasource")// 就可以读取到application.yaml的配置// 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联DruidDataSource druidDataSource = new DruidDataSource();// 将数据库连接池加入到 druid监视当中druidDataSource.setFilters("stat");return druidDataSource;}
package com.rainbowsea.springboot.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.SpringBootConfiguration;
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 javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Arrays;@Configuration  // 标注配置类
public class DruidDataSourceConfig {// 编写方法,注入 DruidDataSource@Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称// 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的@ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml// 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。// 注入到 ioc 容器当中。public DataSource dataSource() throws SQLException {// 1.配置了 @ConfigurationProperties("spring.datasource")// 就可以读取到application.yaml的配置// 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联DruidDataSource druidDataSource = new DruidDataSource();// 将数据库连接池加入到 druid监视当中druidDataSource.setFilters("stat");return druidDataSource;}// 配置 WebStatFilter,用于采集 web-jdbc 关联的监控数据// 注意用的是 Filter 过滤器@Beanpublic FilterRegistrationBean webStatFilter() {// 创建 WebStatFilter ,WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);// 默认对所有的url请求进行监控,// 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));// 排除指定的urlwebStatFilterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return webStatFilterFilterRegistrationBean;/*<filter><filter-name>DruidWebStatFilter</filter-name><filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class><init-param><param-name>exclusions</param-name><param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value></init-param></filter><filter-mapping><filter-name>DruidWebStatFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>*/}// 配置druid的监控页功能, 注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入@Bean // 注意要注入到 ioc 容器当中public ServletRegistrationBean staatViewServlet() {// 创建 StatViewServletStatViewServlet statViewServlet = new StatViewServlet();ServletRegistrationBean<StatViewServlet>statViewServletServletRegistrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");// statViewServlet, "/druid/*") 表示映射的路径// 设置 init-parameter,就是设置进入 Druid的账号和密码;statViewServletServletRegistrationBean.addInitParameter("loginUsername", "rainbowsea");statViewServletServletRegistrationBean.addInitParameter("loginPassword", "666");return statViewServletServletRegistrationBean;}}

我们编写一个 执行 Sql 语句的,控制 Controller 进行一个,测试

在这里插入图片描述

package com.rainbowsea.springboot.controller;import com.rainbowsea.springboot.bean.Furn;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;
import java.util.List;@Controller
public class DruidSqlController {@Resourceprivate JdbcTemplate jdbcTemplate;@ResponseBody@GetMapping("/sql")public List<Furn> crudDB() {BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class);List<Furn> furns = jdbcTemplate.query("select * from furn", rowMapper);for (Furn furn : furns) {System.out.println(furn);}return furns;}}

运行测试:

在这里插入图片描述

在这里插入图片描述

3.3 Druid 监控功能 —— SQL防火墙

官网地址:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter

在这里插入图片描述

在这里插入图片描述

我们只需要在上面 配置 Druid监控功能的——SQL监控的基础的数据源的后面加上 wall 即可。

在这里插入图片描述

 druidDataSource.setFilters("stat,wall");

@Configuration  // 标注配置类
public class DruidDataSourceConfig {// 编写方法,注入 DruidDataSource@Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称// 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的@ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml// 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。// 注入到 ioc 容器当中。public DataSource dataSource() throws SQLException {// 1.配置了 @ConfigurationProperties("spring.datasource")// 就可以读取到application.yaml的配置// 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联DruidDataSource druidDataSource = new DruidDataSource();// 将数据库连接池加入到 druid监视当中// wall ,将数据库连接池加入sql防火墙druidDataSource.setFilters("stat,wall");return druidDataSource;}
}
package com.rainbowsea.springboot.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.SpringBootConfiguration;
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 javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Arrays;@Configuration  // 标注配置类
public class DruidDataSourceConfig {// 编写方法,注入 DruidDataSource@Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称// 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的@ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml// 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。// 注入到 ioc 容器当中。public DataSource dataSource() throws SQLException {// 1.配置了 @ConfigurationProperties("spring.datasource")// 就可以读取到application.yaml的配置// 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联DruidDataSource druidDataSource = new DruidDataSource();// 将数据库连接池加入到 druid监视当中// wall ,将数据库连接池加入sql防火墙druidDataSource.setFilters("stat,wall");return druidDataSource;}// 配置 WebStatFilter,用于采集 web-jdbc 关联的监控数据// 注意用的是 Filter 过滤器@Beanpublic FilterRegistrationBean webStatFilter() {// 创建 WebStatFilter ,WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);// 默认对所有的url请求进行监控,// 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));// 排除指定的urlwebStatFilterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return webStatFilterFilterRegistrationBean;/*<filter><filter-name>DruidWebStatFilter</filter-name><filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class><init-param><param-name>exclusions</param-name><param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value></init-param></filter><filter-mapping><filter-name>DruidWebStatFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>*/}// 配置druid的监控页功能, 注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入@Bean // 注意要注入到 ioc 容器当中public ServletRegistrationBean staatViewServlet() {// 创建 StatViewServletStatViewServlet statViewServlet = new StatViewServlet();ServletRegistrationBean<StatViewServlet>statViewServletServletRegistrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");// statViewServlet, "/druid/*") 表示映射的路径// 设置 init-parameter,就是设置进入 Druid的账号和密码;statViewServletServletRegistrationBean.addInitParameter("loginUsername", "rainbowsea");statViewServletServletRegistrationBean.addInitParameter("loginPassword", "666");return statViewServletServletRegistrationBean;}}

运行测试:

在这里插入图片描述

3.4 Druid 监控功能 —— Session 监控

默认 Session 监视就是开启的。但是 Druid 只会监控,本项目(localhost)的Session 的内容,其它的项目的Session 是不会被监控的。

在这里插入图片描述

4. Druid Spring Boot Starter

前面我们使用的是自己引入druid+配置类方式整合Druid和监控
Druid Spring Boot Starter 可以让程序员在SpringBoot项目中更加轻松集成Druid和监控。

对应Druid Spring Boot Starter 的配置,我们只需要在 类路径(resources)下创建application.yaml 配置文件,同时在其中配置好,对应的 Druid 监控功能。

我们还是使用上面测试过的 Furn 数据表,进行测试演示。

在这里插入图片描述

package com.rainbowsea.springboot.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;@Data
@NoArgsConstructor  // 空构造器
@AllArgsConstructor  // 全参数构造器  lombok
public class Furn {private Integer id;private String name;private String maker;private BigDecimal price;private  Integer sales;private  Integer stock;private String imgPath = "assets/images/product-image/1.jpg";
}

编写对应的执行 Sql 语句测试的 ,Controller 控制器

在这里插入图片描述

package com.rainbowsea.springboot.controller;import com.rainbowsea.springboot.bean.Furn;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;
import java.util.List;@Controller
public class DruidSqlController {@Resourceprivate JdbcTemplate jdbcTemplate;@ResponseBody@GetMapping(value = "/sql")public List<Furn> crudDB() {BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class);List<Furn> furns = jdbcTemplate.query("select * from furn", rowMapper);for (Furn furn : furns) {System.out.println(furn);}return furns;}
}

编写场景启动器:

在这里插入图片描述

package com.rainbowsea.springboot;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class Application {public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(Application.class, args);}
}

applicaiton.yaml 文件中编写,我们的连接的数据库,以及 Druid数据源,以及Druid监控功能的配置

注意:因为我们的Spring Boot 是默认就会读取 resources 类路径下的 application.yaml 文件当中的信息的,从而配置到对应的类属性值上,所以,我们不需要,额外的配置,让Spring Boot读取到 application.yaml的配置,Spring Boot 默认就会自行去读取里面文件当中的内容

在这里插入图片描述

spring:datasource:password: MySQL123username: rootdriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8# 配置 druid 和监控功能druid:stat-view-servlet:enabled: true # 启用login-username: rainbowsea  # 用户名login-password: 123   # 密码reset-enable: false  # true 表示开启  druid 监控功能# 配置 Web监控web-stat-filter:enabled: true  # 启用url-pattern: /*  # 监视所有exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"  # 排除过滤不监视的内容# 配置 sql监控 和 SQl防火墙,都是在过滤器当中的filter:stat: # sql监控slow-sql-millis: 1000log-slow-sql: trueenabled: true # 开启# 配置 SQl 防火墙wall:config:alter-table-allow: false
#            select-all-column-allow: falsedrop-table-allow: falseenabled: true

运行测试:

在这里插入图片描述

5. 总结:

  1. Druid 的官方文档:官方文档 :https://github.com/alibaba/druid
  2. Druid:性能优秀,Druid提供的监控功能外{Java基础},还集成了SQL监控。可以清楚知道连接池和 SQL的工作情况。所以根据项目需要,我们也要掌握Druid和SpringBoot整合。
  3. Druid:性能优秀,Druid提供的监控功能外{Java基础},还集成了SQL监控。可以清楚知道连接池和 SQL的工作情况。所以根据项目需要,我们也要掌握Druid和SpringBoot整合。
  4. 根据配置中的 url-pattern 来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html
  5. 开启 Druid 监控功能的—— StatViewServlet 的 Servlet 。
  6. Druid 监控功能的 —— Web 关联监控,是 WebStatFilter
  7. Druid 监控的功能—— SQL 监控是,WebStatFilter
  8. 在 Druid 监控功能当中,Session监控是默认开启的。但是 Druid 只会监控,本项目(localhost)的Session 的内容,其它的项目的Session 是不会被监控的。
  9. 对应Druid Spring Boot Starter 的配置,我们只需要在 类路径(resources)下创建application.yaml 配置文件,同时在其中配置好,对应的 Druid 监控功能。
    1. 注意:因为我们的Spring Boot 是默认就会读取 resources 类路径下的 application.yaml 文件当中的信息的,从而配置到对应的类属性值上,所以,我们不需要,额外的配置,让Spring Boot读取到 application.yaml的配置,Spring Boot 默认就会自行去读取里面文件当中的内容

6. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/428607.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(蓝桥杯)STM32G431RBT6(TIM4-PWM)

一、基础配置 这个auto-reload preload是自动重装载值&#xff0c;因为我们想让他每改变一个占空比&#xff0c;至少出现一次周期 Counter Period(Autoreload Regisiter)这个设值为10000&#xff0c;那么就相当于它的周期是10000 脉冲宽度可以设置为占周期的一半&#xff0c;那…

Python酷库之旅-第三方库Pandas(123)

目录 一、用法精讲 546、pandas.DataFrame.ffill方法 546-1、语法 546-2、参数 546-3、功能 546-4、返回值 546-5、说明 546-6、用法 546-6-1、数据准备 546-6-2、代码示例 546-6-3、结果输出 547、pandas.DataFrame.fillna方法 547-1、语法 547-2、参数 547-3、…

opencv图像透视处理

引言 在图像处理与计算机视觉领域&#xff0c;透视变换&#xff08;Perspective Transformation&#xff09;是一种重要的图像校正技术&#xff0c;它允许我们根据图像中已知的四个点&#xff08;通常是矩形的四个角&#xff09;和目标位置的四个点&#xff0c;将图像从一个视…

Ubuntu 与Uboot网络共享资源

1、NFS 1.1 Ubuntu 下 NFS 服务开启 sudo apt-get install nfs-kernel-server rpcbind 等待安装完成&#xff0c;安装完成以后在用户根目录下创建一个名为“Linux”的文件夹&#xff0c;以后所有 的东西都放到这个“Linux”文件夹里面&#xff0c;在“Linux”文件夹里面新建…

[Simpfun游戏云1]搭建MC Java+基岩互通生存游戏服务器

众所周知&#xff0c;MC有多个客户端&#xff0c;像常见的比如Java Edition和基岩等&#xff0c;这就导致&#xff0c;比如我知道一个超级好玩的JE服务器&#xff0c;但我又想使用基岩版来玩&#xff0c;肯定是不行的&#xff0c;因为通讯协议不一样。 这就有一些人才发明了多…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(四)-搜索

搜索 搜索内容比较多&#xff0c;onesearch分成两部分&#xff0c;第一部分&#xff0c;Query构建&#xff0c;其中包括搜索词设置&#xff0c;设置返回字段&#xff0c;filter&#xff0c;高亮&#xff1b;第二部分分页和排序。第一部分是映射引擎负责&#xff0c;映射通用表…

常见中间件漏洞靶场(tomcat)

1.CVE-2017-12615 开启环境 查看端口 查看IP 在哥斯拉里生成一个木马 访问页面修改文件后缀和文件内容 放包拿去连接 2.后台弱⼝令部署war包 打开环境 将前边的1.jsp压缩成1.zip然后改名为1.war 访问页面进行上传 在拿去连接 3.CVE-2020-1938 打开环境 访问一下 来到kali …

错题集锦之C语言

直接寻址和立即寻址 算法的又穷性是指算法程序的运行时间是有限的 未经赋值的全局变量值不确定 集成测试是为了发现概要设计的错误 自然连接要求两个关系中进行比较的是相同的属性&#xff0c;并且进行等值连接&#xff0c;在结果中还要把重复的属性列去掉 赋值运算符 赋值…

【计算机网络篇】电路交换,报文交换,分组交换

本文主要介绍计算机网络中的电路交换&#xff0c;报文交换&#xff0c;分组交换&#xff0c;文中的内容是我认为的重点内容&#xff0c;并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 目录 &#x1f3af;一.划分…

无线安全(WiFi)

免责声明:本文仅做分享!!! 目录 WEP简介 WPA简介 安全类型 密钥交换 PMK PTK 4次握手 WPA攻击原理 网卡选购 攻击姿态 1-暴力破解 脚本工具 字典 2-Airgeddon 破解 3-KRACK漏洞 4-Rough AP 攻击 5-wifi钓鱼 6-wifite 其他 WEP简介 WEP是WiredEquivalentPri…

浅谈vue2.0与vue3.0的区别(整理十六点)

目录 1. 实现数据响应式的原理不同 2. 生命周期不同 3. vue 2.0 采用了 option 选项式 API&#xff0c;vue 3.0 采用了 composition 组合式 API 4. 新特性编译宏 5. 父子组件间双向数据绑定 v-model 不同 6. v-for 和 v-if 优先级不同 7. 使用的 diff 算法不同 8. 兄弟组…

2024年及未来:构筑防御通胀的堡垒,保护您的投资

随着全球经济的波动和不确定性&#xff0c;通货膨胀已成为投资者不得不面对的现实问题。通胀会侵蚀货币的购买力&#xff0c;从而影响投资的实际回报。因此&#xff0c;制定有效的策略来保护投资免受通胀影响&#xff0c;对于确保资产的长期增值至关重要。在2024年及未来&#…

nginx架构篇(三)

文章目录 一、Nginx实现服务器端集群搭建1.1 Nginx与Tomcat部署1. 环境准备(Tomcat)2. 环境准备(Nginx) 1.2. Nginx实现动静分离1.2.1. 需求分析1.2.2. 动静实现步骤 1.3. Nginx实现Tomcat集群搭建1.4. Nginx高可用解决方案1.4.1. Keepalived1.4.2. VRRP介绍1.4.3. 环境搭建环境…

口碑最好的头戴式耳机是哪些?高品质头戴式耳机对比测评揭晓

头戴式耳机以其出色的音质表现和舒适的佩戴体验&#xff0c;成为了音乐爱好者和日常通勤用户的热门选择。而在众多品牌和型号中&#xff0c;口碑最好的头戴式耳机是哪些&#xff1f;面对市场上丰富的选择&#xff0c;找到一款音质优良、佩戴舒适且性价比高的耳机并不容易。今天…

美畅物联丨技术前沿探索:H.265编码与畅联云平台JS播放器的融合应用

一、H.265 编码&#xff1a;视频压缩技术的重大变革 H.265&#xff0c;即被熟知为高效视频编码&#xff08;HEVC&#xff0c;High Efficiency Video Coding&#xff09;&#xff0c;由国际电信联盟电信标准化部门视频编码专家组&#xff08;ITU-T VCEG&#xff09;与国际标准化…

俄罗斯OZON新生儿产品好不好卖,OZON新生儿产品

Top1 遥控水球坦克 Танк на радиоуправлении стреляющий орбизами PANAWEALTH 商品id&#xff1a;1384249985 月销量&#xff1a;692 欢迎各位OZON卖家朋友点击这里选品&#xff1a; &#x1f449; D。DDqbt。COm/74rD 遥控射击水…

Java中Set的巧妙用法---查找重复元素/去重/排序

目录 1. Set特性&#xff1a; 3. TreeSet 3.1定制排序&#xff08;比较器排序&#xff09; 3.2自然排序&#xff1a; 4. LinkedHashSet 在日常开发中不可避免会遇到需要去重&#xff0c;或者查找重复元素&#xff0c;下面给介绍一种效率比较高的方法&#xff0c;时间复杂度…

Git使用教程-将idea本地文件配置到gitte上的保姆级别教程

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

weblogic CVE-2018-2894 靶场攻略

漏洞描述 Weblogic Web Service Test Page中⼀处任意⽂件上传漏洞&#xff0c;Web Service Test Page 在 "⽣产模式"下默认不开启&#xff0c;所以该漏洞有⼀定限制。 漏洞版本 weblogic 10.3.6.0 weblogic 12.1.3.0 weblogic 12.2.1.2 28 weblogic 12.2.1.3 …

传统美业通过小魔推短视频矩阵系统,实现逆势增长?

许多美甲店在经营过程中常常陷入一个误区&#xff1a;他们认为自己缺少的是客户&#xff0c;但实际上&#xff0c;他们真正缺少的是有效的营销策略&#xff0c;美甲店经营者普遍面临的两大难题包括&#xff1a; 1. 高客户流失率&#xff1a; 据研究显示&#xff0c;约70%的顾…