Springboot2.0从零开始搭建脚手架(二)-集成druid连接池和监控功能

本文涉及的产品
云防火墙,500元 1000GB
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: springboot2.0使用 druid-spring-boot-starter 集成druid连接池和监控功能 添加maven依赖 在 Spring Boot 项目中加入druid-spring-boot-starter依赖 com.

springboot2.0使用 druid-spring-boot-starter 集成druid连接池和监控功能

添加maven依赖

在 Spring Boot 项目中加入druid-spring-boot-starter依赖

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.10</version>
</dependency>

JDBC配置

application.properties配置文件中添加JDBC配置

# JDBC配置   只有下面三个是必填项(使用内嵌数据库的话这三个也可以不用填,会使用默认配置),其他配置不是必须的
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:oracle:thin:@//192.168.1.150:1521/orclpdb
spring.datasource.username=LC_TEST
spring.datasource.password=LC_TEST
# driver-class-name 非必填可根据url推断
# spring.datasource.driver-class-name=org.h2.Driver

连接池配置

application.properties配置文件中添加连接池配置

# 连接池配置  Druid 数据源配置,继承spring.datasource.* 配置,相同则覆盖
## 初始化连接池的连接数量 大小,最小,最大
spring.datasource.druid.initial-size=2
spring.datasource.druid.max-active=30
spring.datasource.druid.min-idle=2
spring.datasource.druid.max-wait=1234
# 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=5

监控配置

application.properties配置文件中添加监控配置

# 配置StatFilter 
spring.datasource.druid.filter.stat.enabled=true

# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
## stat是统计,wall是SQL防火墙,防SQL注入的,log4j是用来输出统计数据的
spring.datasource.druid.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

# !!!请勿配置timeBetweenLogStatsMillis 会定时输出日志 并导致统计的sql清零
#spring.datasource.druid.timeBetweenLogStatsMillis=2000

# 监控配置 

# 是否启用StatFilter默认值false
spring.datasource.druid.web-stat-filter.enabled= true 
# StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
# 是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)

spring.datasource.druid.stat-view-servlet.enabled= true 
# Spring监控配置,对spring内部接口调用的监控 说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
spring.datasource.druid.aop-patterns=com.nqmysb.scaffold.user.service.*.*

配置Servlet(监控视图配置)

package com.nqmysb.scaffold.servlet;


import com.alibaba.druid.support.http.StatViewServlet;

import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;

/**
 * druid数据源状态监控.
 * */
@WebServlet(urlPatterns="/druid/*",
        initParams={
                @WebInitParam(name="allow",value="192.168.1.150"),// IP白名单(没有配置或者为空,则允许所有访问)
                @WebInitParam(name="deny",value="127.0.0.1"),// IP黑名单 (存在共同时,deny优先于allow)
                @WebInitParam(name="loginUsername",value="nqmysb"),// 用户名
                @WebInitParam(name="loginPassword",value="nqmysb"),// 密码
                @WebInitParam(name="resetEnable",value="false")// 禁用HTML页面上的“Reset All”功能
        }
)
public class DruidStatViewServlet extends StatViewServlet {
    private static final long serialVersionUID = 1L;

}

过滤不需要监控的后缀

package com.nqmysb.scaffold.servlet;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

import com.alibaba.druid.support.http.WebStatFilter;

/**
 * druid过滤器.
 */
@WebFilter(filterName = "druidWebStatFilter", urlPatterns = "/*",
        initParams = {
                @WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略资源
        }
)
public class DruidStatFilter extends WebStatFilter {

}

完整配置文件

#服务端口
server.port=8080

# JDBC配置   只有下面三个是必填项(使用内嵌数据库的话这三个也可以不用填,会使用默认配置),其他配置不是必须的
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:oracle:thin:@//192.168.1.150:1521/orclpdb
spring.datasource.username=LC_TEST
spring.datasource.password=LC_TEST
# driver-class-name 非必填可根据url推断
# spring.datasource.driver-class-name=org.h2.Driver

# 链接池配置  Druid 数据源配置,继承spring.datasource.* 配置,相同则覆盖
## 初始化连接池的连接数量 大小,最小,最大
spring.datasource.druid.initial-size=2
spring.datasource.druid.max-active=30
spring.datasource.druid.min-idle=2
spring.datasource.druid.max-wait=1234
# 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=5



