springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。

druid数据源

Druid 是一个分布式的、支持实时多维 OLAP 分析的数据处理系统。它既支持高速的数据实时摄入处理,也支持实时且灵活的多维数据分析查询。因此 Druid 最常用的场景就是大数据背景下、灵活快速的多维 OLAP 分析。 另外,Druid 还有一个关键的特点:它支持根据时间戳对数据进行预聚合摄入和聚合分析,因此也有用户经常在有时序数据处理分析的场景中用到它。

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能

自定义配置druid数据源

1.引入依赖

首先,在pom.xml中,添加druid的依赖,jdbc的stater,以及mysql驱动:

        <!--  jdbc stater      -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--   mysql驱动     -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <!--   druid数据源     -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.17</version>
        </dependency>

2.配置自定义dataSoruce的Bean组件

默认情况下,springboot会使用Hikari数据源,默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)。

使用@Configuration标识这个类是一个配置类

package com.robin.boot.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


import javax.sql.DataSource;

@Configuration
public class MyDataSourceConfig {
   


    // 默认情况下,springboot会使用Hikari数据源
    // 默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)
    @Bean
    public DataSource dataSource(){
   
        DruidDataSource druidDataSource = new DruidDataSource();
        // 设定数据源的初始配置,数据库的账户密码,url,以及jdbc驱动
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/phpdemo?characterEncoding=" +
                "utf8&serverTimezone=Asia/Shanghai&useSSL=false");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
        druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        return druidDataSource;
    }
}

3.测试sql,验证数据源是否配置成功

在当前springboot项目中的测试类中,进行测试,使用原生的jdbcTemplate去测试,并且使用slf4j日志来查看输出信息。

package com.robin.boot;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Slf4j
@SpringBootTest
class DemoReSqlApplicationTests {
   

    @Autowired 
    JdbcTemplate jdbcTemplate;

    @Autowired
    DataSource dataSource;

    @Test
    void contextLoads() {
   
        Long aLong = jdbcTemplate.queryForObject("select count(*) from phpdemo.book", Long.class);
        log.info("记录数为{}",aLong);
        log.info("数据源{}",dataSource.getClass());
    }

}

ok,数据源配置成功…
在这里插入图片描述

4.开启 StatFilter,wallFilter,lg4j以及内置监控信息页面

Druid内置提供一个StatFilter,wallfilter,用于统计监控信息及sql防火墙。也可以使用日志记录信息log4j。

查看druid官方文档,其提供的xml配置如下:

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
      ... ...
      <property name="filters" value="stat,wall,log4j" />
  </bean>

dataSource对应的bean组件,我们已经在上面创建过了,所以开启统计信息只需要在bean组件中,添加属性即可
// 开启stat sql监控信息 druidDataSource.setFilters("stat,wall,log4j");

开启druid内置监控页面,Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。
其官网提供的xml配置如下:

<!-- 配置 Druid 监控信息显示页面 -->  
<servlet>  
    <servlet-name>DruidStatView</servlet-name>  
    <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
    <init-param>  
    <!-- 允许清空统计数据 -->  
    <param-name>resetEnable</param-name>  
    <param-value>true</param-value>  
    </init-param>  
    <init-param>  
    <!-- 用户名 -->  
    <param-name>loginUsername</param-name>  
    <param-value>druid</param-value>  
    </init-param>  
    <init-param>  
    <!-- 密码 -->  
    <param-name>loginPassword</param-name>  
    <param-value>druid</param-value>  
    </init-param>  
