Springboot整合Druid實(shí)現(xiàn)對(duì)訪(fǎng)問(wèn)的監(jiān)控方式
Springboot整合Druid實(shí)現(xiàn)對(duì)訪(fǎng)問(wèn)的監(jiān)控
使用SpringBoot簡(jiǎn)單了解Druid的監(jiān)控系統(tǒng) ,我們使用Druid可能平常最多的就是連接池,但是Druid還可以實(shí)現(xiàn)監(jiān)控系統(tǒng),環(huán)境這里采用的是Springboot+mybatisPlus+Druid
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--MySQL依賴(lài)--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--lombok依賴(lài)--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--springboot test依賴(lài)--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--mybatis-plus依賴(lài)--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-`在這里插入代碼片`starter</artifactId> <version>1.1.10</version> </dependency>
# 配置Druid的配置類(lèi) @Configuration public class DruidMonitroConfiguration { // 1. 對(duì)于當(dāng)前這個(gè)配置僅僅是讓一個(gè)Druid監(jiān)控界面可以啟動(dòng)起來(lái) 但是具體里面的監(jiān)控項(xiàng)目還不能夠直接給我們提供支持,如果你要想使用以上這些所有的監(jiān)控項(xiàng)來(lái)監(jiān)控當(dāng)前的系統(tǒng)狀態(tài)暫時(shí)都無(wú)法使用,因?yàn)檫@些組件都是需額外的配置 @Bean("druidStatViewServlet") public ServletRegistrationBean<StatViewServlet> getDruidStatViewServlet() { # druid的訪(fǎng)問(wèn)路徑 ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); registrationBean.addInitParameter(StatViewServlet.PARAM_NAME_ALLOW, "127.0.0.1");//白名單 # 黑名單沒(méi)有 registrationBean.addInitParameter(StatViewServlet.PARAM_NAME_DENY, "");//黑名單 registrationBean.addInitParameter(StatViewServlet.PARAM_NAME_USERNAME, "admin");//用戶(hù)名 registrationBean.addInitParameter(StatViewServlet.PARAM_NAME_PASSWORD, "admin");//密碼 registrationBean.addInitParameter(StatViewServlet.PARAM_NAME_RESET_ENABLE, "true");//允許重置 return registrationBean; } ######################2. 添加Druid對(duì)web的訪(fǎng)問(wèn)控制 @Bean("webStatFilter") public WebStatFilter getWebStatFilter() { WebStatFilter statFilter = new WebStatFilter(); statFilter.setSessionStatEnable(true);// 對(duì)session進(jìn)行監(jiān)控 return statFilter; } // 配置好了一個(gè)web監(jiān)控的處理 @Bean @DependsOn("webStatFilter") public FilterRegistrationBean<WebStatFilter> getDruidStatViewServlet(WebStatFilter webStatFilter) { FilterRegistrationBean<WebStatFilter> registrationBean = new FilterRegistrationBean<>(webStatFilter); registrationBean.addUrlPatterns("/*"); //對(duì)所有的路徑都進(jìn)行監(jiān)控配置 registrationBean.addInitParameter (WebStatFilter.PARAM_NAME_EXCLUSIONS, "*.js,*.gif,/druid/*");// 排除路徑 return registrationBean; } }
yaml spring: datasource: # 1. DRUID 數(shù)據(jù)源的類(lèi)型 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/lvhao?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true username: root password: root druid: # 定義數(shù)據(jù)庫(kù)連接處所需要的相關(guān)配置項(xiàng) initial-Size: 5 # 初始化連接池大小 min-idle: 10 # 最小維持連接池大小 max-active: 40 #最大可提供鏈接數(shù)量 你有多少人可以鏈接 呢么如果現(xiàn)在鏈接都滿(mǎn)的話(huà) 就等待 max-wait: 5000 #等待時(shí)間 如果連接池滿(mǎn)的話(huà) 最長(zhǎng)的等待時(shí)間 time-between-eviction-runs-millis: 4000 # 關(guān)閉空閑鏈接間隔 長(zhǎng)期不使用的鏈接(我需要釋放) min-evictable-idle-time-millis: 3000 #l鏈接的最小生存時(shí)間 validation-query: SELECT 1 FROM DUAL #數(shù)據(jù)庫(kù)的狀態(tài)的鏈接檢查 test-while-idle: true # 判斷是否為可用鏈接 拿到一個(gè)可用鏈接之后 在進(jìn)行一個(gè)后續(xù)可用處理 test-on-borrow: false # 在鏈接前是否需要測(cè)試 test-on-return: false #歸還鏈接前是否要測(cè)試
配置好Druid對(duì)web的支持 ,再寫(xiě)一個(gè)test類(lèi),這樣我們就可以 訪(fǎng)問(wèn)一個(gè)controller
當(dāng)我們?cè)L問(wèn) http://localhost:8080/druid/index.html 的時(shí)候
就可以看到druid的面板了,這里可以看到druid 可以監(jiān)控web,sql, 以及sql 防火墻 ,session 之類(lèi)的
再之后我們?cè)L問(wèn)http://localhost:8080/message/1?a (看我controller的url)
對(duì)web的監(jiān)控
對(duì)url的監(jiān)控
對(duì)session的監(jiān)控
你看這里的web應(yīng)用顯示的是請(qǐng)求次數(shù)7次,
因?yàn)槲襲rl 訪(fǎng)問(wèn)了7次,并且記錄了我的session以及訪(fǎng)問(wèn)的url 信息
之后我們接著來(lái)看對(duì)慢sql的排查,一般情況下sql查詢(xún)超過(guò)2s就定義為慢sql, 通過(guò)Druid我們就可以知道那個(gè)sql執(zhí)行慢
但是我這里用1 是為了好演示效果
我現(xiàn)在新建立一個(gè)類(lèi) 因?yàn)轫?xiàng)目使用的是mybatisPlus
并且訪(fǎng)問(wèn)localhost:8080/echo
當(dāng)我不斷的訪(fǎng)問(wèn) 這個(gè)url時(shí)
可以看到 第一我后臺(tái)打印這個(gè)慢sql 日志了 當(dāng)然在Druid面板上也可以看到
我們點(diǎn)進(jìn)去也可以看到具體的詳情以及明細(xì)
這里的數(shù)據(jù)源顯示就顯示出你現(xiàn)在數(shù)據(jù)庫(kù)的配置信息
再之后我們可以進(jìn)行一個(gè)sql 防火墻的配置,SQL防火墻是數(shù)據(jù)庫(kù)層面的防火墻功能,可以防止惡意SQL注入。
比如說(shuō) update 后面沒(méi)有where語(yǔ)句 這樣進(jìn)行update的時(shí)候就是全表update了
spring: datasource: # 1. DRUID 數(shù)據(jù)源的類(lèi)型 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/lvhao?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true username: root password: abce1qaz druid: # 定義數(shù)據(jù)庫(kù)連接處所需要的相關(guān)配置項(xiàng) initial-Size: 5 # 初始化連接池大小 min-idle: 10 # 最小維持連接池大小 max-active: 40 #最大可提供鏈接數(shù)量 你有多少人可以鏈接 呢么如果現(xiàn)在鏈接都滿(mǎn)的話(huà) 就等待 max-wait: 5000 #等待時(shí)間 如果連接池滿(mǎn)的話(huà) 最長(zhǎng)的等待時(shí)間 time-between-eviction-runs-millis: 4000 # 關(guān)閉空閑鏈接間隔 長(zhǎng)期不使用的鏈接(我需要釋放) min-evictable-idle-time-millis: 3000 #l鏈接的最小生存時(shí)間 validation-query: SELECT 1 FROM DUAL #數(shù)據(jù)庫(kù)的狀態(tài)的鏈接檢查 test-while-idle: true # 判斷是否為可用鏈接 拿到一個(gè)可用鏈接之后 在進(jìn)行一個(gè)后續(xù)可用處理 test-on-borrow: false # 在鏈接前是否需要測(cè)試 test-on-return: false #歸還鏈接前是否要測(cè)試 #--------------man sql filter: stat: merge-sql: true # 統(tǒng)計(jì)相同的sql log-slow-sql: true # 記錄慢sql # slow-sql-millis: 2000 # 慢slq執(zhí)行時(shí)間標(biāo)準(zhǔn) slow-sql-millis: 1 # 慢slq執(zhí)行時(shí)間標(biāo)準(zhǔn) 防火墻的配置 wall: enabled: true #k開(kāi)啟sql防火墻 config: multi-statement-allow: true #允許執(zhí)行批處理 delete-allow: false # 不允許執(zhí)行刪除
比如說(shuō)
@RestController @RequestMapping("/echo/test") public class TestController3 { @Autowired private UserDAO userDAO; @GetMapping("/insert") public Object echo() { for (int i = 0; i < 5; i++) { User user = new User(); user.setId("11"+i); user.setName("zhangsan"+i ); user.setAge(11); user.setBir(new Date()); userDAO.insert(user); } return "1"; } @GetMapping("/delete") public Object delete() { QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("id",110); userDAO.delete(objectQueryWrapper); return "1"; } }
當(dāng)我訪(fǎng)問(wèn) /echo/test/insert 的時(shí)候是允許批量訪(fǎng)問(wèn)的
當(dāng)我當(dāng)問(wèn) /echo/test/delete 的時(shí)候會(huì)報(bào)錯(cuò)的 因?yàn)?我此時(shí)的防火墻設(shè)置的不允許執(zhí)行刪除
這樣我們就可以對(duì)我們的sql 以及慢sql進(jìn)行一個(gè)查詢(xún)以及記錄
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java Socket上的Read操作阻塞問(wèn)題詳解
這篇文章主要介紹了Java Socket上的Read操作阻塞問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10spring中通過(guò)ApplicationContext getBean獲取注入對(duì)象的方法實(shí)例
今天小編就為大家分享一篇關(guān)于spring中通過(guò)ApplicationContext getBean獲取注入對(duì)象的方法實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03InteliJ IDEA 設(shè)置eclipse快捷鍵 的圖文教程
本文通過(guò)圖文并茂的形式給大家介紹了InteliJ IDEA 設(shè)置eclipse快捷鍵 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下2018-06-06Spring線(xiàn)程池ThreadPoolTaskExecutor的用法及說(shuō)明
這篇文章主要介紹了Spring線(xiàn)程池ThreadPoolTaskExecutor的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Springboot整合Netty自定義協(xié)議實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了Springboot整合Netty自定義協(xié)議實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Log4j關(guān)閉Spring和Hibernate日志打印方式
這篇文章主要介紹了Log4j關(guān)閉Spring和Hibernate日志打印方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Spring MVC 使用支付寶接口完成在線(xiàn)支付的示例代碼
本篇文章主要介紹了Spring MVC 使用支付寶接口完成在線(xiàn)支付的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08