spring boot基于DRUID實(shí)現(xiàn)數(shù)據(jù)源監(jiān)控過(guò)程解析
這篇文章主要介紹了spring boot基于DRUID實(shí)現(xiàn)數(shù)據(jù)源監(jiān)控過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
隨著需求和技術(shù)的日益革新,spring boot框架是越來(lái)越流行,她也越來(lái)越多地出現(xiàn)在我們的項(xiàng)目中,當(dāng)然最主要的原因還是因?yàn)閟pring boot構(gòu)建項(xiàng)目實(shí)在是太爽了,構(gòu)建方便,開(kāi)發(fā)簡(jiǎn)單,而且效率高。今天我們并不是來(lái)專(zhuān)門(mén)學(xué)習(xí)spring boot項(xiàng)目的,我們要講的是數(shù)據(jù)源的加密和監(jiān)控,監(jiān)控到好說(shuō),就是不監(jiān)控也沒(méi)什么問(wèn)題,但是數(shù)據(jù)源加密卻涉及到我們的系統(tǒng)安全。
對(duì)于平時(shí)的學(xué)習(xí)測(cè)試,我們?cè)陧?xiàng)目中配置數(shù)據(jù)庫(kù)明文密碼是沒(méi)什么問(wèn)題的,因?yàn)槲覀兊臄?shù)據(jù)不重要,也就無(wú)所謂,但是在現(xiàn)實(shí)環(huán)境下的生產(chǎn)平臺(tái),配置明文密碼極有可能會(huì)造成我們數(shù)據(jù)庫(kù)密碼泄露,最終導(dǎo)致我們的生產(chǎn)數(shù)據(jù)泄露,這也就體現(xiàn)了生產(chǎn)環(huán)境數(shù)據(jù)源加密的必要性。下面我們就來(lái)看看如何實(shí)現(xiàn)數(shù)據(jù)源加密吧。
創(chuàng)建spring boot項(xiàng)目
創(chuàng)建過(guò)程就不贅述了,下面是我的項(xiàng)目依賴(lài):
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>io.githu.syske</groupId> <artifactId>druid-datasouce-decrypt</artifactId> <version>0.0.1-SNAPSHOT</version> <name>druid-datasouce-decrypt</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- 阿里巴巴druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
如果你的數(shù)據(jù)庫(kù)是Oracle,那么你要把mysql的數(shù)據(jù)庫(kù)驅(qū)動(dòng)替換成Oracle驅(qū)動(dòng)
修改spring boot項(xiàng)目配置信息
server: port: 8083
我采用的是yaml的方式,然后啟動(dòng)你的項(xiàng)目,因?yàn)闆](méi)有controller和其他的代碼,所以沒(méi)什么效果,但是項(xiàng)目可以正常啟動(dòng)。
加密數(shù)據(jù)源密碼,創(chuàng)建publickey
這里沒(méi)什么好講的,我直接放代碼:
import org.junit.Test; /** * @program: druid-datasouce-decrypt * @description: * @author: liu yan * @create: 2019-12-02 18:34 */ public class DBencrydtTest { @Test public void test() { String[] args = {"root"}; try { com.alibaba.druid.filter.config.ConfigTools.main(args); } catch (Exception e) { } System.out.println(); } }
需要說(shuō)明的是,args數(shù)組中放置的是密碼,直接運(yùn)行上面的代碼,你會(huì)看到控制臺(tái)會(huì)打印如下信息:
privateKey:MIIBVAIBADANBgkqhkiFWERAERFrterfgdggE6AgEAAkEAqboz+iNXPv1jgKAhDW7W+L/NwqG6GDTo49BjmlMg3WxBg4w9h4RC3oRO40EOjL7+DtEBBlCZ6OHZfZWKh17FmwIDAQABAkA/azwQszPebX/IiAzRoCDjQYf4ucV3Vg3PUgZlm7okAbsXrxz2xrdnM8Er08YKm3vUOmWQmSvaOI3CqdrK1f2BAiEA4XbEkCOxWVxbDLihyudClvrgLbZZyODlx5E2phn4gXMCIQDAtvMeJiXlGQBxFr/ci0r99FiYUeag/ZFwOjyhIzWBOQIgYg3bEqzTNn/aAUBS7QGCjlLxKDBD//7/L7nRwI9O6k0CIQCdBnUiY8MM4UpS206JzZXVR3vI4TMiinovD8THJ4E5QQIgRM1QlD1PG5YTxBxZMrLm2weBxsqXhvdJuTc1GXmoUxg= publicKey:MFwwDQYJKoZIhvcewrwerfrrgfg43534M/ojVz79Y4CgIQ1u1vi/zcKhuhg06OPQY5pTIN1sQYOMPYeEQt6ETuNBDoy+/g7RAQZQmejh2X2ViodexZsCAwEAAQ== password:O9JBjc86r9IhEoIE6jevJtgsgCXZAKCWH2UtO0tbG62zqIK5G5qJOCm1u9ju+lnno15vmq+TO5WqEWGzvkDNGg==
privateKey是你的私鑰,publicKey是公鑰,password就是你加密后的密碼。我們用到的配置有兩個(gè),一個(gè)是公鑰,一個(gè)是密碼,配置公鑰的原因是要通過(guò)公鑰進(jìn)行解密。將如上信息保存好,后面再spring boot的配置中要用到。
增加數(shù)據(jù)源相關(guān)配置
增加數(shù)據(jù)源配置信息:
# 阿里巴巴druid數(shù)據(jù)源配置 spring: datasource: # 數(shù)據(jù)源驅(qū)動(dòng)類(lèi)型,這里是druid type: com.alibaba.druid.pool.DruidDataSource # sql腳本編碼 sql-script-encoding: utf-8 druid: # 驅(qū)動(dòng)的類(lèi)名 driver-class-name: com.mysql.cj.jdbc.Driver # 數(shù)據(jù)庫(kù)連接密碼 username: root # 數(shù)據(jù)庫(kù)地址 url: jdbc:mysql://127.0.0.1:3307/spring?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai # 這里配置的是前面我們生成的密碼 password: Y2YOft/vPjw/JFPkevqZZKi8pCHu5ambR2ivSxgipTbL76pOoxNw3Un5Hcarbe9AqUImr+wS7YI6TjJZOVYjzA== # 這里設(shè)置連接配置,key配置的是我們前面生成的publicKey connection-properties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJI/xqbyvpVttxfAKulKeSTIb7tZAGaFcPyTnE2r7AHTQ8kOnqKXDda4u59umt9XBFxi7db28KxeVooB138zuRUCAwEAAQ== filter: config: # 啟用druid的攔截器 enabled: true # 連接池的配置信息 # 初始化時(shí)建立物理連接的個(gè)數(shù) initial-size: 3 # 連接池最小連接數(shù) min-idle: 3 # 連接池最大連接數(shù) max-active: 20 # 獲取連接時(shí)最大等待時(shí)間,單位毫秒 max-wait: 60000 # 申請(qǐng)連接的時(shí)候檢測(cè),如果空閑時(shí)間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測(cè)連接是否有效。 test-while-idle: true # 既作為檢測(cè)的間隔時(shí)間又作為testWhileIdel執(zhí)行的依據(jù) time-between-connect-error-millis: 60000 # 銷(xiāo)毀線程時(shí)檢測(cè)當(dāng)前連接的最后活動(dòng)時(shí)間和當(dāng)前時(shí)間差大于該值時(shí),關(guān)閉當(dāng)前連接 min-evictable-idle-time-millis: 30000 # 用來(lái)檢測(cè)連接是否有效的sql 必須是一個(gè)查詢(xún)語(yǔ)句 # mysql中為 select 'x' # oracle中為 select 1 from dual validationQuery: select 'x' # 申請(qǐng)連接時(shí)會(huì)執(zhí)行validationQuery檢測(cè)連接是否有效,開(kāi)啟會(huì)降低性能,默認(rèn)為true test-on-borrow: false # 歸還連接時(shí)會(huì)執(zhí)行validationQuery檢測(cè)連接是否有效,開(kāi)啟會(huì)降低性能,默認(rèn)為true test-on-return: false # 是否緩存preparedStatement,mysql5.5+建議開(kāi)啟 pool-prepared-statements: true # 當(dāng)值大于0時(shí)poolPreparedStatements會(huì)自動(dòng)修改為true max-pool-prepared-statement-per-connection-size: 20 # 合并多個(gè)DruidDataSource的監(jiān)控?cái)?shù)據(jù) use-global-data-source-stat: false # 配置擴(kuò)展插件 #監(jiān)控統(tǒng)計(jì)攔截的filters filters: stat,wall,slf4j # 通過(guò)connectProperties屬性來(lái)打開(kāi)mergeSql功能;慢SQL記錄 connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 定時(shí)輸出統(tǒng)計(jì)信息到日志中,并每次輸出日志會(huì)導(dǎo)致清零(reset)連接池相關(guān)的計(jì)數(shù)器。 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(監(jiān)控頁(yè)面)默認(rèn)值為false(考慮到安全問(wèn)題默認(rèn)并未啟動(dòng),如需啟用建議設(shè)置密碼或白名單以保障安全) enabled: true url-pattern: '/druid/*' # IP白名單(沒(méi)有配置或者為空,則允許所有訪問(wèn)) allow: 127.0.0.1,192.168.0.1 # IP黑名單 (存在共同時(shí),deny優(yōu)先于allow) deny: 192.168.0.128 # 禁用HTML頁(yè)面上的“Reset All”功能 reset-enable: false # 登錄名 login-username: admin # 登錄密碼 login-password: admin
上面?zhèn)渥⒁呀?jīng)很詳細(xì)了,這里要強(qiáng)調(diào)的有兩個(gè)地方,一個(gè)是key那里配置的是publicKey,不要配錯(cuò)了,一個(gè)是要注意 validationQuery這里mysql和Oracle是不一樣的,當(dāng)然你要可以移除該配置。
上面還加了數(shù)據(jù)源監(jiān)控的配置信息,注釋已經(jīng)夠詳細(xì)了。以上配置完成后就可以啟動(dòng)你的項(xiàng)目了,如果沒(méi)有報(bào)錯(cuò),那說(shuō)明你的配置沒(méi)有問(wèn)題,如果啟動(dòng)的時(shí)候報(bào)錯(cuò),說(shuō)明你的配置有問(wèn)題。
項(xiàng)目啟動(dòng)后,要進(jìn)入druid數(shù)據(jù)源監(jiān)控頁(yè)面,只需要輸入如下你的項(xiàng)目地址+/druid即可,比如我的地址:
http://localhost:8083/druid
然后輸入你在配置信息里面加入的用戶名和密碼,你就可以看見(jiàn)監(jiān)控頁(yè)面了,如果要查看sql相關(guān)監(jiān)控信息,你還要完善自己的項(xiàng)目,引入mybatis,配置你的sql。
結(jié)語(yǔ)
至此,我們的項(xiàng)目就已經(jīng)完成了,根據(jù)以上過(guò)程,我們發(fā)下數(shù)據(jù)源加密和監(jiān)控的核心是要添加正確的配置信息。如果在實(shí)際開(kāi)發(fā)過(guò)程中發(fā)下錯(cuò)誤,最主要的還是要檢查我們的配置是否正確。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot 項(xiàng)目使用jasypt加密數(shù)據(jù)源的方法
Jasypt 是一個(gè) Java 庫(kù),它允許開(kāi)發(fā)者以最小的努力為他/她的項(xiàng)目添加基本的加密功能,而且不需要對(duì)密碼學(xué)的工作原理有深刻的了解。接下來(lái)通過(guò)本文給大家介紹springboot 項(xiàng)目使用jasypt加密數(shù)據(jù)源的問(wèn)題,一起看看吧2021-11-11Spring Boot集成教程之異步調(diào)用Async
在項(xiàng)目中,當(dāng)訪問(wèn)其他人的接口較慢或者做耗時(shí)任務(wù)時(shí),不想程序一直卡在耗時(shí)任務(wù)上,想程序能夠并行執(zhí)行,我們可以使用多線程來(lái)并行的處理任務(wù),也可以使用spring提供的異步處理方式@Async。需要的朋友們下面來(lái)一起看看吧。2018-03-03Java中Runnable和Callable分別什么時(shí)候使用
提到 Java 就不得不說(shuō)多線程了,就算你不想說(shuō),面試官也得讓你說(shuō)呀,那說(shuō)到線程,就不得不說(shuō)Runnable和Callable這兩個(gè)家伙了,二者在什么時(shí)候使用呢,下面就來(lái)和簡(jiǎn)單講講2023-08-08Maven之導(dǎo)入thymeleaf依賴(lài)飄紅問(wèn)題及解決
這篇文章主要介紹了Maven之導(dǎo)入thymeleaf依賴(lài)飄紅問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Java反射機(jī)制詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Java 反射機(jī)制。通俗來(lái)講呢,就是在運(yùn)行狀態(tài)中,我們可以根據(jù)“類(lèi)的部分已經(jīng)的信息”來(lái)還原“類(lèi)的全部的信息”。這篇文章給大家詳細(xì)介紹了java反射機(jī)制的知識(shí),感興趣的朋友一起看看吧2017-06-06Java實(shí)現(xiàn)ATM機(jī)操作系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)ATM機(jī)操作系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05SpringCloud使用Feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用流程詳細(xì)介紹
OpenFeign源于Netflix的Feign,是http通信的客戶端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開(kāi)發(fā),讓開(kāi)發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成2023-02-02MyBatis的模糊查詢(xún)mapper.xml的寫(xiě)法講解
這篇文章主要介紹了MyBatis的模糊查詢(xún)mapper.xml的寫(xiě)法講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09springmvc級(jí)聯(lián)屬性處理無(wú)法轉(zhuǎn)換異常問(wèn)題解決
這篇文章主要介紹了springmvc級(jí)聯(lián)屬性處理無(wú)法轉(zhuǎn)換異常問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Java的數(shù)據(jù)類(lèi)型和參數(shù)傳遞(詳解)
下面小編就為大家?guī)?lái)一篇Java的數(shù)據(jù)類(lèi)型和參數(shù)傳遞(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07