# 配置StatFilter 
spring.datasource.druid.filter.stat.enabled=true


# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
## stat是统计,wall是SQL防火墙,防SQL注入的,log4j是用来输出统计数据的
spring.datasource.druid.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# !!!请勿配置timeBetweenLogStatsMillis 会定时输出日志 并导致统计的sql清零
#spring.datasource.druid.timeBetweenLogStatsMillis=2000

# 监控配置 
# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
# 是否启用StatFilter默认值false
spring.datasource.druid.web-stat-filter.enabled= true 
#spring.datasource.druid.web-stat-filter.url-pattern=/*
## 设置不统计哪些URL
#spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
## spring.datasource.druid.web-stat-filter.session-stat-enable=
## spring.datasource.druid.web-stat-filter.session-stat-max-count=
## spring.datasource.druid.web-stat-filter.principal-session-name=
## spring.datasource.druid.web-stat-filter.principal-cookie-name=
## spring.datasource.druid.web-stat-filter.profile-enable=

# StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
# 是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
spring.datasource.druid.stat-view-servlet.enabled= true 
#spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
## 禁止手动重置监控数据
spring.datasource.druid.stat-view-servlet.reset-enable=false
## 设置监控页面的登录名和密码
#spring.datasource.druid.stat-view-servlet.login-username=nqmysb
#spring.datasource.druid.stat-view-servlet.login-password=nqmysb
# 白名单
#spring.datasource.druid.stat-view-servlet.allow=
# 黑名单(优先)
#spring.datasource.druid.stat-view-servlet.deny=


# Spring监控配置,对spring内部接口调用的监控 说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
spring.datasource.druid.aop-patterns=com.nqmysb.scaffold.user.service.*.*

添加Servlet扫描

在入口类中添加Servlet扫描注解,不添加无法访问druid监控页面

package com.nqmysb.scaffold;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@MapperScan("com.nqmysb.scaffold.mapper.*.*")
@ServletComponentScan  //扫描servlet
public class SpringbootScaffoldApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootScaffoldApplication.class, args);
    }

}

监控数据接口测试

编写获取监控数据接口druidStat

package com.nqmysb.scaffold.user.controller;


import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.druid.stat.DruidStatManagerFacade;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.nqmysb.scaffold.user.entity.Userinfo;
import com.nqmysb.scaffold.user.service.impl.UserinfoServiceImpl;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author liaocan
 * @since 2019-04-14
 */
@Controller
@RequestMapping("/user")
public class UserinfoController {

    
      @Autowired
      UserinfoServiceImpl userinfoServiceImpl;

        @RequestMapping("/getUsers")
        @ResponseBody
        public ArrayList<Userinfo> getUsers() {
            Wrapper<Userinfo> queryWrapper = null;
            ArrayList<Userinfo> data = (ArrayList<Userinfo>) userinfoServiceImpl.list(queryWrapper);
            return data;
        }
        
        @GetMapping("/druid/stat")
        @ResponseBody
        public Object druidStat(){
            // DruidStatManagerFacade#getDataSourceStatDataList 该方法可以获取所有数据源的监控数据,除此之外 DruidStatManagerFacade 还提供了一些其他方法,你可以按需选择使用。
            return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
        }

}

启动项目 访问 http://localhost:8080/user/druid/stat 结果如下:
在这里插入图片描述
可以看到druid监控元数据信息

访问druid内置监控页面

druid给我们提供了内置的监控web页面,项目启动之后访问:http://localhost:8080/druid/index.html 即可 如下:
在这里插入图片描述

druid的监控内容

druid的监控内容主要有8大块,在web的监控页面中可以看到:

  1. 数据源
  2. SQL监控:对执行的数据库SQL语句进行记录,并记录执行时间、事务次数等
  3. SQL防火墙: 对SQL进行预编译,并统计该条SQL的数据指标
  4. Web应用: 对发布的服务进行监控,统计访问次数,并发数等全局信息
  5. URI监控:对访问的URI进行统计,记录次数,并发数,执行jdbc数等
  6. Session监控:对用户请求后保存在服务器端的session进行记录,识别出每个用户访问了多少次数据库等
  7. Spring监控:(按需配置)利用aop对各个内容接口的执行时间、jdbc数进行记录
  8. json API : 监控数据的json api介绍

