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

06-29 1609阅读

文章目录

  • 1 引言
    • 1.1 简介
    • 1.2 Druid的功能
    • 1.3 竞品对比
    • 2 准备工作
      • 2.1 项目环境
      • 3 集成Druid
        • 3.1 添加依赖
        • 3.2 配置Druid
        • 3.3 编写测试类测试
        • 3.4 访问控制台
        • 3.5 测试SQL监控
        • 3.6 数据库密码加密
          • 3.6.1 执行命令加密数据库密码
          • 3.6.2 配置参数
          • 3.6.3 测试
          • 4 总结

            1 引言

            1.1 简介

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

            • 性能优越:Druid连接池的性能表现优于其他常见连接池,如C3P0和DBCP。
            • 监控功能强大:Druid内置了丰富的监控功能,可以实时查看SQL执行情况、连接池状态等。
            • 稳定性高:Druid在高并发环境下表现稳定,能够有效避免连接泄漏等问题。
            • 扩展性好:Druid支持多种数据库,且配置灵活,易于集成和扩展。

              1.2 Druid的功能

              1. 高效的数据库连接池管理

                • 高性能:在并发环境下表现优越,处理大量数据库连接请求。

                • 稳定性:在高并发和高负载情况下保持稳定,避免连接泄漏。

                • 易用性:配置简单,快速集成到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)

                        
                            com.alibaba
                            druid-spring-boot-3-starter
                            1.2.20
                        
                        
                            mysql
                            mysql-connector-java
                            8.0.32
                        
                

                3.2 配置Druid

                相关配置的详细信息可见:DruidDataSource配置属性列表 · alibaba/druid Wiki (github.com)

                spring:
                  application:
                    name: server
                  profiles:
                    active: dev # 激活dev配置文件
                  datasource:
                    url: jdbc:mysql://${voyager.db.host}:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
                    driver-class-name: com.mysql.cj.jdbc.Driver
                    username: root
                    password: ${voyager.db.pw}
                    # druid 相关参数配置
                    druid:
                      # 初始化连接大小
                      initial-size: 5
                      # 最小连接池数量
                      min-idle: 5
                      # 最大连接池数量
                      max-active: 20
                      # 获取连接时最大等待时间,单位毫秒
                      max-wait: 60000
                      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
                      time-between-eviction-runs-millis: 60000
                      # 配置一个连接在池中最小生存的时间,单位是毫秒
                      min-evictable-idle-time-millis: 300000
                      # 测试连接
                      validation-query: SELECT 1 FROM DUAL
                      # 配置监控统计用的filters,过滤掉静态文件
                      web-stat-filter:
                        # 启用Web统计过滤器
                        enabled: true
                        # 过滤匹配规则
                        url-pattern: /*
                        # 过滤忽略的格式
                        exclusions: /druid/*,*.js,*.css,*.gif,*.jpg,*.bmp,*.png,*.ico
                      # 配置可视化控制台页面
                      stat-view-servlet:
                        enabled: true
                        # 访问Druid监控页面的地址,首页默认是 /druid/index.html
                        url-pattern: /druid/*
                        # 禁用重置按钮
                        reset-enable: true
                        # 登录用户名
                        login-username: root
                        # 登录密码
                        login-password: 123456
                      # 通过别名的方式配置扩展插件  常用的插件有:监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall 防御sql注入的filter:wall
                      filter:
                        stat:
                          enabled: true
                          # 是否开启慢sql
                          log-slow-sql: true
                          # 是否开启SQL合并
                          merge-sql: true
                          # 慢sql的时间标准 单位:毫秒
                          slow-sql-millis: 1000
                

                3.3 编写测试类测试

                注意:不要使用lombok的@RequiredArgsConstructor注解,JUnit5好像无法自动装配,详情来自:

                https://stackoverflow.com/questions/51867650/junit-5-no-parameterresolver-registered-for-parameter

                @SpringBootTest
                class SmartApplicationTest {
                    
                    @Autowired
                    private DataSource dataSource ;
                    @Test
                    void contextLoads() {
                        System.out.println(dataSource.getClass());
                        DruidDataSource druidDataSource = (DruidDataSource) dataSource;
                        System.out.println("druidDataSource.getUrl() = " + druidDataSource.getUrl());
                        System.out.println("druidDataSource.getUsername() = " + druidDataSource.getUsername());
                        System.out.println("druidDataSource.getInitialSize() = " + druidDataSource.getInitialSize());
                        System.out.println("druidDataSource.getMaxActive() = " + druidDataSource.getMaxActive());
                    }
                  
                }
                

                运行测试:

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

                可以看到配置类的相关配置已经生效。

                3.4 访问控制台

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

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

                3.5 测试SQL监控

                1. 测试接口

                  @RequestMapping("/user")
                  @RestController
                  @RequiredArgsConstructor
                  public class UserInfoController {
                      private final UserInfoService userInfoService;
                      @GetMapping("/test")
                      public Result login() {
                          return Result.success(userInfoService.getById(1));
                      }
                      
                  }
                  
                2. 进行测试

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

                3.6 数据库密码加密

                3.6.1 执行命令加密数据库密码

                官方教程Wiki文档:使用ConfigFilter · alibaba/druid Wiki (github.com)

                在命令行中执行如下命令:

                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
                

                输出

                privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg==
                publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ==
                password:PNak4Yui0+2Ft6JSoKBsgNPl+A033rdLhFw+L0np1o+HDRrCo9VkCuiiXviEMYwUgpHZUFxb2FpE0YmSguuRww==
                

                3.6.2 配置参数

                spring:
                  datasource:
                    url: jdbc:mysql://${voyager.db.host}:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
                    driver-class-name: com.mysql.cj.jdbc.Driver
                    username: root
                    password: password  # 修改为控制台输出的password
                    #druid数据源配置
                    druid:
                      # Druid数据源的公钥
                      public-key: publicKey # 修改为控制台输出的publicKey
                      filter:
                        # 启用Druid的过滤器配置
                        config: 
                          enabled: true
                      connect-properties:
                        # 启用Druid的连接属性解密功能
                        config.decrypt: true
                        config.decrypt.key: publicKey # 控制台输出的publicKey
                

                3.6.3 测试

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

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

                4 总结

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

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]