0


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

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

文章目录


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_ssmDROPDATABASEifEXISTS spring_boot
CREATEDATABASE spring_boot

USE spring_boot 

# 创建家居表 数据表CREATETABLE furn (
id INT(11)PRIMARYKEYauto_increment,-- id
name VARCHAR(64)notNULL,-- 家具名
maker VARCHAR(64)notnull,-- 厂商`price`DECIMAL(11,2)notnull,-- 价格`sales`INT(11)notnull,-- 销量`stock`INT(11)notnull,-- 库存`img_path`VARCHAR(256)notnull-- 照片路径-- 注意:不是单引号);SELECT*from  furn;INSERTinto furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)VALUES(null,'北欧风格小桌子','熊猫家居',100,666,7,'assets/images/producth')INSERTinto furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)VALUES(null,'简约风格小椅子','熊猫家居',200,666,7,'assets/images/producth')INSERTinto furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)VALUES(null,'典雅风格小桌子','蚂蚁家居',100,666,7,'assets/images/producth')INSERTinto 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"?><projectxmlns="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.26
                2. 这个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 插件进行。

在这里插入图片描述

packagecom.rainbowsea.springboot.bean;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importjava.math.BigDecimal;@Data@AllArgsConstructor@NoArgsConstructor// 使用 lombok 插件进行自动配置publicclassFurn{privateInteger id;privateString name;privateString maker;privateBigDecimal price;privateInteger sales;privateInteger stock;privateString imgPath ="assets/images/product-image/1.jpg";}

编写启动程序:

在这里插入图片描述

packagecom.rainbowsea.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;@SpringBootApplicationpublicclassApplication{publicstaticvoidmain(String[] args){ConfigurableApplicationContext ioc =SpringApplication.run(Application.class, args);}}

我们需要在类路径下

resources

创建一个名为

application.yaml

文件,编写连接的数据库信息。

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

packagecom.rainbowsea.springboot.config;importcom.alibaba.druid.pool.DruidDataSource;importcom.alibaba.druid.support.http.StatViewServlet;importcom.alibaba.druid.support.http.WebStatFilter;importorg.springframework.boot.SpringBootConfiguration;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.boot.web.servlet.FilterRegistrationBean;importorg.springframework.boot.web.servlet.ServletRegistrationBean;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.sql.DataSource;importjava.sql.SQLException;importjava.util.Arrays;@Configuration// 标注配置类publicclassDruidDataSourceConfig{// 编写方法,注入 DruidDataSource@Bean// 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称// 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的@ConfigurationProperties(value ="spring.datasource")// 该注解,让 application.yaml// 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。// 注入到 ioc 容器当中。publicDataSourcedataSource()throwsSQLException{// 1.配置了 @ConfigurationProperties("spring.datasource")// 就可以读取到application.yaml的配置// 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联DruidDataSource druidDataSource =newDruidDataSource();//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})protectedstaticclassPooledDataSourceConfiguration{protectedPooledDataSourceConfiguration(){}}

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

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

在这里插入图片描述

