歡迎光臨
每天分享高質量文章

實踐 Druid 作為 SpringBoot 工程的資料源添加 SQL 監控

(點擊上方公眾號,可快速關註)


來源:Mr.Hu

在大型業務系統上線後,為了保證系統能夠更好地持續穩定運行,及時發現各種故障(代碼缺陷、SQL性能問題、服務器CPU/磁盤引數指標和各類業務異常等),因此需要針對系統開發各種監控功能。在微服務架構下的各類業務平臺中,針對SQL進行監控,並根據業務的發展情況及時進行調優尤為重要。如果讓中間件或者業務研發團隊自己根據業務特征定製化開發一套SQL的監控系統,可能既費時費力,又不一定能夠達到預定的結果。本文將介紹業界較為流行的Druid資料源連接池插件,並跟其他幾款熱門的資料源連接池進行對比分析,最後給出在Spring Boot工程中集成該資料源連接池的實踐方法。

01

Druid資料庫連接池介紹

Druid資料源連接池來源於阿裡巴巴,是淘寶和支付寶專用資料庫連接池。事實上,它不僅僅是一個資料庫連接池,還包含一個ProxyDriver、一系列內置的JDBC組件庫、一個 SQL Parser。支持所有JDBC兼容的資料庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid針對Oracle和MySql做了特別優化,比如Oracle的PSCache記憶體占用優化,MySql的ping檢測優化。Druid提供了諸如MySql、Oracle、Postgresql、SQL-92等SQL陳述句的完美支持,是一個手寫的高性能SQL Parser,支持Visitor樣式,使得分析SQL的抽象語法樹很方便。它執行簡單SQL陳述句耗時在10微秒以內,對於複雜的SQL陳述句耗時也在30微秒左右。另外,通過Druid提供的SQL Parser可以在JDBC層面上攔截SQL併進行相應處理,比如說分庫分表、SQL安全審計等。Druid也能防禦SQL註入攻擊,WallFilter就是通過Druid的SQL Parser分析語意實現的。

02

與其他幾種資料庫連接池進行對比

通過下麵的表格先來看下Druid與當前比較流行的其他幾款資料源連接池的對比:

功能

dbcp

druid

c3p0

tomcat-jdbc

HikariCP

支持PSCache

監控

jmx

jmx/log/http

jmx,log

jmx

jmx

擴展

sql攔截及解析

支持

代碼

簡單

中等

複雜

簡單

簡單

特點

依賴common-pool

阿裡開源,功能全面

代碼邏輯複雜,且不易維護


功能簡單,起源於boneCP

連接池管理

LinkedBlockingDeque

陣列

更新

FairBlockingQueue

threadlocal+CopyOnWriteArrayList

從上面對比的表格中,可以看到druid功能最為全面,具備sql攔截等功能,其中統計資料較為全面,具有良好的擴展性。雖然在性能方面比HikariCP略差,但是綜合其他方面來考慮在做技術選型的時候,可以選擇Druid作為資料源連接池組件來用。

03

動手在Spring-Boot工程中添加Druid實踐

本文前面兩節都是主要講了理論,相對比較枯燥。下麵這一節將從實踐的角度,來一步一步向大家展示如何在Spring Boot工程中添加Druid連接池進行業務級的SQL監控。

版本環境

Spring Boot 1.4.1.RELEASE、Druid 1.0.12、JDK 1.8

在工程中添加Druid的pom依賴

因為阿裡開源了Druid的資料源連接池原始碼,我們可以通過maven倉庫可以獲得jar包依賴。訪問mvnrepository.com/artifact/com.alibaba/druid選擇自己專案需要的版本(在本次集成中選擇的是1.0.12),點擊進入後複製maven內容到pom.xml內即可,如下圖所示:

在自己工程中添加完以上Druid資料源連接池的依賴後,記得在Intellij中點擊下”Enable Auto import”選項即可自動下載maven依賴的jar到本地.m2目錄並構建到專案中。添加Druid至Spring Boot工程中就這麼Easy,這麼快捷。

在Spring Boot工程中添加Druid配置

在上面我們已經將Druid添加至專案中,接下來需要修改Spring Boot的application.yml配置檔案,來添加Druid資料源連接池的支持,如下圖所示:

需要說明的是,上面配置中的filters:stat表示已經可以使用監控過濾器,這時結合定義一個過濾器,我們就可以用其來監控SQL的執行情況。

開啟Druid的SQL監控功能

在工程中開啟監控功能後,可以在工程應用運行過程中,通過Druid資料源連接池自帶SQL監控提供的多維度資料,分析出業務SQL執行的情況,從而可以調整和優化代碼以及SQL,方便業務開發同事調優資料庫的訪問性能。

要達到開啟SQL監控的效果,還需在Spring Boot工程中還實現Druid資料源連接池的Serlvet以及Filter,其Bean的初始化代碼如下(下麵給出兩種配置方式):

第一種方式@Confing註解的配置類:

@Bean(name = “hwDataSource”)
@ConfigurationProperties(prefix = “spring.datasource.hwShareDB”)
public DruidDataSource  hwDataSource() {
    return new DruidDataSource();
}

@Bean
public ServletRegistrationBean druidServlet() {
    log.info(“init Druid Servlet Configuration “);
    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), “/druid/*”);
    // IP白名單 (沒有配置或者為空,則允許所有訪問)
    servletRegistrationBean.addInitParameter(“allow”, “”);
    // IP黑名單(共同存在時,deny優先於allow)
    servletRegistrationBean.addInitParameter(“deny”, “192.168.1.100”);
    //控制台管理用戶
 servletRegistrationBean.addInitParameter(“loginUsername”, “admin”);
 servletRegistrationBean.addInitParameter(“loginPassword”, “admin”);
    //是否能夠重置資料 禁用HTML頁面上的“Reset All”功能
 servletRegistrationBean.addInitParameter(“resetEnable”, “false”);
    return servletRegistrationBean;
}

@Bean
public FilterRegistrationBean filterRegistrationBean() {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
    filterRegistrationBean.addUrlPatterns(“/*”);
    filterRegistrationBean.addInitParameter(“exclusions”, “*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*”);
    return filterRegistrationBean;
}

第二種方式基於註解的配置:

//druid資料源狀態監控.

@WebServlet(urlPatterns = “/druid/*”,

    initParams = {

        // IP白名單 (沒有配置或者為空,則允許所有訪問)

        @WebInitParam(name = “allow”, value = “”),

        // IP黑名單 (存在共同時,deny優先於allow)

        @WebInitParam(name = “deny”, value = “192.168.1.100”),

        // 用戶名

        @WebInitParam(name = “loginUsername”, value = “admin”),

        // 密碼

        @WebInitParam(name = “loginPassword”, value = “admin”),

        // 禁用HTML頁面上的“Reset All”功能

        @WebInitParam(name = “resetEnable”, value = “false”)

    }

)

public class DruidStatViewServlet extends StatViewServlet {

}

 

// druid過濾器.

@WebFilter(filterName = “druidWebStatFilter”, urlPatterns = “/*”,

    initParams = {

        // 忽略資源

        @WebInitParam(name = “exclusions”, value = “*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*”)

    }

)

public class DruidStatFilter extends WebStatFilter {

}


使用上面第二種方式的話,還需要在Spring Boot工程的啟動類上添加註解:@ServletComponentScan,這樣使Spring能夠掃描到我們自己編寫的servlet和filter。

使用Druid進行SQL監控的效果

我們已經配置完成了Druid的監控,在本地運行Spring Boot的Jar包,運行成功後即可訪問Druid監控界面,預設訪問地址為:http://localhost:8080/druid/,最終的效果圖如下所示:

可以看到了我們成功的訪問了Druid的監控頁面,那麼現在輸入我們在Bean初始化時候設置的用戶名、密碼(admin/admin)登錄監控平臺,進入監控平臺首頁,如下所示:

有了Web UI我們就可以方便的從這個UI上看到該工程部署起來後資料源初始化配置以及業務級SQL的執行情況。

04

總結

本文圍繞Druid資料源連接池為主題,先簡要地介紹了該連接池的功能,然後通過與業界幾款較為流行的資料源連接池進行橫向對比,分析出Druid連接池的特色和優勢。最後通過實踐,進一步向大家闡述如何在一個Spring Boot工程中添加Druid連接池進行業務SQL級別的監控。限於筆者的才疏學淺,對本文內容可能還有理解不到位的地方,如有闡述不合理之處還望留言一起探討。

赞(0)

分享創造快樂