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

  1. 云栖社区>
  2. 博客>
  3. 正文

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

nqmysb 2019-04-14 16:49:11 浏览916
展开阅读全文

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连接池和监控功能完毕!

网友评论

登录后评论
0/500
评论
nqmysb
+ 关注