packagecom.rainbowsea.springboot.controller;importcom.rainbowsea.springboot.bean.Furn;importorg.springframework.jdbc.core.BeanPropertyRowMapper;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.ResponseBody;importjavax.annotation.Resource;importjava.util.List;@ControllerpublicclassDruidSqlController{@ResourceprivateJdbcTemplate jdbcTemplate;@ResponseBody@GetMapping("/sql")publicList<Furn>crudDB(){BeanPropertyRowMapper<Furn> rowMapper =newBeanPropertyRowMapper<>(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// 标注配置类publicclassDruidDataSourceConfig{// 编写方法,注入 DruidDataSource@Bean// 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称// 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的@ConfigurationProperties(value ="spring.datasource")// 该注解,让 application.yaml// 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。// 注入到 ioc 容器当中。publicDataSourcedataSource()throwsSQLException{// 1.配置了 @ConfigurationProperties("spring.datasource")// 就可以读取到application.yaml的配置// 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联DruidDataSource druidDataSource =newDruidDataSource();// 将数据库连接池加入到 druid监视当中// wall ,将数据库连接池加入sql防火墙
        druidDataSource.setFilters("stat,wall");return druidDataSource;}}
packagecom.rainbowsea.springboot.config;importcom.alibaba.druid.pool.DruidDataSource;importcom.alibaba.druid.support.http.StatViewServlet;importcom.alibaba.druid.support.http.WebStatFilter;importorg.springframework.boot.SpringBootConfiguration;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.boot.web.servlet.FilterRegistrationBean;importorg.springframework.boot.web.servlet.ServletRegistrationBean;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.sql.DataSource;importjava.sql.SQLException;importjava.util.Arrays;@Configuration// 标注配置类publicclassDruidDataSourceConfig{// 编写方法,注入 DruidDataSource@Bean// 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称// 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的@ConfigurationProperties(value ="spring.datasource")// 该注解,让 application.yaml// 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。// 注入到 ioc 容器当中。publicDataSourcedataSource()throwsSQLException{// 1.配置了 @ConfigurationProperties("spring.datasource")// 就可以读取到application.yaml的配置// 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联DruidDataSource druidDataSource =newDruidDataSource();// 将数据库连接池加入到 druid监视当中// wall ,将数据库连接池加入sql防火墙
        druidDataSource.setFilters("stat,wall");return druidDataSource;}// 配置 WebStatFilter,用于采集 web-jdbc 关联的监控数据// 注意用的是 Filter 过滤器@BeanpublicFilterRegistrationBeanwebStatFilter(){// 创建 WebStatFilter ,WebStatFilter webStatFilter =newWebStatFilter();FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean =newFilterRegistrationBean<>(webStatFilter);// 默认对所有的url请求进行监控,// 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合
        webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));// 排除指定的url
        webStatFilterFilterRegistrationBean.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 容器当中publicServletRegistrationBeanstaatViewServlet(){// 创建 StatViewServletStatViewServlet statViewServlet =newStatViewServlet();ServletRegistrationBean<StatViewServlet>
                statViewServletServletRegistrationBean =newServletRegistrationBean<>(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 数据表,进行测试演示。

在这里插入图片描述

packagecom.rainbowsea.springboot.bean;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importjava.math.BigDecimal;@Data@NoArgsConstructor// 空构造器@AllArgsConstructor// 全参数构造器  lombokpublicclassFurn{privateInteger id;privateString name;privateString maker;privateBigDecimal price;privateInteger sales;privateInteger stock;privateString imgPath ="assets/images/product-image/1.jpg";}

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

在这里插入图片描述

packagecom.rainbowsea.springboot.controller;importcom.rainbowsea.springboot.bean.Furn;importorg.springframework.jdbc.core.BeanPropertyRowMapper;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.ResponseBody;importjavax.annotation.Resource;importjava.util.List;@ControllerpublicclassDruidSqlController{@ResourceprivateJdbcTemplate jdbcTemplate;@ResponseBody@GetMapping(value ="/sql")publicList<Furn>crudDB(){BeanPropertyRowMapper<Furn> rowMapper =newBeanPropertyRowMapper<>(Furn.class);List<Furn> furns = jdbcTemplate.query("select * from furn", rowMapper);for(Furn furn : furns){System.out.println(furn);}return furns;}}

编写场景启动器:

在这里插入图片描述

packagecom.rainbowsea.springboot;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;@SpringBootApplicationpublicclassApplication{publicstaticvoidmain(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: MySQL123
    username: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: 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. 最后:

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

在这里插入图片描述

标签: spring boot 后端 java

本文转载自: https://blog.csdn.net/weixin_61635597/article/details/142312640
版权归原作者 ChinaRainbowSea 所有, 如有侵权,请联系我们删除。

“十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能”的评论:

还没有评论