</servlet>  
<servlet-mapping>  
    <servlet-name>DruidStatView</servlet-name>  
    <url-pattern>/druid/*</url-pattern>  
</servlet-mapping>

自定义Servlet来使用druid的内置监控页面:

使用 ServletRegistrationBean 类来创建一个自定义的servlet,且其名字为statViewServlet

     @Bean
    public ServletRegistrationBean statViewServlet(){
   
        StatViewServlet statViewServlet = new StatViewServlet();
        // 配置自定义的servlet,以及要处理的请求响应
        ServletRegistrationBean<StatViewServlet> registrationBean =
                new ServletRegistrationBean<>(statViewServlet,"/druid/*");
        // 设定druid内置监控页面的登录账号密码信息
        registrationBean.addInitParameter("loginUsername","admin");
        registrationBean.addInitParameter("loginPassword","robin");
        // 设置禁止清空内置监控页面数据信息
        registrationBean.addInitParameter("resetEnable","false");
        return registrationBean;
    }

运行访问localhost:8080/druid,自动跳转到druid监控页面的登录页,输入刚刚自定义的账号密码,登入查看:

在这里插入图片描述
在这里插入图片描述

此时我们的druid内置监控页面已经开启啦~~

5.开启Web关联监控配置

其官网提供的xml配置如下:

  <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>

就是一个名为DruidWebStatFilter的拦截器,类型为com.alibaba.druid.support.http.WebStatFilter。

使用 FilterRegistrationBean 创建一个自定义的filter,且其名为webStatFilter。

    @Bean
    public FilterRegistrationBean webStatFilter(){
   
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> registrationBean =
                new FilterRegistrationBean<WebStatFilter>(webStatFilter);
        // 设置拦截路径
        registrationBean.setUrlPatterns(Arrays.asList("/*"));
        // 设置放行路径
        registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return registrationBean;
    }

6.开启Spring关联监控配置

Druid提供了Spring和Jdbc的关联监控。有两种方式,按类型拦截配置和方法名正则匹配拦截配置。

     <!-- 1.按类型拦截配置-->
   <bean id="druid-stat-interceptor"
      class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>

  <bean id="druid-type-proxyCreator" class="com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator">
      <!-- 所有ABCInterface的派生类被拦截监控  -->
      <property name="targetBeanType" value="xxxx.ABCInterface" />
      <property name="interceptorNames">
          <list>
              <value>druid-stat-interceptor</value>
          </list>
      </property>
  </bean>
    <bean id="druid-stat-interceptor"
      class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>

<!--2.方法名正则匹配拦截配置 -->
  <bean id="druid-stat-interceptor"
      class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>

<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
    scope="prototype">
    <property name="patterns">
        <list>
            <value>com.mycompany.service.*</value>
            <value>com.mycompany.dao.*</value>
        </list>
    </property>
</bean>

<aop:config>
    <aop:advisor advice-ref="druid-stat-interceptor"
        pointcut-ref="druid-stat-pointcut" />
</aop:config>

7.编写controller,测试sql是否会被监控页面看到

使用原生的jdbctemplate,将sql进行查询,然后通过@GetMapping(“/sql”),映射请求。

package com.robin.boot.controller;

import org.springframework.beans.factory.annotation.Autowired;
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;

@Controller
public class SqlTestController {
   

    @Autowired
    JdbcTemplate jdbcTemplate;

    @ResponseBody
    @GetMapping("/sql")
    public String querySql(){
   
        Long aLong = jdbcTemplate.queryForObject("select count(*) from phpdemo.book", Long.class);
        return aLong.toString();
    }

}

8.统一测试,查看监控页面

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

除了spring监控(没有配置),其余都正确监控了

9.完整的自定义配置druid数据源,和项目结构

完整的自定义配置druid数据源:

package com.robin.boot.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.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 MyDataSourceConfig {
   


    // 默认情况下,springboot会使用Hikari数据源
    // 默认的自动配置时判断容器中没有才会去配置 @ConditionalOnMissingBean(DataSource.class)
    @Bean
    public DataSource dataSource() throws SQLException {
   
        DruidDataSource druidDataSource = new DruidDataSource();
        // 设定数据源的初始配置,
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/phpdemo?characterEncoding=" +
                "utf8&serverTimezone=Asia/Shanghai&useSSL=false");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
        druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        // 开启stat sql监控信息
        druidDataSource.setFilters("stat,wall");
        return druidDataSource;
    }


    // 配置druid的监控页
    @Bean
    public ServletRegistrationBean statViewServlet(){
   

        StatViewServlet statViewServlet = new StatViewServlet();
        // 配置自定义的servlet,以及要处理的请求响应
        ServletRegistrationBean<StatViewServlet> registrationBean =
                new ServletRegistrationBean<>(statViewServlet,"/druid/*");
        // 设定druid内置监控页面的登录账号密码信息
        registrationBean.addInitParameter("loginUsername","admin");
        registrationBean.addInitParameter("loginPassword","robin");
        // 设置禁止清空内置监控页面数据信息
        registrationBean.addInitParameter("resetEnable","false");
        return registrationBean;
    }


    // 配置WebStatFilter
    @Bean
    public FilterRegistrationBean webStatFilter(){
   
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> registrationBean =
                new FilterRegistrationBean<WebStatFilter>(webStatFilter);
        // 设置拦截路径
        registrationBean.setUrlPatterns(Arrays.asList("/*"));
        // 设置放行路径
        registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return registrationBean;
    }
}

项目结构:
在这里插入图片描述


导入stater配置druid数据源(推荐-简单方便使用)

使用第三方提供的stater配置数据源,相比自定义配置使用很简单

1.引入依赖

        <!-- jdbc stater-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--   mysql驱动     -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <!-- druid stater-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

2.编写application.yaml

首先将上面自定义的注释掉,使用stater的方式配置druid数据源,只需要引入依赖,然后修改application.yaml的配置信息即可,很方便。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/phpdemo?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    druid:
      aop-patterns: com.robin.boot # 监控SpringBean
      filters: stat,wall # 开启sql监控和防火墙功能

      stat-view-servlet: #配置监控页功能
        enabled: true
        login-username: admin
        login-password: robin
        reset-enable: false # 禁用刷新重置按钮

      web-stat-filter: # 监控web
        enabled: true
        url-pattern: /*
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'

启动服务,用上面的controller进行测试,可以正确访问。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
588 1
|
1月前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
61 0
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
60 4
|
2月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
49 0
|
3天前
|
Java Maven Spring
SpringBoot配置跨模块扫描问题解决方案
在分布式项目中,使用Maven进行多模块开发时,某些模块(如xxx-common)没有启动类。如何将这些模块中的类注册为Spring管理的Bean对象?本文通过案例分析,介绍了两种解决方案:常规方案是通过`@SpringBootApplication(scanBasePackages)`指定扫描路径;推荐方案是保持各模块包结构一致(如com.xxx),利用SpringBoot默认扫描规则自动识别其他模块中的组件,简化配置。
SpringBoot配置跨模块扫描问题解决方案
|
10天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
55 14
|
1月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
50 1
SpringBoot入门(7)- 配置热部署devtools工具
|
1月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
48 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
26天前
|
Prometheus 监控 Java
如何全面监控所有的 Spring Boot 微服务
如何全面监控所有的 Spring Boot 微服务
47 3
|
1月前
|
存储 前端开发 JavaScript
springboot中路径默认配置与重定向/转发所存在的域对象
Spring Boot 提供了简便的路径默认配置和强大的重定向/转发机制,通过合理使用这些功能,可以实现灵活的请求处理和数据传递。理解并掌握不同域对象的生命周期和使用场景,是构建高效、健壮 Web 应用的关键。通过上述详细介绍和示例,相信读者能够更好地应用这些知识,优化自己的 Spring Boot 应用。
36 3