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的监控页面中可以看到:
- 数据源
- SQL监控:对执行的数据库SQL语句进行记录,并记录执行时间、事务次数等
- SQL防火墙: 对SQL进行预编译,并统计该条SQL的数据指标
- Web应用: 对发布的服务进行监控,统计访问次数,并发数等全局信息
- URI监控:对访问的URI进行统计,记录次数,并发数,执行jdbc数等
- Session监控:对用户请求后保存在服务器端的session进行记录,识别出每个用户访问了多少次数据库等
- Spring监控:(按需配置)利用aop对各个内容接口的执行时间、jdbc数进行记录
- 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监控功能
- 访问我们写的getUsers 接口 http://127.0.0.1:8080/user/getUsers
然后访问druid监控页面
可以看到sql监控中有一个sql执行记录 已经执行过2次
- url监控页面中可以看到访问过的url列表
- spring监控页面中可以看到访问过的接口
如图我们配置的service层aop监控,我们也可以监控controller ,dao层。
值得提的问题
我发现不配置Servlet(监控视图配置)然后开启servlet扫描,而是仅仅在主配置文件中配置StatViewServlet,通过 http://localhost:8080/druid 无法访问到druid内置的监控页面
以上springboot2.0集成druid连接池和监控功能完毕!