天天看點

Spring Boot應用的健康監控

在之前的系列文章中我們學習了如何進行spring boot應用的功能開發,以及如何寫單元測試、內建測試等,然而,在實際的軟體開發中需要做的不僅如此:還包括對應用程式的監控和管理。

正如飛行員不喜歡盲目飛行,程式員也需要實時看到自己的應用目前的運作情況。如果給定一個具體的時間,我們希望知道此時cpu的使用率、記憶體的使用率、資料庫連接配接是否正常以及在給定時間段内有多少客戶請求等名額;不僅如此,我們希望通過圖表、控制台來展示上述資訊。最重要的是:老闆和業務人員希望看到的是圖表,這些比較直覺易懂。

首先,這篇文章講介紹如何定制自己的health indicator。

在pom檔案中添加spring-boot-starter-actuator依賴

Spring Boot應用的健康監控

acatuator庫提供監控資訊

除了/health可以通路,其他的endpoints也可以通路,例如/info:首先在application.properties檔案中添加對應的屬性值,符号@包圍的屬性值來自pom.xml檔案中的元素節點。

要擷取配置檔案中的節點值,需要在pom檔案中進行一定的配置,首先在<build>節點裡面添加:

然後在<plugins>節點裡面增加對應的插件:

Spring Boot應用的健康監控

http://localhost:8080/info

在db-count-starter/src/main/com/test/bookpubstarter目錄下建立dbcounthealthindicator.java檔案

最後,還需要注冊剛剛建立的健康監控器,在dbcountautoconfiguration.java中增加如下定義:

Spring Boot應用的健康監控

自定義的health indicator

spring boot autuator這個庫包括很多自動配置,對外開放了很多endpoints,通過這些endpoints可以通路應用的運作時狀态:

Spring Boot應用的健康監控

tomcatsslconnector對應的屬性值

/beans,這個endpoint列出所有由spring boot建立的bean。

Spring Boot應用的健康監控

/beans顯示所有spring boot建立的bean

/mapping,這個endpoint顯示目前應用支援的url映射,該映射關系由handlermapping類維護,通過這個endpoint可以查詢某個url的路由資訊。

Spring Boot應用的健康監控

/mappings檢視url映射

/health提供應用程式的健康狀态,或者是某個核心子產品的健康狀态。

/metrics,這個endpoint顯示metrics 子系統管理的資訊,後面的文章會詳細介紹它。

上述各個endpoint是spring boot actuator提供的接口和方法,接下來看看我們自己定制的healthindicator,我們隻需要實作healthindicator接口,spring boot會收集該接口的實作,并加入到/health這個endpoint中。

在我們的例子中,我們為每個crudrepository執行個體都建立了一個healthindicator執行個體,為此我們建立了一個compositehealthindicator執行個體,由這個執行個體管理所有的dbhealthindicator執行個體。作為一個composite,它會提供一個内部的層次關系,進而可以傳回json格式的資料。

代碼中的healthaggregator執行個體的作用是:它維護一個map,告訴compositehealthindicator如何決定所有healthindicator代表的整體的狀态。例如,除了一個repository傳回down其他的都傳回up,這時候這個composite indicator作為一個整體應該傳回up還是down,healthaggregator執行個體的作用就在這裡。

spring boot使用的預設的healthaggregator實作是orderedhealthaggregator,它的政策是手機所有的内部狀态,然後選出在down、out_of_service、up和unknown中間具有最低優先級的那個狀态。這裡使用政策設計模式,是以具體的狀态判定政策可以改變和定制,例如我們可以建立定制的healthaggregator:

最後需要考慮下安全問題,通過這些endpoints暴露出很多應用的資訊,當然,spring boot也提供了配置項,可以關閉指定的endpoint——在application.properties中配置<name>.enable=false;

可以在防火牆上屏蔽掉不是/admin/*的endpoints通路請求,更進一步,利用spring security可以配置驗證資訊,這樣要通路目前應用的endpoints必須使用使用者名和密碼登陸。

<a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html" target="_blank">endpoints</a>

<a href="http://www.javabeat.net/spring-boot-actuator/" target="_blank">complete guide for spring boot actuator</a>