Spring Boot整合Druid:轻松实现SQL监控和数据库密码加密

打印 上一主题 下一主题

主题 828|帖子 828|积分 2484

1 引言

1.1 简介

Druid毗连池是阿里巴巴开源的数据库毗连池项目。Druid毗连池为监控而生,内置强盛的监控功能,监控特性不影响性能。功能强盛,能防SQL注入,内置Loging能诊断Hack应用举动。除了提供基本的数据源功能外,还具备以下上风:


  • 性能优越:Druid毗连池的性能表现优于其他常见毗连池,如C3P0和DBCP。
  • 监控功能强盛:Druid内置了丰富的监控功能,可以及时检察SQL实验情况、毗连池状态等。
  • 稳固性高:Druid在高并发环境下表现稳固,能够有效制止毗连走漏等问题。
  • 扩展性好:Druid支持多种数据库,且配置机动,易于集成和扩展。
1.2 Druid的功能


  • 高效的数据库毗连池管理

    • 高性能:在并发环境下表现优越,处理大量数据库毗连请求。
    • 稳固性:在高并发和高负载情况下保持稳固,制止毗连走漏。
    • 易用性:配置简朴,快速集成到Java应用中。

  • 丰富的监控功能

    • 毗连池监控:及时监控毗连池状态,如毗连数、空闲毗连数等。
    • SQL监控:记录SQL实验情况,统计实验时间、次数等。
    • URI监控:监控各URI的访问情况,统计请求次数和响应时间。
    • 防火墙功能:防止SQL注入攻击,提拔系统安全性。

  • 便捷的配置和扩展

    • 多数据库支持:支持MySQL、Oracle、PostgreSQL等多种数据库。
    • 机动配置:提供丰富的配置选项,机动调解。
    • 插件机制:支持插件扩展功能,如stat、wall、log4j等。

  • SQL实验日志和统计分析

    • SQL实验日志:记录SQL实验时间、次数、影响行数等。
    • 统计分析:提供SQL实验统计分析,资助优化SQL性能。
    • 慢SQL检测:自动检测慢SQL,提供详细实验信息,便于调优。

  • 进步系统安全性

    • SQL防火墙:配置防火墙规则,拦截非法SQL请求,防止SQL注入。
    • 好坏名单机制:配置IP好坏名单,限制特定IP访问权限。

1.3 竞品对比

功能类别功能DruidHikariCPDBCPTomcat-jdbcC3P0性能PSCache是否是是是LRU是否是是是SLB负载平衡支持是否否否否稳固性ExceptionSorter是否否否否扩展扩展FilterJdbcIntercepter监控监控方式jmx/log/httpjmx/metricsjmxjmxjmx支持SQL级监控是否否否否Spring/Web关联监控是否否否否诊断支持LogFilter否否否否毗连泄露诊断logAbandoned否否否否安全SQL防注入是无无无无支持配置加密是否否否否 2 预备工作

2.1 项目环境



  • JDK版本:JDK 17
  • Spring Boot版本:Spring Boot 3.2.2
  • MySQL版本:8.0.37
  • 构建工具:Maven
3 集成Druid

3.1 添加依赖

   这里的Druid版本必须要选择1.2.20及以上版本,否则无法运行。
  另有一点,Druid的版本要与mysql-connector-java的版本相匹配,可以去下面的网站看:
  Maven Repository: com.alibaba » druid » 1.2.20 (mvnrepository.com)
  1.         <dependency>
  2.             <groupId>com.alibaba</groupId>
  3.             <artifactId>druid-spring-boot-3-starter</artifactId>
  4.             <version>1.2.20</version>
  5.         </dependency>
  6.         <dependency>
  7.             <groupId>mysql</groupId>
  8.             <artifactId>mysql-connector-java</artifactId>
  9.             <version>8.0.32</version>
  10.         </dependency>
