SpringBoot集成Druid

Apache Druid是一个高性能的实时分析数据库

Posted by Sunfy on 2020-10-12
Words 1.4k and Reading Time 6 Minutes
Viewed Times
Viewed Times
Visitors In Total

SpringBoot 自动集成starter使用实例,SpringBoot自定义集成Druid。Apache Druid是一个高性能的实时分析数据库。

druid官网

1、druid简介

image-20210120090838570

2、页面展示

集成后访问链接127.0.0.1:8080/druid

image-20210120092042057

image-20210120092107600

3、手动集成

创建一个SpringBoot项目,按照SpringBoot常规的三个步骤进行

1. 引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--JDBC,数据库链接最基础-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--手动导入druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.3</version>
</dependency>
<!--当前使用数据库驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

2. 添加配置

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
# 数据源
spring:
datasource:
username: root
password: xxxx
url: jdbc:mysql://192.168.88.88:3306/springboot_mybatis?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# 数据源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
#初始化时运行sql脚本
schema: classpath:sql/schema.sql
initialization-mode: always

3. 添加注解/业务逻辑

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
@Configuration
@ConditionalOnProperty("spring.datasource.type")
public class DruidConfiguration {
@Bean
public DataSource dataSource(DataSourceProperties properties){
// 根据配置动态构建一个DataSource,这个方式是DataSourceProperties独有的
return properties.initializeDataSourceBuilder().build();
}
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new StatViewServlet());
servletRegistrationBean.addUrlMappings("/druid/*");
// 添加IP白名单
servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
// 添加控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "123456");
// 是否能够重置数据
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean statFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
// 添加过滤规则
filterRegistrationBean.addUrlPatterns("/*");
// 忽略过滤格式
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,");
return filterRegistrationBean;
}
}

4、Data Source数据注入

1. @ConfigurationProperties注解

  • 该注解可以使用在类上,则该类下对应的属性会自动注入配置文件中配置信息
  • 同样该类也可以使用在方法上,在方法中new 对象同样可以自动注入,前提是该方法必须注册为Bean对象(即添加@Bean注解)
1
2
3
4
5
6
7
8
9
10
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource(DataSourceProperties properties){
// DruidDataSource druidDataSource = new DruidDataSource();
// druidDataSource.setMinIdle(1);
// new的druidDataSource中存在配置文件中配置信息的set方法,可以直接返回new 对象,就可以注入
// 添加@ConfigurationProperties注解会将配置文件中的信息自动注入在DruidDataSource对象中
// 这种方法可以很灵活的应用到各个场景
return new DruidDataSource();
}

2.DataSourceProperties

DataSourceProperties对象提供的方法initializeDataSourceBuilder

配置文件中的属性都是引用的该方法,initializeDataSourceBuilder的作用就是帮我们去构建一个DataSource对象。该方法采用了建造者的设计模式,一般建造者模式都有一个build方法创建相应对象。

  • 此方法为DataSourceProperties独有的方法
1
2
3
4
5
@Bean
public DataSource dataSource(DataSourceProperties properties){
// 根据配置动态构建一个DataSource,这个方式是DataSourceProperties独有的
return properties.initializeDataSourceBuilder().build();
}

5、配置类注解说明

  • @Configuration:标注当前类为配置类,SpringBoot启动扫描就可以扫描到当前类
  • @ConditionalOnProperty("spring.datasource.type"): 配置当前对象必须在配置spring.datasource.type后该类才会生效
  • 两个注解在SpringBoot的各个Starter中是不可或缺的

6、官方Starter

经过上面的一番配置,我们实现了想要的功能,我们实现的功能也就是Druid Starter中所具备的功能,接下来我们在有上面自定义配置的基础上看下官方提供的Starter又是如何实现的呢?

1. 添加注解

1
2
3
4
5
6
7
8
9
10
11
12
<!--可以去掉手动配置时引入的druid包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.3</version>
</dependency>-->
<!--导入druid starter-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>

2. 添加配置

1
2
3
4
5
6
7
8
9
10
11
spring:
datasource:
druid:
#开启druid 监控台servlet
stat-view-servlet:
enabled: true
login-username: admin
loginPassword: 123456
#开启druid 监控filter
web-stat-filter:
enabled: true

同我们手动配置时一样,配置

  • 开启druid监控台
  • 启用druid监控filter

3. 注释自定义配置

1
2
3
//@Configuration
//@ConditionalOnProperty("spring.datasource.type")
public class DruidConfiguration {

注释掉自定义配置,则我们的自定义配置则全部不会生效。

4. 启动项目

此时启动项目,durid控制台依然是可以正常访问的。这样我们就可以很好的理解和体会SpringBoot的开箱即用

5. Starter配置文件

使用我们学到了,具体的Starter中又是如何配置的呢,看配置

image-20210120101026229

image-20210120101235996

从这我们可以看出我们配置文件中配置的开启druid控制台,必须配置spring.datasource.druid.stat-view-servlet.enabled属性为true,才可以生效

image-20210120101408857

配置druid拦截器,都也是同样的原理

7、总结

通过durid这个插件,自定义与SpringBoot集成以及直接引入Starter两种方式,体验Springboot将我们常用的场景抽取成starter(场景启动器)后给我们带来的便利。体验SpringBoot的开箱即用的便捷的同时,又了解starter具体的实现原理,让我们不至于成为一个简单的操作机器,知其然而知其所以然。


Copyright 2021 sunfy.top ALL Rights Reserved

...

...

00:00
00:00