Druid 連接池監(jiān)控集群解決方案
什么是 Druid Monitor
Druid 是一個非常強大的數(shù)據(jù)庫連接池,但是它的強大并不僅僅體現(xiàn)在作為一個高性能連接池加快數(shù)據(jù)訪問上和連接管理上,它內置了一個強大的監(jiān)控工具:Druid Monitor。不僅可以監(jiān)控數(shù)據(jù)源和慢查詢,還可以監(jiān)控 Web 應用、URI 監(jiān)控、Session 監(jiān)控、Spring 監(jiān)控等。
ip:port/druid/sql.html

什么是 Druid Admin
如上文所述, Druid Monitor 提供強大的監(jiān)控能力,但目前僅是針對對單個服務實例的監(jiān)控。在微服務架構[1]日益流行的時下,同一個服務可能有會有 N 個實例,監(jiān)控維度需要上升至 集群。
官方在 druid 1.2.1 版本后,提供 druid-admin[2] 模塊 來解決集群監(jiān)控的問題。
如下圖我們可以在原有的監(jiān)控集群上可以動態(tài)的切換服務名稱,做到一個監(jiān)控入口,實現(xiàn)不同服務的監(jiān)控切換。

Spring Cloud Stater 封裝
目前官方的 druid-admin 正在開發(fā)工程中,并不能直接編譯運行(依賴包錯誤、不支持 java11 等)。
druid-admin 本身是一個直接可運行的 web 服務,對目前已有服務不太友好,不能做到 spring boot admin[3] 那種即插即用
- 所以基于上述問題,筆者對 druid-admin 進行了相關的修改,直接抽取成 spring boot stater 引入即用。
1. 增加依賴
??<dependency>
???<groupId>com.pig4cloud.plugingroupId>
???<artifactId>spring-cloud-stater-druid-monitorartifactId>
???<version>0.0.1version>
??dependency>
??
??<dependency>
???<groupId>com.alibaba.cloudgroupId>
???<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
??dependency>
2. 接入注冊中心和需要監(jiān)控的服務列表
spring:
??cloud:
????nacos:
??????discovery:
????????server-addr:?127.0.0.1:8848
#?druid-admin?需要監(jiān)控的列表
monitor:
??applications:
????-?pigx-upms-biz
????-?pigx-auth
3. 目標服務暴露 druid 監(jiān)控端點
spring:
??datasource:
????druid:
??????stat-view-servlet:
????????enabled:?true
????????allow:?""
????????url-pattern:?/druid/*
4. 訪問 druid-admin 查看集群監(jiān)控
- ip:port/druid/sql.html
整合 Spring Boot Admin

- 引入上述依賴,增加如下配置即可
spring:
??boot:
????admin:
??????ui:
????????external-views:
??????????-?label:?"SQL監(jiān)控"
????????????url:?/druid/sql.html
????????????order:?2000
使用限制
由于 druid monitor 的登錄校驗基于 session 設計,所有在無狀態(tài)的微服務中不適用。建議直接暴露所有 druid 相關的端點,通過前置網(wǎng)關統(tǒng)一接口權限。
目前實例監(jiān)控數(shù)據(jù)是保存在對應內存中,僅在查看時通過每個實例匯總后顯示,后期會實現(xiàn)持久化。
參考資料
[1]微服務架構: https://gitee.com/log4j/pig
[2]druid-admin: https://github.com/alibaba/druid/tree/master/druid-admin
[3]spring boot admin: https://github.com/codecentric/spring-boot-admin
