欢迎来到网易天天爱彩票下载_网易天天爱彩票手机版_天天爱彩票下载苹果! 联系我们 网站地图

网易天天爱彩票下载_网易天天爱彩票手机版_天天爱彩票下载苹果

0379-65557469

可研编制
全国服务热线
0379-65557469

电话: 0379-65557469
0379-63930906
0379-63900388 
0379-63253525   
传真: 0379-65557469
地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室 

可研编制
当前位置: 首页 | 咨询案例 > 可研编制

网易天天爱彩票下载-Spring Boot (四):Druid 连接池暗码加密与监控

作者:admin 发布时间:2019-11-04 19:27:50 浏览次数:242
打印 收藏 关闭
字体【
视力保护色

假如我的文章对您有协助,请重视支撑下作者的大众号:极客挖掘机,获取最新干货推送:)

在上一篇文章《Spring Boot (三): ORM 结构 JPA 与衔接池 Hikari》 咱们介绍了 JPA 与衔接池 Hikari 的整合运用,在国内运用比较多的衔接池还有一个是阿里开源的 Druid 。本篇文章咱们就来聊一聊 Druid 的一些运用姿态。

1. Druid 是什么?

咱们先来看一下官方的答复:

Druid 是 Java 言语中最好的数据库衔接池。 Druid 能够供给强壮的监控和扩展功用。

说 Druid 是 Java 言语中最好的数据库衔接池,这个笔者个人觉得有些吹嘘了,至少在功用上和咱们上一篇介绍的 Hikari 是没得比的,相关的功用测验在网上能找到许多,笔者这边就不列举了。可是 Druid 在其他的一些方面就做的比较超卓了,功用十分丰富:

  • 能够监控数据库拜访功用, Druid 内置供给了一个功用强壮的StatFilter插件,能够具体计算 SQL 的履行功用,这关于线上剖析数据库拜访功用有协助。
  • 数据库暗码加密。直接把数据库暗码写在装备文件中,这是欠好的行为,简单导致安全问题。 DruidDruiver 和 DruidDataSource 都支撑 PasswordCallback 。
  • SQL 履行日志, Druid 供给了不同的 LogFilter ,能够支撑 Common-Logging 、 Log4j 和 JdkLog ,你能够按需求挑选相应的 LogFilter ,监控你运用的数据库拜访状况。
  • 扩展 JDBC ,假如你要对 JDBC 层有编程的需求,能够经过 Druid 供给的 Filter 机制,很便利编写 JDBC 层的扩展插件。

2. Spring Boot 运用中怎么运用

现在 Druid 官方为咱们供给了两种运用依靠方法,一种是根据传统 Java 工程供给的依靠包, maven 坐标如下:


com.alibaba
druid
1.1.20

还有一种是根据 Spring Boot 供给的依靠包, maven 坐标如下:


com.alibaba
druid-spring-boot-starter
1.1.20

下面的这种依靠包除了包含了上面的那种 Druid 根底包,还包含了 Spring Boot 主动装备的依靠包以及 sl4j-api ,咱们在 Spring Boot 中运用 Druid ,当然是引荐各位读者运用第二种方法引进依靠。

3. 工程实战

3.1 创立父工程 spring-boot-jpa-druid

父工程 pom.xml 如下:

代码清单:spring-boot-jpa-druid/pom.xml




xsi:schemaLocati何以笙萧默on="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0

org.springframework.boot
spring-boot-starter-parent
2.1.8.RELEASE


com.springcloud
spring-boot-jpa-druid
0.0.1-SNAPSHOT
spring-boot-jpa-druid
spring-boot-jpa-druid


1.1.20
1.8




org.springframework.boot
spring-boot-starter-data-jpa


org.springframework.boot
spring-boot-starter-web



mysql
mysql-connector-java
runtime



com.alibaba
druid-spring-boot-starter
${druid.version}


org.projectlombok
lombok
true


org.springframework.boot
spring-boot-starter-test
test






org.springframework.boot
spring-boot-maven-plugin




  • 笔者这儿运用的 Druid 依靠包是 druid-spring-boot-starter ,版别号为 1.1.20。