监控白黑名单

druid虽然提供了内置的监控web页面,但是存在安全隐患,容易将数据库信息暴露出来,所以可以设置访问的白黑名单

            @WebInitParam(name="allow",value="192.168.1.150"),// IP白名单(没有配置或者为空,则允许所有访问)
            @WebInitParam(name="deny",value="127.0.0.1"),// IP黑名单 (存在共同时,deny优先于allow)

如上,当我们访问 http://127.0.0.1:8080/druid/api.html 时会显示没有权限
在这里插入图片描述

数据库密码加密

druid支持对数据库链接密码进行加密,在生产中为了安全我们可以进行加密数据库密码,配置如下

spring.datasource.url=jdbc:oracle:thin:@//192.168.1.150:1521/orclpdb
spring.datasource.username=root
# 生成的加密后的密码(原密码 123456)
spring.datasource.password=WVMjPhfXQrIsWRo0/RCqAVvYtTU9WNVToKJohb8AlUmHwnV6vwFL+FM2CNFDMJwGHW1iCmyaUlF+sgvFdogqEA==
# 生成的公钥
public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIiwHpFrDijV+GzwRTzWJk8D3j3jFfhsMFJ/7k1NTvBuLgL+TdIHgaMNOIEjHpXzuvX38J3FtOK8hLrySncVGOMCAwEAAQ==
# 配置 connection-properties,启用加密,配置公钥。
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}
# 启用ConfigFilter
spring.datasource.druid.filter.config.enabled=true

生成密码方式可以参考druid官方文档

测试druid监控功能

  1. 访问我们写的getUsers 接口 http://127.0.0.1:8080/user/getUsers
    在这里插入图片描述

然后访问druid监控页面
在这里插入图片描述
可以看到sql监控中有一个sql执行记录 已经执行过2次

  1. url监控页面中可以看到访问过的url列表
    在这里插入图片描述
  2. spring监控页面中可以看到访问过的接口
    在这里插入图片描述

如图我们配置的service层aop监控,我们也可以监控controller ,dao层。

值得提的问题

我发现不配置Servlet(监控视图配置)然后开启servlet扫描,而是仅仅在主配置文件中配置StatViewServlet,通过 http://localhost:8080/druid 无法访问到druid内置的监控页面

以上springboot2.0集成druid连接池和监控功能完毕!

目录
相关文章
|
27天前
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
181 43
|
6天前
|
Cloud Native Java Nacos
springcloud/springboot集成NACOS 做注册和配置中心以及nacos源码分析
通过本文,我们详细介绍了如何在 Spring Cloud 和 Spring Boot 中集成 Nacos 进行服务注册和配置管理,并对 Nacos 的源码进行了初步分析。Nacos 作为一个强大的服务注册和配置管理平台,为微服务架构提供
35 14
|
7天前
|
消息中间件 XML 前端开发
springBoot集成websocket实时消息推送
本文介绍了如何在Spring Boot项目中集成WebSocket实现实时消息推送。首先,通过引入`spring-boot-starter-websocket`依赖,配置`WebSocketConfig`类来启用WebSocket支持。接着,创建`WebSocketTest`服务器类,处理连接、消息收发及错误等事件,并使用`ConcurrentHashMap`管理用户连接。最后,前端通过JavaScript建立WebSocket连接,监听消息并进行相应处理。此方案适用于需要实时通信的应用场景,如聊天室、通知系统等。
|
1月前
|
监控 前端开发 Java
SpringBoot集成Tomcat、DispatcherServlet
通过这些配置,您可以充分利用 Spring Boot 内置的功能,快速构建和优化您的 Web 应用。
59 21
|
2月前
|
监控 Java Nacos
使用Spring Boot集成Nacos
通过上述步骤,Spring Boot应用可以成功集成Nacos,利用Nacos的服务发现和配置管理功能来提升微服务架构的灵活性和可维护性。通过这种集成,开发者可以更高效地管理和部署微服务。
264 17
|
2月前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
104 11
|
2月前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
516 12
|
2月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
93 8
|
3月前
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
187 5
|
4月前
|
消息中间件 Java Kafka
什么是Apache Kafka?如何将其与Spring Boot集成?
什么是Apache Kafka?如何将其与Spring Boot集成?
120 5