复制代码
3.2 配置Druid

   相干配置的详细信息可见:DruidDataSource配置属性列表 · alibaba/druid Wiki (github.com)
  1. spring:
  2.   application:
  3.     name: server
  4.   profiles:
  5.     active: dev # 激活dev配置文件
  6.   datasource:
  7.     url: jdbc:mysql://${voyager.db.host}:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
  8.     driver-class-name: com.mysql.cj.jdbc.Driver
  9.     username: root
  10.     password: ${voyager.db.pw}
  11.     # druid 相关参数配置
  12.     druid:
  13.       # 初始化连接大小
  14.       initial-size: 5
  15.       # 最小连接池数量
  16.       min-idle: 5
  17.       # 最大连接池数量
  18.       max-active: 20
  19.       # 获取连接时最大等待时间,单位毫秒
  20.       max-wait: 60000
  21.       # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  22.       time-between-eviction-runs-millis: 60000
  23.       # 配置一个连接在池中最小生存的时间,单位是毫秒
  24.       min-evictable-idle-time-millis: 300000
  25.       # 测试连接
  26.       validation-query: SELECT 1 FROM DUAL
  27.       # 配置监控统计用的filters,过滤掉静态文件
  28.       web-stat-filter:
  29.         # 启用Web统计过滤器
  30.         enabled: true
  31.         # 过滤匹配规则
  32.         url-pattern: /*
  33.         # 过滤忽略的格式
  34.         exclusions: /druid/*,*.js,*.css,*.gif,*.jpg,*.bmp,*.png,*.ico
  35.       # 配置可视化控制台页面
  36.       stat-view-servlet:
  37.         enabled: true
  38.         # 访问Druid监控页面的地址,首页默认是 /druid/index.html
  39.         url-pattern: /druid/*
  40.         # 禁用重置按钮
  41.         reset-enable: true
  42.         # 登录用户名
  43.         login-username: root
  44.         # 登录密码
  45.         login-password: 123456
  46.       # 通过别名的方式配置扩展插件  常用的插件有:监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall 防御sql注入的filter:wall
  47.       filter:
  48.         stat:
  49.           enabled: true
  50.           # 是否开启慢sql
  51.           log-slow-sql: true
  52.           # 是否开启SQL合并
  53.           merge-sql: true
  54.           # 慢sql的时间标准 单位:毫秒
  55.           slow-sql-millis: 1000
复制代码
3.3 编写测试类测试

   留意:不要使用lombok的@RequiredArgsConstructor注解,JUnit5好像无法自动装配,详情来自:
  https://stackoverflow.com/questions/51867650/junit-5-no-parameterresolver-registered-for-parameter
  1. @SpringBootTest
  2. class SmartApplicationTest {
  3.    
  4.     @Autowired
  5.     private DataSource dataSource ;
  6.     @Test
  7.     void contextLoads() {
  8.         System.out.println(dataSource.getClass());
  9.         DruidDataSource druidDataSource = (DruidDataSource) dataSource;
  10.         System.out.println("druidDataSource.getUrl() = " + druidDataSource.getUrl());
  11.         System.out.println("druidDataSource.getUsername() = " + druidDataSource.getUsername());
  12.         System.out.println("druidDataSource.getInitialSize() = " + druidDataSource.getInitialSize());
  13.         System.out.println("druidDataSource.getMaxActive() = " + druidDataSource.getMaxActive());
  14.     }
  15.   
  16. }
复制代码
运行测试:

可以看到配置类的相干配置已经生效。
3.4 访问控制台

启动自己项目中的SpringBootApplication类后访问http://localhost:8084/druid/login.html(改为自己服务的端口),输入账号密码后即可进入:

3.5 测试SQL监控


  • 测试接口
    1. @RequestMapping("/user")
    2. @RestController
    3. @RequiredArgsConstructor
    4. public class UserInfoController {
    5.     private final UserInfoService userInfoService;
    6.     @GetMapping("/test")
    7.     public Result<UserInfo> login() {
    8.         return Result.success(userInfoService.getById(1));
    9.     }
    10.    
    11. }
    复制代码
  • 进行测试

3.6 数据库密码加密

3.6.1 实验命令加密数据库密码

   官方教程Wiki文档:使用ConfigFilter · alibaba/druid Wiki (github.com)
  在命令行中实验如下命令:
  1. java -cp D:\Develop\Maven\mvnRespo\com\alibaba\druid\1.2.20\druid-1.2.20.jar com.alibaba.druid.filter.config.ConfigTools your_password
复制代码
输出
  1. privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg==
  2. publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ==
  3. password:PNak4Yui0+2Ft6JSoKBsgNPl+A033rdLhFw+L0np1o+HDRrCo9VkCuiiXviEMYwUgpHZUFxb2FpE0YmSguuRww==
复制代码
3.6.2 配置参数

  1. spring:
  2.   datasource:
  3.     url: jdbc:mysql://${voyager.db.host}:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
  4.     driver-class-name: com.mysql.cj.jdbc.Driver
  5.     username: root
  6.     password: password  # 修改为控制台输出的password
  7.     #druid数据源配置
  8.     druid:
  9.       # Druid数据源的公钥
  10.       public-key: publicKey # 修改为控制台输出的publicKey
  11.       filter:
  12.         # 启用Druid的过滤器配置
  13.         config:
  14.           enabled: true
  15.       connect-properties:
  16.         # 启用Druid的连接属性解密功能
  17.         config.decrypt: true
  18.         config.decrypt.key: publicKey # 控制台输出的publicKey
复制代码
3.6.3 测试

启动启动类,请求测试接口:

4 总结

在这篇文章中,我们详细介绍了如何在Spring Boot项目中集成Druid数据源,并实现SQL监控和数据库密码加密等功能,Druid另有许多有用的功能,这里就不过多展示了,希望本文对各人有所资助

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表