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

目录
相关文章
|
4天前
|
监控 jenkins Linux
从 Jenkins 持续集成出发:探究如何监控员工电脑屏幕
Jenkins 在企业信息化管理中用于自动化构建、测试和部署,提高开发效率。本文讨论了其重要性,并从技术角度探讨了屏幕监控的可能性,但明确反对非法监控,强调应合法合规地管理企业和尊重员工隐私。
40 12
|
17天前
|
存储 Prometheus 运维
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案。该集成结合了ARMS的基础设施监控能力和Prometheus的灵活配置及社区支持,实现了全面、精准的系统状态、性能和错误监控,提升了应用的稳定性和管理效率。通过统一的数据视图和高级查询功能,帮助企业有效应对云原生挑战,促进业务的持续发展。
25 3
|
3月前
|
监控 关系型数据库 MySQL
zabbix agent集成percona监控MySQL的插件实战案例
这篇文章是关于如何使用Percona监控插件集成Zabbix agent来监控MySQL的实战案例。
74 2
zabbix agent集成percona监控MySQL的插件实战案例
|
4月前
|
监控 前端开发 JavaScript
ARMS集成监控代码
【8月更文挑战第24天】
85 6
|
4月前
|
存储 Prometheus 监控
Grafana 与 Prometheus 集成:打造高效监控系统
【8月更文第29天】在现代软件开发和运维领域,监控系统已成为不可或缺的一部分。Prometheus 和 Grafana 作为两个非常流行且互补的开源工具,可以协同工作来构建强大的实时监控解决方案。Prometheus 负责收集和存储时间序列数据,而 Grafana 则提供直观的数据可视化功能。本文将详细介绍如何集成这两个工具,构建一个高效、灵活的监控系统。
475 1
|
4月前
|
监控 jenkins 测试技术
自动化测试中的“守护神”: 持续集成与代码质量监控
【8月更文挑战第31天】在软件开发的海洋里,自动化测试犹如一座灯塔,指引着项目向着高质量和高效率的方向前进。本文将深入探讨如何通过持续集成(CI)和代码质量监控相结合的方式,构建起一道坚固的防线,保障软件项目在快速迭代中不失方向。我们将一起探索这一过程中的关键实践,以及它们是如何相互作用,共同提升软件项目的可靠性和稳定性。
|
5月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
312 6
|
6月前
|
druid Java 关系型数据库
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
904 5
|
5月前
|
传感器 机器学习/深度学习 监控
在视频监控和防盗报警系统工程中,通常包括硬件(如摄像头、传感器、报警器等)和软件(如监控软件、报警管理软件等)的集成。
在视频监控和防盗报警系统工程中,通常包括硬件(如摄像头、传感器、报警器等)和软件(如监控软件、报警管理软件等)的集成。
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
166 1

热门文章

最新文章