3.2 数据库暗码不加密的装备文件 application-pass.yml 如下:

代码清单:spring-boot-jpa-druid/src/main/resources/application-pass.yml


spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://192.168.0.128:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: 123456
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 衔接池的装备信息
# 初始化时树立物理衔接的个数
initial-size: 3
# 衔接池最小衔接数
min-idle: 3
# 衔接池最大衔接数
max-active: 20
# 获取衔接时最大等待时刻,单位毫秒
max-wait: 60000
# 请求衔接的时分检测,假如闲暇时刻大于timeBetweenEvictionRunsMillis,履行validationQuery检测衔接是否有用。
test-while-idle: true
# 既作为检测的间隔时刻又作为testWhileIdel履行的根据
time-between-connect-error-millis: 60000
# 毁掉线程时检测当时衔接的最终活动时刻和当时时刻差大于该值时,封闭当时衔接
min-evictable-idle-time-millis: 30000
# 用来检测衔接是否有用的sql 有必要是一个查询句子
# mysql中为 select 'x'
# oracle中为 select 1 from dual
validation-query: select 'x'
# 请求衔接时会履行validationQuery检测衔接是否有用,敞开会下降功用,默以为true
test-on-borrow: false
# 偿还衔接时会履行validationQuery检测衔接是否有用,敞开会下降功用,默以为true
test-on-return: false
# 是否缓存preparedStatement,mysql5.5+主张敞开
pool-prepared-statements: true
# 当值大于0时poolPreparedStatements会主动修正为true
max-pool-prepared-statement-per-connection-size: 20
# 兼并多个DruidDataSource的监控数据
use-global-data-source-stat: false
# 装备扩展插件
filters: stat,wall,slf4j
# 经过connectProperties特点来翻开mergeSql功用;慢SQL记载
connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 守时输出计算信息到日志中,并每次输出日志会导致清零(reset)衔接池相关的计数器。
time-between-log-stats-millis: 300000
# 装备DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: '/*'
exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
# 装备DruidStatViewServlet
stat-view-servlet:
# 是否启用StatViewServlet(监控页面)默许值为false(考虑到安全问题默许并未发动,如需启用主张设置暗码或白名单以保证安全)
enabled: true
url-pattern: '/druid/*'
# IP白名单(没有装备或许为空,则答应一切拜访)
allow: 127.0.0.1,192.168.0.1
# IP黑名单 (存在共一起,deny优先于allow)
deny: 192.168.0.128
# 禁用HTML页面上的“Reset All”功用
reset-enable: false
# 登录名
login-username: admin
# 登录暗码
login-password: admin
  • 相关装备的意义现已写在注释中了,这儿有一点要讲一下,当咱们要装备计算信息(包含监控信息) time-between-log-stats-millis 输出至日志中,兼并多个DruidDataSource的监控数据 use-global-data-source-stat 不行敞开,不然发动会报错。
  • spring.datasource.druid.filters :由于 Druid 的扩展是经过 Filter 插件的方式来敞开的,这儿咱们敞开了 stat 和 wall ,这俩个分别为监控和防护 SQL 注入进犯。 Druid 还供给了一些其他默许的 Filter ,如下表:

从称号上能够看出来,主要是一些编码和日志的相关 Filter 。

3.3 数据库暗码加密

在出产环境中,直接在装备文件中露出明文暗码是一件十分风险的工作,出于两点考虑:对外,即便运用服务被侵略,数据库仍是安全的;对内,出产环境的数据库暗码理论上应该只要 dba 知道,可是代码都是在代码库房中放着的,假如暗码没有加密,每次发布前 dba 都需求手动修正装备文件后再进行打包编译。

首要,咱们需求生成数据库暗码的密文,需求在指令行中履行如下指令:

java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools you_password

输出如下:

privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAh12hnaZuMe76Yb4pi7ogSAEMOcavmz7Blo8DYxeipxeZQhnrXngxc0gAQ6ORlofLWtDm6S7bI7wfDT2EFy/2DwIDAQABAkABMRjYK3vy4pi/vY3eFhBssd2qsI4hPsczjSTJfY7IC9Dc1f7g0axTM6Cx68tRUwv0rSnUiJ5EcDEhuD0JusSZAiEAwX1HpCTq8QgBV1WriHQC7Cd/9Qqp1V4yJeA/jdvXhbsCIQCzGS6wdTQCXDZKLvjRLeSUyTmmIqV/wckqdnpMUZ2BvQIgBIamr1tBt6OlTGKvoYB9NQLzhkrakCgk6ifltK7IytMCIBIbf67zipiafhqt+RYdD7lDRwLXCeiKzS3v4JmKvuP5AiEAr+zqD6sdXv7rWjqu50n+LXbWtNP/M4JzzO1mJOHEhoE=

publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIddoZ2mbjHu+mG+KYu6IEgBDDnGr5s+wZaPA2MXoqcXmUIZ6154MXNIAEOjkZaHy1rQ5uku2yO8Hw09hBcv9g8CAwEAAQ==

password:Y464AerH8tabxQg5DlkUej6gQ64KY73ahgiPyaB0vguLBLjUEEkVu6VBueiXxcnMfVjh1Nbd+lJNUTnS1a3/xg==

这儿咱们需求将生成的公钥 publicKey 和暗码 password 参加装备文件中, application-decrypt.yml 如下:

代码清单:spring-boot-jpa-druid/src/main/resources/application-decrypt.yml


spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://192.168.0.128:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
# 加密后密文,原暗码为 123456
password: Y464AerH8tabxQg5DlkUej6gQ64KY73ahgiPyaB0vguLBLjUEEkVu6VBueiXxcnMfVjh1Nbd+lJNUTnS1a3/xg==
driverClassName: com.mysql.cj.jdbc.Driver
druid:
filter:
config:
enabled: true
connection-properties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIddoZ2mbjHu+mG+KYu6IEgBDDnGr5s+wZaPA2MXoqcXmUIZ6154MXNIAEOjkZaHy1rQ5uku2yO8Hw09hBcv9g8CAwEAAQ==
# 剩网易天天爱彩票下载-Spring Boot (四):Druid 连接池暗码加密与监控下装备省掉
  • 已省掉部分装备,有需求的读者能够拜访 Github 库房获取。

3.4 装备文件 application.yml 如下:

代码清单:spring-boot-jpa-druid/src/main/resources/application.yml


server:
port: 8080
spring:
application:
name: spring-boot-jpa-druid
profiles:
active: decrypt
jpa:
database: mysql
show-sql: true
generate-ddl: true
databa网易天天爱彩票下载-Spring Boot (四):Druid 连接池暗码加密与监控se-platform: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate:
ddl-auto: update
properties:
hibernate:
f网易天天爱彩票下载-Spring Boot (四):Druid 连接池暗码加密与监控ormat_sql: true

其他的测验代码同上一篇文章《Spring Boot (三): ORM 结构 网易天天爱彩票下载-Spring Boot (四):Druid 连接池暗码加密与监控JPA 与衔接池 Hikari》,有爱好的读者能够拜访 Github 库房获取,笔者这儿就不一一列举了。

4. 测验

咱们在主装备文件中,挑选暗码加密的装备文件发动,将 spring.profiles.active 装备为 decrypt ,点击发动,能够看到工程正常发动,检查控制台输出日志,其中有这么一句:

2019-09-22 21:21:54.501 INFO 16972 --- [-Log-1465691120] c.a.d.p.DruidDataSourceStatLoggerImpl : {"url":"jdbc:mysql://192.168.0.128:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false","dbType":"mysql","name":"DataSource-1465691120","activeCount":0,"poolingCount":3,"poolingPeak":3,"poolingPeakTime":"2019-09-22 21:21:54","connectCount":0,"closeCount":0,"physicalConnectCount":3}

能够看到,咱们装备的监控信息输出会在系统发动的时分先输出一次,咱们在装备文件中装备的是每5分钟输出一次,等十分钟看一下控制台的输出信息,成果如下:

