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

本文已被阅读过 Posted by Liao Can on 2019-04-14

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

添加maven依赖

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

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>

JDBC配置

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

1
2
3
4
5
6
7
# 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配置文件中添加连接池配置

1
2
3
4
5
6
7
8
9
# 连接池配置  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配置文件中添加监控配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 配置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(监控视图配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;

}

过滤不需要监控的后缀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 {

}

完整配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#服务端口
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监控页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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支持对数据库链接密码进行加密,在生产中为了安全我们可以进行加密数据库密码,配置如下

1
2
3
4
5
6
7
8
9
10
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次
  2. url监控页面中可以看到访问过的url列表
    在这里插入图片描述
  3. spring监控页面中可以看到访问过的接口
    在这里插入图片描述
    如图我们配置的service层aop监控,我们也可以监控controller ,dao层。

值得提的问题

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

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


支付宝打赏 微信打赏

赞赏一下