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

實踐 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)

分享創造快樂