SpringBoot詳解整合Spring?Boot?Admin實(shí)現(xiàn)監(jiān)控功能
監(jiān)控
? 在說監(jiān)控之前,需要回顧一下軟件業(yè)的發(fā)展史。最早的軟件完成一些非常簡單的功能,代碼不多,錯(cuò)誤也少。隨著軟件功能的逐步完善,軟件的功能變得越來越復(fù)雜,功能不能得到有效的保障,這個(gè)階段出現(xiàn)了針對(duì)軟件功能的檢測,也就是軟件測試。伴隨著計(jì)算機(jī)操作系統(tǒng)的逐步升級(jí),軟件的運(yùn)行狀態(tài)也變得開始讓人捉摸不透,出現(xiàn)了不穩(wěn)定的狀況。伴隨著計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展,程序也從單機(jī)狀態(tài)切換成基于計(jì)算機(jī)網(wǎng)絡(luò)的程序,應(yīng)用于網(wǎng)絡(luò)的程序開始出現(xiàn),由于網(wǎng)絡(luò)的不穩(wěn)定性,程序的運(yùn)行狀態(tài)讓使用者更加堪憂?;ヂ?lián)網(wǎng)的出現(xiàn)徹底打破了軟件的思維模式,隨之而來的互聯(lián)網(wǎng)軟件就更加凸顯出應(yīng)對(duì)各種各樣復(fù)雜的網(wǎng)絡(luò)情況之下的弱小。計(jì)算機(jī)軟件的運(yùn)行狀況已經(jīng)成為了軟件運(yùn)行的一個(gè)大話題,針對(duì)軟件的運(yùn)行狀況就出現(xiàn)了全新的思維,建立起了初代的軟件運(yùn)行狀態(tài)監(jiān)控。
? 什么是監(jiān)控?就是通過軟件的方式展示另一個(gè)軟件的運(yùn)行情況,運(yùn)行的情況則通過各種各樣的指標(biāo)數(shù)據(jù)反饋給監(jiān)控人員。例如網(wǎng)絡(luò)是否順暢、服務(wù)器是否在運(yùn)行、程序的功能是否能夠整百分百運(yùn)行成功,內(nèi)存是否夠用,等等等等。
? 本章要講解的監(jiān)控就是對(duì)軟件的運(yùn)行情況進(jìn)行監(jiān)督,但是springboot程序與非springboot程序的差異還是很大的,為了方便監(jiān)控軟件的開發(fā),springboot提供了一套功能接口,為開發(fā)者加速開發(fā)過程。
監(jiān)控的意義
? 對(duì)于現(xiàn)代的互聯(lián)網(wǎng)程序來說,規(guī)模越來越大,功能越來越復(fù)雜,還要追求更好的客戶體驗(yàn),因此要監(jiān)控的信息量也就比較大了。由于現(xiàn)在的互聯(lián)網(wǎng)程序大部分都是基于微服務(wù)的程序,一個(gè)程序的運(yùn)行需要若干個(gè)服務(wù)來保障,因此第一個(gè)要監(jiān)控的指標(biāo)就是服務(wù)是否正常運(yùn)行,也就是監(jiān)控服務(wù)狀態(tài)是否處理宕機(jī)狀態(tài)。一旦發(fā)現(xiàn)某個(gè)服務(wù)宕機(jī)了,必須馬上給出對(duì)應(yīng)的解決方案,避免整體應(yīng)用功能受影響。其次,由于互聯(lián)網(wǎng)程序服務(wù)的客戶量是巨大的,當(dāng)客戶的請(qǐng)求在短時(shí)間內(nèi)集中達(dá)到服務(wù)器后,就會(huì)出現(xiàn)各種程序運(yùn)行指標(biāo)的波動(dòng)。比如內(nèi)存占用嚴(yán)重,請(qǐng)求無法及時(shí)響應(yīng)處理等,這就是第二個(gè)要監(jiān)控的重要指標(biāo),監(jiān)控服務(wù)運(yùn)行指標(biāo)。雖然軟件是對(duì)外提供用戶的訪問需求,完成對(duì)應(yīng)功能的,但是后臺(tái)的運(yùn)行是否平穩(wěn),是否出現(xiàn)了不影響客戶使用的功能隱患,這些也是要密切監(jiān)控的,此時(shí)就需要在不停機(jī)的情況下,監(jiān)控系統(tǒng)運(yùn)行情況,日志是一個(gè)不錯(cuò)的手段。如果在眾多日志中找到開發(fā)者或運(yùn)維人員所關(guān)注的日志信息,簡單快速有效的過濾出要看的日志也是監(jiān)控系統(tǒng)需要考慮的問題,這就是第三個(gè)要監(jiān)控的指標(biāo),監(jiān)控程序運(yùn)行日志。雖然我們期望程序一直平穩(wěn)運(yùn)行,但是由于突發(fā)情況的出現(xiàn),例如服務(wù)器被攻擊、服務(wù)器內(nèi)存溢出等情況造成了服務(wù)器宕機(jī),此時(shí)當(dāng)前服務(wù)不能滿足使用需要,就要將其重啟甚至關(guān)閉,如果快速控制服務(wù)器的啟停也是程序運(yùn)行過程中不可回避的問題,這就是第四個(gè)監(jiān)控項(xiàng),管理服務(wù)狀態(tài)。以上這些僅僅是從大的方面來思考監(jiān)控這個(gè)問題,還有很多的細(xì)節(jié)點(diǎn),例如上線了一個(gè)新功能,定時(shí)提醒用戶續(xù)費(fèi),這種功能不是上線后馬上就運(yùn)行的,但是當(dāng)前功能是否真的啟動(dòng),如果快速的查詢到這個(gè)功能已經(jīng)開啟,這也是監(jiān)控中要解決的問題,等等??磥肀O(jiān)控真的是一項(xiàng)非常重要的工作。
? 通過上述描述,可以看出監(jiān)控很重要。那具體的監(jiān)控要如何開展呢?還要從實(shí)際的程序運(yùn)行角度出發(fā)。比如現(xiàn)在有3個(gè)服務(wù)支撐著一個(gè)程序的運(yùn)行,每個(gè)服務(wù)都有自己的運(yùn)行狀態(tài)。
? 此時(shí)被監(jiān)控的信息就要在三個(gè)不同的程序中去查詢并展示,但是三個(gè)服務(wù)是服務(wù)于一個(gè)程序的運(yùn)行的,如果不能合并到一個(gè)平臺(tái)上展示,監(jiān)控工作量巨大,而且信息對(duì)稱性差,要不停的在三個(gè)監(jiān)控端查看數(shù)據(jù)。如果將業(yè)務(wù)放大成30個(gè),300個(gè),3000個(gè)呢?看來必須有一個(gè)單獨(dú)的平臺(tái),將多個(gè)被監(jiān)控的服務(wù)對(duì)應(yīng)的監(jiān)控指標(biāo)信息匯總在一起,這樣更利于監(jiān)控工作的開展。
? 新的程序?qū)iT用來監(jiān)控,新的問題就出現(xiàn)了,是被監(jiān)控程序主動(dòng)上報(bào)信息還是監(jiān)控程序主動(dòng)獲取信息?如果監(jiān)控程序不能主動(dòng)獲取信息,這就意味著監(jiān)控程序有可能看到的是很久之前被監(jiān)控程序上報(bào)的信息,萬一被監(jiān)控程序宕機(jī)了,監(jiān)控程序就無法區(qū)分究竟是好久沒法信息了,還是已經(jīng)下線了。所以監(jiān)控程序必須具有主動(dòng)發(fā)起請(qǐng)求獲取被監(jiān)控服務(wù)信息的能力。
? 如果監(jiān)控程序要監(jiān)控服務(wù)時(shí),主動(dòng)獲取對(duì)方的信息。那監(jiān)控程序如何知道哪些程序被自己監(jiān)控呢?不可能在監(jiān)控程序中設(shè)置我監(jiān)控誰,這樣互聯(lián)網(wǎng)上的所有程序豈不是都可以被監(jiān)控到,這樣的話信息安全將無法得到保障。合理的做法只能是在被監(jiān)控程序啟動(dòng)時(shí)上報(bào)監(jiān)控程序,告訴監(jiān)控程序你可以監(jiān)控我了。看來需要在被監(jiān)控程序端做主動(dòng)上報(bào)的操作,這就要求被監(jiān)控程序中配置對(duì)應(yīng)的監(jiān)控程序是誰。
? 被監(jiān)控程序可以提供各種各樣的指標(biāo)數(shù)據(jù)給監(jiān)控程序看,但是每一個(gè)指標(biāo)都代表著公司的機(jī)密信息,并不是所有的指標(biāo)都可以給任何人看的,乃至運(yùn)維人員,所以對(duì)被監(jiān)控指標(biāo)的是否開放出來給監(jiān)控系統(tǒng)看,也需要做詳細(xì)的設(shè)定。
? 以上描述的整個(gè)過程就是一個(gè)監(jiān)控系統(tǒng)的基本流程。
總結(jié)
- 監(jiān)控是一個(gè)非常重要的工作,是保障程序正常運(yùn)行的基礎(chǔ)手段
- 監(jiān)控的過程通過一個(gè)監(jiān)控程序進(jìn)行,它匯總所有被監(jiān)控的程序的信息集中統(tǒng)一展示
- 被監(jiān)控程序需要主動(dòng)上報(bào)自己被監(jiān)控,同時(shí)要設(shè)置哪些指標(biāo)被監(jiān)控
思考
? 下面就要開始做監(jiān)控了,新的問題就來了,監(jiān)控程序怎么做呢?難道要自己寫嗎?肯定是不現(xiàn)實(shí)的,如何進(jìn)行監(jiān)控,咱們下節(jié)再講。
可視化監(jiān)控平臺(tái)
? springboot抽取了大部分監(jiān)控系統(tǒng)的常用指標(biāo),提出了監(jiān)控的總思想。然后就有好心的同志根據(jù)監(jiān)控的總思想,制作了一個(gè)通用性很強(qiáng)的監(jiān)控系統(tǒng),因?yàn)槭腔趕pringboot監(jiān)控的核心思想制作的,所以這個(gè)程序被命名為Spring Boot Admin。
? Spring Boot Admin,這是一個(gè)開源社區(qū)項(xiàng)目,用于管理和監(jiān)控SpringBoot應(yīng)用程序。這個(gè)項(xiàng)目中包含有客戶端和服務(wù)端兩部分,而監(jiān)控平臺(tái)指的就是服務(wù)端。我們做的程序如果需要被監(jiān)控,將我們做的程序制作成客戶端,然后配置服務(wù)端地址后,服務(wù)端就可以通過HTTP請(qǐng)求的方式從客戶端獲取對(duì)應(yīng)的信息,并通過UI界面展示對(duì)應(yīng)信息。
? 下面就來開發(fā)這套監(jiān)控程序,先制作服務(wù)端,其實(shí)服務(wù)端可以理解為是一個(gè)web程序,收到一些信息后展示這些信息。
服務(wù)端開發(fā)
步驟①:導(dǎo)入springboot admin對(duì)應(yīng)的starter,版本與當(dāng)前使用的springboot版本保持一致,并將其配置成web工程
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.5.4</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
? 上述過程可以通過創(chuàng)建項(xiàng)目時(shí)使用勾選的形式完成。
步驟②:在引導(dǎo)類上添加注解@EnableAdminServer,聲明當(dāng)前應(yīng)用啟動(dòng)后作為SpringBootAdmin的服務(wù)器使用
@SpringBootApplication @EnableAdminServer public class Springboot25AdminServerApplication { public static void main(String[] args) { SpringApplication.run(Springboot25AdminServerApplication.class, args); } }
? 做到這里,這個(gè)服務(wù)器就開發(fā)好了,啟動(dòng)后就可以訪問當(dāng)前程序了,界面如下。
? 由于目前沒有啟動(dòng)任何被監(jiān)控的程序,所以里面什么信息都沒有。下面制作一個(gè)被監(jiān)控的客戶端程序。
客戶端開發(fā)
? 客戶端程序開發(fā)其實(shí)和服務(wù)端開發(fā)思路基本相似,多了一些配置而已。
步驟①:導(dǎo)入springboot admin對(duì)應(yīng)的starter,版本與當(dāng)前使用的springboot版本保持一致,并將其配置成web工程
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.5.4</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
? 上述過程也可以通過創(chuàng)建項(xiàng)目時(shí)使用勾選的形式完成,不過一定要小心,端口配置成不一樣的,否則會(huì)沖突。
步驟②:設(shè)置當(dāng)前客戶端將信息上傳到哪個(gè)服務(wù)器上,通過yml文件配置
spring:
boot:
admin:
client:
url: http://localhost:8080
? 做到這里,這個(gè)客戶端就可以啟動(dòng)了。啟動(dòng)后再次訪問服務(wù)端程序,界面如下。
? 可以看到,當(dāng)前監(jiān)控了1個(gè)程序,點(diǎn)擊進(jìn)去查看詳細(xì)信息。
? 由于當(dāng)前沒有設(shè)置開放哪些信息給監(jiān)控服務(wù)器,所以目前看不到什么有效的信息。下面需要做兩組配置就可以看到信息了。
開放指定信息給服務(wù)器看
允許服務(wù)器以HTTP請(qǐng)求的方式獲取對(duì)應(yīng)的信息
配置如下:
server:
port: 80
spring:
boot:
admin:
client:
url: http://localhost:8080
management:
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: "*"
? 上述配置對(duì)于初學(xué)者來說比較容易混淆。簡單解釋一下,到下一節(jié)再做具體的講解。springbootadmin的客戶端默認(rèn)開放了13組信息給服務(wù)器,但是這些信息除了一個(gè)之外,其他的信息都不讓通過HTTP請(qǐng)求查看。所以你看到的信息基本上就沒什么內(nèi)容了,只能看到一個(gè)內(nèi)容,就是下面的健康信息。
? 但是即便如此我們看到健康信息中也沒什么內(nèi)容,原因在于健康信息中有一些信息描述了你當(dāng)前應(yīng)用使用了什么技術(shù)等信息,如果無腦的對(duì)外暴露功能會(huì)有安全隱患。通過配置就可以開放所有的健康信息明細(xì)查看了。
management:
endpoint:
health:
show-details: always
? 健康明細(xì)信息如下:
? 目前除了健康信息,其他信息都查閱不了。原因在于其他12種信息是默認(rèn)不提供給服務(wù)器通過HTTP請(qǐng)求查閱的,所以需要開啟查閱的內(nèi)容項(xiàng),使用*表示查閱全部。記得帶引號(hào)。
endpoints:
web:
exposure:
include: "*"
? 配置后再刷新服務(wù)器頁面,就可以看到所有的信息了。
? 以上界面中展示的信息量就非常大了,包含了13組信息,有性能指標(biāo)監(jiān)控,加載的bean列表,加載的系統(tǒng)屬性,日志的顯示控制等等。
配置多個(gè)客戶端
? 可以通過配置客戶端的方式在其他的springboot程序中添加客戶端坐標(biāo),這樣當(dāng)前服務(wù)器就可以監(jiān)控多個(gè)客戶端程序了。每個(gè)客戶端展示不同的監(jiān)控信息。
? 進(jìn)入監(jiān)控面板,如果你加載的應(yīng)用具有功能,在監(jiān)控面板中可以看到3組信息展示的與之前加載的空工程不一樣。
類加載面板中可以查閱到開發(fā)者自定義的類:
映射中可以查閱到當(dāng)前應(yīng)用配置的所有請(qǐng)求
性能指標(biāo)中可以查閱當(dāng)前應(yīng)用獨(dú)有的請(qǐng)求路徑統(tǒng)計(jì)數(shù)據(jù)
總結(jié)
- 開發(fā)監(jiān)控服務(wù)端需要導(dǎo)入坐標(biāo),然后在引導(dǎo)類上添加注解@EnableAdminServer,并將其配置成web程序即可
- 開發(fā)被監(jiān)控的客戶端需要導(dǎo)入坐標(biāo),然后配置服務(wù)端服務(wù)器地址,并做開放指標(biāo)的設(shè)定即可
- 在監(jiān)控平臺(tái)中可以查閱到各種各樣被監(jiān)控的指標(biāo),前提是客戶端開放了被監(jiān)控的指標(biāo)
思考
? 之前說過,服務(wù)端要想監(jiān)控客戶端,需要主動(dòng)的獲取到對(duì)應(yīng)信息并展示出來。但是目前我們并沒有在客戶端開發(fā)任何新的功能,但是服務(wù)端確可以獲取監(jiān)控信息,誰幫我們做的這些功能呢?咱們下一節(jié)再講。
監(jiān)控原理
? 通過查閱監(jiān)控中的映射指標(biāo),可以看到當(dāng)前系統(tǒng)中可以運(yùn)行的所有請(qǐng)求路徑,其中大部分路徑以/actuator開頭
? 首先這些請(qǐng)求路徑不是開發(fā)者自己編寫的,其次這個(gè)路徑代表什么含義呢?既然這個(gè)路徑可以訪問,就可以通過瀏覽器發(fā)送該請(qǐng)求看看究竟可以得到什么信息。
? 通過發(fā)送請(qǐng)求,可以得到一組json信息,如下
{ "_links": { "self": { "href": "http://localhost:81/actuator", "templated": false }, "beans": { "href": "http://localhost:81/actuator/beans", "templated": false }, "caches-cache": { "href": "http://localhost:81/actuator/caches/{cache}", "templated": true }, "caches": { "href": "http://localhost:81/actuator/caches", "templated": false }, "health": { "href": "http://localhost:81/actuator/health", "templated": false }, "health-path": { "href": "http://localhost:81/actuator/health/{*path}", "templated": true }, "info": { "href": "http://localhost:81/actuator/info", "templated": false }, "conditions": { "href": "http://localhost:81/actuator/conditions", "templated": false }, "shutdown": { "href": "http://localhost:81/actuator/shutdown", "templated": false }, "configprops": { "href": "http://localhost:81/actuator/configprops", "templated": false }, "configprops-prefix": { "href": "http://localhost:81/actuator/configprops/{prefix}", "templated": true }, "env": { "href": "http://localhost:81/actuator/env", "templated": false }, "env-toMatch": { "href": "http://localhost:81/actuator/env/{toMatch}", "templated": true }, "loggers": { "href": "http://localhost:81/actuator/loggers", "templated": false }, "loggers-name": { "href": "http://localhost:81/actuator/loggers/{name}", "templated": true }, "heapdump": { "href": "http://localhost:81/actuator/heapdump", "templated": false }, "threaddump": { "href": "http://localhost:81/actuator/threaddump", "templated": false }, "metrics-requiredMetricName": { "href": "http://localhost:81/actuator/metrics/{requiredMetricName}", "templated": true }, "metrics": { "href": "http://localhost:81/actuator/metrics", "templated": false }, "scheduledtasks": { "href": "http://localhost:81/actuator/scheduledtasks", "templated": false }, "mappings": { "href": "http://localhost:81/actuator/mappings", "templated": false } } }
? 其中每一組數(shù)據(jù)都有一個(gè)請(qǐng)求路徑,而在這里請(qǐng)求路徑中有之前看到過的health,發(fā)送此請(qǐng)求又得到了一組信息
{ "status": "UP", "components": { "diskSpace": { "status": "UP", "details": { "total": 297042808832, "free": 72284409856, "threshold": 10485760, "exists": true } }, "ping": { "status": "UP" } } }
? 當(dāng)前信息與監(jiān)控面板中的數(shù)據(jù)存在著對(duì)應(yīng)關(guān)系
? 原來監(jiān)控中顯示的信息實(shí)際上是通過發(fā)送請(qǐng)求后得到j(luò)son數(shù)據(jù),然后展示出來。按照上述操作,可以發(fā)送更多的以/actuator開頭的鏈接地址,獲取更多的數(shù)據(jù),這些數(shù)據(jù)匯總到一起組成了監(jiān)控平臺(tái)顯示的所有數(shù)據(jù)。
? 到這里我們得到了一個(gè)核心信息,監(jiān)控平臺(tái)中顯示的信息實(shí)際上是通過對(duì)被監(jiān)控的應(yīng)用發(fā)送請(qǐng)求得到的。那這些請(qǐng)求誰開發(fā)的呢?打開被監(jiān)控應(yīng)用的pom文件,其中導(dǎo)入了springboot admin的對(duì)應(yīng)的client,在這個(gè)資源中導(dǎo)入了一個(gè)名稱叫做actuator的包。被監(jiān)控的應(yīng)用之所以可以對(duì)外提供上述請(qǐng)求路徑,就是因?yàn)樘砑恿诉@個(gè)包。
? 這個(gè)actuator是什么呢?這就是本節(jié)要講的核心內(nèi)容,監(jiān)控的端點(diǎn)。
? Actuator,可以稱為端點(diǎn),描述了一組監(jiān)控信息,SpringBootAdmin提供了多個(gè)內(nèi)置端點(diǎn),通過訪問端點(diǎn)就可以獲取對(duì)應(yīng)的監(jiān)控信息,也可以根據(jù)需要自定義端點(diǎn)信息。通過發(fā)送請(qǐng)求路勁**/actuator可以訪問應(yīng)用所有端點(diǎn)信息,如果端點(diǎn)中還有明細(xì)信息可以發(fā)送請(qǐng)求/actuator/端點(diǎn)名稱**來獲取詳細(xì)信息。以下列出了所有端點(diǎn)信息說明:
用所有端點(diǎn)信息,如果端點(diǎn)中還有明細(xì)信息可以發(fā)送請(qǐng)求/actuator/端點(diǎn)名稱**來獲取詳細(xì)信息。以下列出了所有端點(diǎn)信息說明:
ID | 描述 | 默認(rèn)啟用 |
---|---|---|
auditevents | 暴露當(dāng)前應(yīng)用程序的審計(jì)事件信息。 | 是 |
beans | 顯示應(yīng)用程序中所有 Spring bean 的完整列表。 | 是 |
caches | 暴露可用的緩存。 | 是 |
conditions | 顯示在配置和自動(dòng)配置類上評(píng)估的條件以及它們匹配或不匹配的原因。 | 是 |
configprops | 顯示所有 @ConfigurationProperties 的校對(duì)清單。 | 是 |
env | 暴露 Spring ConfigurableEnvironment 中的屬性。 | 是 |
flyway | 顯示已應(yīng)用的 Flyway 數(shù)據(jù)庫遷移。 | 是 |
health | 顯示應(yīng)用程序健康信息 | 是 |
httptrace | 顯示 HTTP 追蹤信息(默認(rèn)情況下,最后 100 個(gè) HTTP 請(qǐng)求/響應(yīng)交換)。 | 是 |
info | 顯示應(yīng)用程序信息。 | 是 |
integrationgraph | 顯示 Spring Integration 圖。 | 是 |
loggers | 顯示和修改應(yīng)用程序中日志記錄器的配置。 | 是 |
liquibase | 顯示已應(yīng)用的 Liquibase 數(shù)據(jù)庫遷移。 | 是 |
metrics | 顯示當(dāng)前應(yīng)用程序的指標(biāo)度量信息。 | 是 |
mappings | 顯示所有 @RequestMapping 路徑的整理清單。 | 是 |
scheduledtasks | 顯示應(yīng)用程序中的調(diào)度任務(wù)。 | 是 |
sessions | 允許從 Spring Session 支持的會(huì)話存儲(chǔ)中檢索和刪除用戶會(huì)話。當(dāng)使用 Spring Session 的響應(yīng)式 Web 應(yīng)用程序支持時(shí)不可用。 | 是 |
shutdown | 正常關(guān)閉應(yīng)用程序。 | 否 |
threaddump | 執(zhí)行線程 dump。 | 是 |
heapdump | 返回一個(gè) hprof 堆 dump 文件。 | 是 |
jolokia | 通過 HTTP 暴露 JMX bean(當(dāng) Jolokia 在 classpath 上時(shí),不適用于 WebFlux)。 | 是 |
logfile | 返回日志文件的內(nèi)容(如果已設(shè)置 logging.file 或 logging.path 屬性)。支持使用 HTTP Range 頭來檢索部分日志文件的內(nèi)容。 | 是 |
prometheus | 以可以由 Prometheus 服務(wù)器抓取的格式暴露指標(biāo)。 | 是 |
? 上述端點(diǎn)每一項(xiàng)代表被監(jiān)控的指標(biāo),如果對(duì)外開放則監(jiān)控平臺(tái)可以查詢到對(duì)應(yīng)的端點(diǎn)信息,如果未開放則無法查詢對(duì)應(yīng)的端點(diǎn)信息。通過配置可以設(shè)置端點(diǎn)是否對(duì)外開放功能。使用enable屬性控制端點(diǎn)是否對(duì)外開放。其中health端點(diǎn)為默認(rèn)端點(diǎn),不能關(guān)閉。
management:
endpoint:
health: # 端點(diǎn)名稱
show-details: always
# 監(jiān)控端點(diǎn)關(guān)閉用如下方式
info: # 端點(diǎn)名稱
enabled: false # 是否開放
? 為了方便開發(fā)者快速配置端點(diǎn),springboot admin設(shè)置了13個(gè)較為常用的端點(diǎn)作為默認(rèn)開放的端點(diǎn),如果需要控制默認(rèn)開放的端點(diǎn)的開放狀態(tài),可以通過配置設(shè)置,如下:
management:
endpoints:
enabled-by-default: true # 是否開啟默認(rèn)端點(diǎn),默認(rèn)值true
? 上述端點(diǎn)開啟后,就可以通過端點(diǎn)對(duì)應(yīng)的路徑查看對(duì)應(yīng)的信息了。但是此時(shí)還不能通過HTTP請(qǐng)求查詢此信息,還需要開啟通過HTTP請(qǐng)求查詢的端點(diǎn)名稱,使用“*”可以簡化配置成開放所有端點(diǎn)的WEB端HTTP請(qǐng)求權(quán)限。
management:
endpoints:
web:
exposure:
include: "*"
? 整體上來說,對(duì)于端點(diǎn)的配置有兩組信息,一組是endpoints開頭的,對(duì)所有端點(diǎn)進(jìn)行配置,一組是endpoint開頭的,對(duì)具體端點(diǎn)進(jìn)行配置。
management:
endpoint: # 具體端點(diǎn)的配置
health:
show-details: always
# 監(jiān)控端點(diǎn)關(guān)閉用如下方式
info:
enabled: false
endpoints: # 全部端點(diǎn)的配置
web:
exposure:
include: "*"
enabled-by-default: true
總結(jié)
- 被監(jiān)控客戶端通過添加actuator的坐標(biāo)可以對(duì)外提供被訪問的端點(diǎn)功能
- 端點(diǎn)功能的開放與關(guān)閉可以通過配置進(jìn)行控制
- web端默認(rèn)無法獲取所有端點(diǎn)信息,通過配置開放端點(diǎn)功能
自定義監(jiān)控指標(biāo)
? 端點(diǎn)描述了被監(jiān)控的信息,除了系統(tǒng)默認(rèn)的指標(biāo),還可以自行添加顯示的指標(biāo),下面就通過3種不同的端點(diǎn)的指標(biāo)自定義方式來學(xué)習(xí)端點(diǎn)信息的二次開發(fā)。
INFO端點(diǎn)
? info端點(diǎn)描述了當(dāng)前應(yīng)用的基本信息,可以通過兩種形式快速配置info端點(diǎn)的信息
配置形式
在yml文件中通過設(shè)置info節(jié)點(diǎn)的信息就可以快速配置端點(diǎn)信息
info:
#appName: @project.artifactId@
#version: @project.version@
author: hashnode
company: aaaaa
配置完畢后,對(duì)應(yīng)信息顯示在監(jiān)控平臺(tái)上
也可以通過請(qǐng)求端點(diǎn)信息路徑獲取對(duì)應(yīng)json信息
編程形式
通過配置的形式只能添加固定的數(shù)據(jù),如果需要?jiǎng)討B(tài)數(shù)據(jù)還可以通過配置bean的方式為info端點(diǎn)添加信息,此信息與配置信息共存
@Component public class InfoConfig implements InfoContributor { @Override public void contribute(Info.Builder builder) { builder.withDetail("runTime",System.currentTimeMillis()); //添加單個(gè)信息 Map infoMap = new HashMap(); infoMap.put("buildTime","2022"); builder.withDetails(infoMap); //添加一組信息 } }
Health端點(diǎn)
? health端點(diǎn)描述當(dāng)前應(yīng)用的運(yùn)行健康指標(biāo),即應(yīng)用的運(yùn)行是否成功。通過編程的形式可以擴(kuò)展指標(biāo)信息。
@Component public class HealthConfig extends AbstractHealthIndicator { @Override protected void doHealthCheck(Health.Builder builder) throws Exception { boolean condition = true; if(condition) { builder.status(Status.UP); //設(shè)置運(yùn)行狀態(tài)為啟動(dòng)狀態(tài) builder.withDetail("runTime", System.currentTimeMillis()); Map infoMap = new HashMap(); infoMap.put("buildTime", "2006"); builder.withDetails(infoMap); }else{ builder.status(Status.OUT_OF_SERVICE); //設(shè)置運(yùn)行狀態(tài)為不在服務(wù)狀態(tài) builder.withDetail("上線了嗎?","未上線"); } } }
? 當(dāng)任意一個(gè)組件狀態(tài)不為UP時(shí),整體應(yīng)用對(duì)外服務(wù)狀態(tài)為非UP狀態(tài)。
Metrics端點(diǎn)
? metrics端點(diǎn)描述了性能指標(biāo),除了系統(tǒng)自帶的監(jiān)控性能指標(biāo),還可以自定義性能指標(biāo)。
@Service public class BookServiceImpl extends ServiceImpl<BookDao, Book> implements IBookService { @Autowired private BookDao bookDao; private Counter counter; public BookServiceImpl(MeterRegistry meterRegistry){ counter = meterRegistry.counter("用戶付費(fèi)操作次數(shù):"); } @Override public boolean delete(Integer id) { //每次執(zhí)行刪除業(yè)務(wù)等同于執(zhí)行了付費(fèi)業(yè)務(wù) counter.increment(); return bookDao.deleteById(id) > 0; } }
? 在性能指標(biāo)中就出現(xiàn)了自定義的性能指標(biāo)監(jiān)控項(xiàng)
自定義端點(diǎn)
? 可以根據(jù)業(yè)務(wù)需要自定義端點(diǎn),方便業(yè)務(wù)監(jiān)控
@Component @Endpoint(id="pay",enableByDefault = true) public class PayEndpoint { @ReadOperation public Object getPay(){ Map payMap = new HashMap(); payMap.put("level 1","300"); payMap.put("level 2","291"); payMap.put("level 3","666"); return payMap; } }
? 由于此端點(diǎn)數(shù)據(jù)spirng boot admin無法預(yù)知該如何展示,所以通過界面無法看到此數(shù)據(jù),通過HTTP請(qǐng)求路徑可以獲取到當(dāng)前端點(diǎn)的信息,但是需要先開啟當(dāng)前端點(diǎn)對(duì)外功能,或者設(shè)置當(dāng)前端點(diǎn)為默認(rèn)開發(fā)的端點(diǎn)。
總結(jié)
- 端點(diǎn)的指標(biāo)可以自定義,但是每種不同的指標(biāo)根據(jù)其功能不同,自定義方式不同
- info端點(diǎn)通過配置和編程的方式都可以添加端點(diǎn)指標(biāo)
- health端點(diǎn)通過編程的方式添加端點(diǎn)指標(biāo),需要注意要為對(duì)應(yīng)指標(biāo)添加啟動(dòng)狀態(tài)的邏輯設(shè)定
- metrics指標(biāo)通過在業(yè)務(wù)中添加監(jiān)控操作設(shè)置指標(biāo)
- 可以自定義端點(diǎn)添加更多的指標(biāo)
到此這篇關(guān)于SpringBoot詳解整合Spring Boot Admin實(shí)現(xiàn)監(jiān)控功能的文章就介紹到這了,更多相關(guān)SpringBoot Spring Boot Admin內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot Excel文件導(dǎo)出下載實(shí)現(xiàn)代碼
這篇文章帶領(lǐng)我們直接實(shí)現(xiàn)Excel文件的直接導(dǎo)出下載,后續(xù)開發(fā)不需要開發(fā)很多代碼,直接繼承已經(jīng)寫好的代碼,增加一個(gè)Xml配置就可以直接導(dǎo)出。具體實(shí)現(xiàn)代碼大家跟隨小編一起通過本文學(xué)習(xí)吧2018-11-11解決idea中yml文件圖標(biāo)問題及自動(dòng)提示失效的情況
這篇文章主要介紹了解決idea中yml文件圖標(biāo)問題及自動(dòng)提示失效的情況,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01java使用BeanUtils.copyProperties踩坑經(jīng)歷
最近在做個(gè)項(xiàng)目,踩了個(gè)坑特此記錄一下,本文主要介紹了使用BeanUtils.copyProperties踩坑經(jīng)歷,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05java中BeanNotOfRequiredTypeException的問題解決(@Autowired和@Resourc
本文主要介紹了java中BeanNotOfRequiredTypeException的問題解決(@Autowired和@Resource注解的不同),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Java控制臺(tái)輸入數(shù)組并逆序輸出的方法實(shí)例
這篇文章主要介紹了Java手動(dòng)輸入數(shù)組并逆向輸出的方法實(shí)例,需要的朋友可以參考下。2017-08-08javaSystem.out.println()輸出byte[]、char[]異常的問題詳析
這篇文章主要給大家介紹了關(guān)于javaSystem.out.println()輸出byte[]、char[]異常問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看啊2019-01-01