2019-09-22 21:26:54.503 INFO 16972 --- [-Log-1465691120] c.a.d.p.DruidDataSourceStatLoggerImpl : {"url":"jdbc:mysql://192.168.0.128:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false","dbType":"mysql","name":"DataSource-1465691120","activeCount":0,"activePeak":1,"activePeakTime":"2019-09-22 21:21:54","poolingCount":3,"poolingPeak":3,"poolingPeakTime":"2019-09-22 21:21:54","connectCount":2,"closeCount":2,"connectionHoldTimeHistogram":[0,0,2]}

2019-09-22 21:31:54.505 INFO 16972 --- [-Log-1465691120] c.a.d.p.DruidDataSourceStatLoggerImpl : {"url":"jdbc:mysql://192.168.0.128:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false","dbType":"mysql","name":"DataSource-1465691120","activeCount":0,"poolingCount":3,"connectCount":0,"closeCount":0}

2019-09-22 21:36:54.505 INFO 16972 --- [-Log-1465691120] c.a.d.p.DruidDataSourceStatLoggerImpl : {"url":"jdbc:mysql://192.168.0.128:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false","dbType":"mysql","name":"DataSource-1465691120","activeCount":0,"poolingCount":3,"connectCount":0,"closeCount":0}

从时刻上能够看出,确实是每5分钟会输出一次。

翻开浏览器拜访:http://localhost:8080/druid/ ,检查 Druid 监控页面,成果如图:

咱们能够进行一些接口测验,在检查监控页面,能够看到一切的 SQL 都正常记载,如图:

一起,咱们看一下后台的日志打印,是否正常打出记载的日志,截取打印部分,如下:

2019-09-22 21:51:54.506 INFO 16972 --- [-Log-1465691120] c.a.d.p.DruidDataSourceStatLoggerImpl : {"url":"jdbc:mysql://192.168.0.128:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false","dbType":"mysql","name":"DataSource-1465691120","activeCount":0,"activePeak":1,"activePeakTime":"2019-09-22 21:47:28","poolingCount":3,"poolingPeak":3,"poolingPeakTime":"2019-09-22 21:47:28","connectCount":4,"closeCount":4,"executeCount":4,"commitCount":4,"pstmtCacheHitCount":2,"pstmtCacheMissCount":2,"startTransactionCount":4,"transactionHistogram":[0,1,2,1],"connectionHoldTimeHistogram":[0,1,0,3],"sqlList":[{"sql":"insert into user (age, nick_name, id) values (?, ?, ?)","executeCount":2,"executeMillisMax":1,"executeMillisTotal":2,"executeHistogram":[1,1],"executeAndResultHoldHistogram":[1,1],"concurrentMax":1,"updateCount":2,"updateCountMax":1,"updateHistogram":[0,2],"inTransactionCount":2},{"sql":"select usermodel0_.id as id1_0_, usermodel0_.age as age2_0_, usermodel0_.nick_name as nick_nam3_0_ from user usermodel0_ order by usermodel0_.id desc","executeCount":2,"executeMillisMax":3,"executeMillisTotal":4,"executeHistogram":[0,2],"executeAndResultHoldHistogram":[2],"concurrentMax":1,"fetchRowCount":4,"fetchRowCountMax":2,"fetchRowHistog网易天天爱彩票下载-Spring Boot (四):Druid 连接池暗码加密与监控ram":[0,2],"inTransactionCount":2}]}

能够看到,日志中打印了咱们履行的 SQL 相关的信息,和咱们在监控页面看到的信息完全一致。

至此,测验成功,篇幅原因,一些测验进程未列出,各位感爱好的读者朋友能够自己着手测验一下。

5. 示例代码

示例代码-Github:https://github.com/meteor1993/spring-boot-examples/tree/master/spring-boot-jpa-druid

示例代码-Gitee:https://gitee.com/inwsy/spring-boot-examples/tree/master/spring-boot-jpa-druid

6. 参阅

《Druid 官方文档》:https://github.com/alibaba/druid/wiki

版权所有:洛阳市建设工程咨询有限责任公司 联系人:李经理 电话: 地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室
版权所有 网易天天爱彩票下载 沪ICP备185549273号-3