SpringBoot詳解整合Spring?Boot?Admin實(shí)現(xiàn)監(jiān)控功能
監(jiān)控
? 在說(shuō)監(jiān)控之前,需要回顧一下軟件業(yè)的發(fā)展史。最早的軟件完成一些非常簡(jiǎn)單的功能,代碼不多,錯(cuò)誤也少。隨著軟件功能的逐步完善,軟件的功能變得越來(lái)越復(fù)雜,功能不能得到有效的保障,這個(gè)階段出現(xiàn)了針對(duì)軟件功能的檢測(cè),也就是軟件測(cè)試。伴隨著計(jì)算機(jī)操作系統(tǒng)的逐步升級(jí),軟件的運(yùn)行狀態(tài)也變得開(kāi)始讓人捉摸不透,出現(xiàn)了不穩(wěn)定的狀況。伴隨著計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展,程序也從單機(jī)狀態(tài)切換成基于計(jì)算機(jī)網(wǎng)絡(luò)的程序,應(yīng)用于網(wǎng)絡(luò)的程序開(kāi)始出現(xiàn),由于網(wǎng)絡(luò)的不穩(wěn)定性,程序的運(yùn)行狀態(tài)讓使用者更加堪憂。互聯(lián)網(wǎng)的出現(xiàn)徹底打破了軟件的思維模式,隨之而來(lái)的互聯(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)控?就是通過(guò)軟件的方式展示另一個(gè)軟件的運(yùn)行情況,運(yùn)行的情況則通過(guò)各種各樣的指標(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)控軟件的開(kāi)發(fā),springboot提供了一套功能接口,為開(kāi)發(fā)者加速開(kāi)發(fā)過(guò)程。
監(jiān)控的意義
? 對(duì)于現(xiàn)代的互聯(lián)網(wǎng)程序來(lái)說(shuō),規(guī)模越來(lái)越大,功能越來(lái)越復(fù)雜,還要追求更好的客戶體驗(yàn),因此要監(jiān)控的信息量也就比較大了。由于現(xiàn)在的互聯(lián)網(wǎng)程序大部分都是基于微服務(wù)的程序,一個(gè)程序的運(yùn)行需要若干個(gè)服務(wù)來(lái)保障,因此第一個(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)求無(wú)法及時(shí)響應(yīng)處理等,這就是第二個(gè)要監(jiān)控的重要指標(biāo),監(jiān)控服務(wù)運(yùn)行指標(biāo)。雖然軟件是對(duì)外提供用戶的訪問(wèn)需求,完成對(duì)應(yīng)功能的,但是后臺(tái)的運(yùn)行是否平穩(wěn),是否出現(xiàn)了不影響客戶使用的功能隱患,這些也是要密切監(jiān)控的,此時(shí)就需要在不停機(jī)的情況下,監(jiān)控系統(tǒng)運(yùn)行情況,日志是一個(gè)不錯(cuò)的手段。如果在眾多日志中找到開(kāi)發(fā)者或運(yùn)維人員所關(guān)注的日志信息,簡(jiǎn)單快速有效的過(guò)濾出要看的日志也是監(jiān)控系統(tǒng)需要考慮的問(wèn)題,這就是第三個(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)行過(guò)程中不可回避的問(wèn)題,這就是第四個(gè)監(jiān)控項(xiàng),管理服務(wù)狀態(tài)。以上這些僅僅是從大的方面來(lái)思考監(jiān)控這個(gè)問(wèn)題,還有很多的細(xì)節(jié)點(diǎn),例如上線了一個(gè)新功能,定時(shí)提醒用戶續(xù)費(fèi),這種功能不是上線后馬上就運(yùn)行的,但是當(dāng)前功能是否真的啟動(dòng),如果快速的查詢到這個(gè)功能已經(jīng)開(kāi)啟,這也是監(jiān)控中要解決的問(wèn)題,等等??磥?lái)監(jiān)控真的是一項(xiàng)非常重要的工作。
? 通過(guò)上述描述,可以看出監(jiān)控很重要。那具體的監(jiān)控要如何開(kāi)展呢?還要從實(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è)呢?看來(lái)必須有一個(gè)單獨(dú)的平臺(tái),將多個(gè)被監(jiān)控的服務(wù)對(duì)應(yīng)的監(jiān)控指標(biāo)信息匯總在一起,這樣更利于監(jiān)控工作的開(kāi)展。

? 新的程序?qū)iT用來(lái)監(jiān)控,新的問(wèn)題就出現(xiàn)了,是被監(jiān)控程序主動(dòng)上報(bào)信息還是監(jiān)控程序主動(dòng)獲取信息?如果監(jiān)控程序不能主動(dòng)獲取信息,這就意味著監(jiān)控程序有可能看到的是很久之前被監(jiān)控程序上報(bào)的信息,萬(wàn)一被監(jiān)控程序宕機(jī)了,監(jiān)控程序就無(wú)法區(qū)分究竟是好久沒(méi)法信息了,還是已經(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)控誰(shuí),這樣互聯(lián)網(wǎng)上的所有程序豈不是都可以被監(jiān)控到,這樣的話信息安全將無(wú)法得到保障。合理的做法只能是在被監(jiān)控程序啟動(dòng)時(shí)上報(bào)監(jiān)控程序,告訴監(jiān)控程序你可以監(jiān)控我了??磥?lái)需要在被監(jiān)控程序端做主動(dòng)上報(bào)的操作,這就要求被監(jiān)控程序中配置對(duì)應(yīng)的監(jiān)控程序是誰(shuí)。

? 被監(jiān)控程序可以提供各種各樣的指標(biāo)數(shù)據(jù)給監(jiān)控程序看,但是每一個(gè)指標(biāo)都代表著公司的機(jī)密信息,并不是所有的指標(biāo)都可以給任何人看的,乃至運(yùn)維人員,所以對(duì)被監(jiān)控指標(biāo)的是否開(kāi)放出來(lái)給監(jiān)控系統(tǒng)看,也需要做詳細(xì)的設(shè)定。
? 以上描述的整個(gè)過(guò)程就是一個(gè)監(jiān)控系統(tǒng)的基本流程。
總結(jié)
- 監(jiān)控是一個(gè)非常重要的工作,是保障程序正常運(yùn)行的基礎(chǔ)手段
- 監(jiān)控的過(guò)程通過(guò)一個(gè)監(jiān)控程序進(jìn)行,它匯總所有被監(jiān)控的程序的信息集中統(tǒng)一展示
- 被監(jiān)控程序需要主動(dòng)上報(bào)自己被監(jiān)控,同時(shí)要設(shè)置哪些指標(biāo)被監(jiān)控
思考
? 下面就要開(kāi)始做監(jiān)控了,新的問(wèn)題就來(lái)了,監(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è)開(kāi)源社區(qū)項(xiàng)目,用于管理和監(jiān)控SpringBoot應(yīng)用程序。這個(gè)項(xiàng)目中包含有客戶端和服務(wù)端兩部分,而監(jiān)控平臺(tái)指的就是服務(wù)端。我們做的程序如果需要被監(jiān)控,將我們做的程序制作成客戶端,然后配置服務(wù)端地址后,服務(wù)端就可以通過(guò)HTTP請(qǐng)求的方式從客戶端獲取對(duì)應(yīng)的信息,并通過(guò)UI界面展示對(duì)應(yīng)信息。
? 下面就來(lái)開(kāi)發(fā)這套監(jiān)控程序,先制作服務(wù)端,其實(shí)服務(wù)端可以理解為是一個(gè)web程序,收到一些信息后展示這些信息。
服務(wù)端開(kāi)發(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>? 上述過(guò)程可以通過(guò)創(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ù)器就開(kāi)發(fā)好了,啟動(dòng)后就可以訪問(wèn)當(dāng)前程序了,界面如下。

? 由于目前沒(méi)有啟動(dòng)任何被監(jiān)控的程序,所以里面什么信息都沒(méi)有。下面制作一個(gè)被監(jiān)控的客戶端程序。
客戶端開(kāi)發(fā)
? 客戶端程序開(kāi)發(fā)其實(shí)和服務(wù)端開(kāi)發(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>
? 上述過(guò)程也可以通過(guò)創(chuàng)建項(xiàng)目時(shí)使用勾選的形式完成,不過(guò)一定要小心,端口配置成不一樣的,否則會(huì)沖突。
步驟②:設(shè)置當(dāng)前客戶端將信息上傳到哪個(gè)服務(wù)器上,通過(guò)yml文件配置
spring:
boot:
admin:
client:
url: http://localhost:8080
? 做到這里,這個(gè)客戶端就可以啟動(dòng)了。啟動(dòng)后再次訪問(wèn)服務(wù)端程序,界面如下。

? 可以看到,當(dāng)前監(jiān)控了1個(gè)程序,點(diǎn)擊進(jìn)去查看詳細(xì)信息。

? 由于當(dāng)前沒(méi)有設(shè)置開(kāi)放哪些信息給監(jiān)控服務(wù)器,所以目前看不到什么有效的信息。下面需要做兩組配置就可以看到信息了。
開(kāi)放指定信息給服務(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é)者來(lái)說(shuō)比較容易混淆。簡(jiǎn)單解釋一下,到下一節(jié)再做具體的講解。springbootadmin的客戶端默認(rèn)開(kāi)放了13組信息給服務(wù)器,但是這些信息除了一個(gè)之外,其他的信息都不讓通過(guò)HTTP請(qǐng)求查看。所以你看到的信息基本上就沒(méi)什么內(nèi)容了,只能看到一個(gè)內(nèi)容,就是下面的健康信息。

? 但是即便如此我們看到健康信息中也沒(méi)什么內(nèi)容,原因在于健康信息中有一些信息描述了你當(dāng)前應(yīng)用使用了什么技術(shù)等信息,如果無(wú)腦的對(duì)外暴露功能會(huì)有安全隱患。通過(guò)配置就可以開(kāi)放所有的健康信息明細(xì)查看了。
management:
endpoint:
health:
show-details: always
? 健康明細(xì)信息如下:

? 目前除了健康信息,其他信息都查閱不了。原因在于其他12種信息是默認(rèn)不提供給服務(wù)器通過(guò)HTTP請(qǐng)求查閱的,所以需要開(kāi)啟查閱的內(nèi)容項(xiàng),使用*表示查閱全部。記得帶引號(hào)。
endpoints:
web:
exposure:
include: "*"
? 配置后再刷新服務(wù)器頁(yè)面,就可以看到所有的信息了。

? 以上界面中展示的信息量就非常大了,包含了13組信息,有性能指標(biāo)監(jiān)控,加載的bean列表,加載的系統(tǒng)屬性,日志的顯示控制等等。
配置多個(gè)客戶端
? 可以通過(guò)配置客戶端的方式在其他的springboot程序中添加客戶端坐標(biāo),這樣當(dāng)前服務(wù)器就可以監(jiān)控多個(gè)客戶端程序了。每個(gè)客戶端展示不同的監(jiān)控信息。

? 進(jìn)入監(jiān)控面板,如果你加載的應(yīng)用具有功能,在監(jiān)控面板中可以看到3組信息展示的與之前加載的空工程不一樣。
類加載面板中可以查閱到開(kāi)發(fā)者自定義的類:


映射中可以查閱到當(dāng)前應(yīng)用配置的所有請(qǐng)求


性能指標(biāo)中可以查閱當(dāng)前應(yīng)用獨(dú)有的請(qǐng)求路徑統(tǒng)計(jì)數(shù)據(jù)


總結(jié)
- 開(kāi)發(fā)監(jiān)控服務(wù)端需要導(dǎo)入坐標(biāo),然后在引導(dǎo)類上添加注解@EnableAdminServer,并將其配置成web程序即可
- 開(kāi)發(fā)被監(jiān)控的客戶端需要導(dǎo)入坐標(biāo),然后配置服務(wù)端服務(wù)器地址,并做開(kāi)放指標(biāo)的設(shè)定即可
- 在監(jiān)控平臺(tái)中可以查閱到各種各樣被監(jiān)控的指標(biāo),前提是客戶端開(kāi)放了被監(jiān)控的指標(biāo)
思考
? 之前說(shuō)過(guò),服務(wù)端要想監(jiān)控客戶端,需要主動(dòng)的獲取到對(duì)應(yīng)信息并展示出來(lái)。但是目前我們并沒(méi)有在客戶端開(kāi)發(fā)任何新的功能,但是服務(wù)端確可以獲取監(jiān)控信息,誰(shuí)幫我們做的這些功能呢?咱們下一節(jié)再講。
監(jiān)控原理
? 通過(guò)查閱監(jiān)控中的映射指標(biāo),可以看到當(dāng)前系統(tǒng)中可以運(yùn)行的所有請(qǐng)求路徑,其中大部分路徑以/actuator開(kāi)頭

? 首先這些請(qǐng)求路徑不是開(kāi)發(fā)者自己編寫的,其次這個(gè)路徑代表什么含義呢?既然這個(gè)路徑可以訪問(wèn),就可以通過(guò)瀏覽器發(fā)送該請(qǐng)求看看究竟可以得到什么信息。

? 通過(guò)發(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)求路徑中有之前看到過(guò)的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)系

? 原來(lái)監(jiān)控中顯示的信息實(shí)際上是通過(guò)發(fā)送請(qǐng)求后得到j(luò)son數(shù)據(jù),然后展示出來(lái)。按照上述操作,可以發(fā)送更多的以/actuator開(kāi)頭的鏈接地址,獲取更多的數(shù)據(jù),這些數(shù)據(jù)匯總到一起組成了監(jiān)控平臺(tái)顯示的所有數(shù)據(jù)。
? 到這里我們得到了一個(gè)核心信息,監(jiān)控平臺(tái)中顯示的信息實(shí)際上是通過(guò)對(duì)被監(jiān)控的應(yīng)用發(fā)送請(qǐng)求得到的。那這些請(qǐng)求誰(shuí)開(kāi)發(fā)的呢?打開(kāi)被監(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),通過(guò)訪問(wèn)端點(diǎn)就可以獲取對(duì)應(yīng)的監(jiān)控信息,也可以根據(jù)需要自定義端點(diǎn)信息。通過(guò)發(fā)送請(qǐng)求路勁**/actuator可以訪問(wèn)應(yīng)用所有端點(diǎn)信息,如果端點(diǎn)中還有明細(xì)信息可以發(fā)送請(qǐng)求/actuator/端點(diǎn)名稱**來(lái)獲取詳細(xì)信息。以下列出了所有端點(diǎn)信息說(shuō)明:
用所有端點(diǎn)信息,如果端點(diǎn)中還有明細(xì)信息可以發(fā)送請(qǐng)求/actuator/端點(diǎn)名稱**來(lái)獲取詳細(xì)信息。以下列出了所有端點(diǎn)信息說(shuō)明:
| 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ù)庫(kù)遷移。 | 是 |
| 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ù)庫(kù)遷移。 | 是 |
| 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 | 通過(guò) HTTP 暴露 JMX bean(當(dāng) Jolokia 在 classpath 上時(shí),不適用于 WebFlux)。 | 是 |
| logfile | 返回日志文件的內(nèi)容(如果已設(shè)置 logging.file 或 logging.path 屬性)。支持使用 HTTP Range 頭來(lái)檢索部分日志文件的內(nèi)容。 | 是 |
| prometheus | 以可以由 Prometheus 服務(wù)器抓取的格式暴露指標(biāo)。 | 是 |
? 上述端點(diǎn)每一項(xiàng)代表被監(jiān)控的指標(biāo),如果對(duì)外開(kāi)放則監(jiān)控平臺(tái)可以查詢到對(duì)應(yīng)的端點(diǎn)信息,如果未開(kāi)放則無(wú)法查詢對(duì)應(yīng)的端點(diǎn)信息。通過(guò)配置可以設(shè)置端點(diǎn)是否對(duì)外開(kāi)放功能。使用enable屬性控制端點(diǎn)是否對(duì)外開(kāi)放。其中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 # 是否開(kāi)放
? 為了方便開(kāi)發(fā)者快速配置端點(diǎn),springboot admin設(shè)置了13個(gè)較為常用的端點(diǎn)作為默認(rèn)開(kāi)放的端點(diǎn),如果需要控制默認(rèn)開(kāi)放的端點(diǎn)的開(kāi)放狀態(tài),可以通過(guò)配置設(shè)置,如下:
management:
endpoints:
enabled-by-default: true # 是否開(kāi)啟默認(rèn)端點(diǎn),默認(rèn)值true
? 上述端點(diǎn)開(kāi)啟后,就可以通過(guò)端點(diǎn)對(duì)應(yīng)的路徑查看對(duì)應(yīng)的信息了。但是此時(shí)還不能通過(guò)HTTP請(qǐng)求查詢此信息,還需要開(kāi)啟通過(guò)HTTP請(qǐng)求查詢的端點(diǎn)名稱,使用“*”可以簡(jiǎn)化配置成開(kāi)放所有端點(diǎn)的WEB端HTTP請(qǐng)求權(quán)限。
management:
endpoints:
web:
exposure:
include: "*"
? 整體上來(lái)說(shuō),對(duì)于端點(diǎn)的配置有兩組信息,一組是endpoints開(kāi)頭的,對(duì)所有端點(diǎn)進(jìn)行配置,一組是endpoint開(kāi)頭的,對(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)控客戶端通過(guò)添加actuator的坐標(biāo)可以對(duì)外提供被訪問(wèn)的端點(diǎn)功能
- 端點(diǎn)功能的開(kāi)放與關(guān)閉可以通過(guò)配置進(jìn)行控制
- web端默認(rèn)無(wú)法獲取所有端點(diǎn)信息,通過(guò)配置開(kāi)放端點(diǎn)功能
自定義監(jiān)控指標(biāo)
? 端點(diǎn)描述了被監(jiān)控的信息,除了系統(tǒng)默認(rèn)的指標(biāo),還可以自行添加顯示的指標(biāo),下面就通過(guò)3種不同的端點(diǎn)的指標(biāo)自定義方式來(lái)學(xué)習(xí)端點(diǎn)信息的二次開(kāi)發(fā)。
INFO端點(diǎn)
? info端點(diǎn)描述了當(dāng)前應(yīng)用的基本信息,可以通過(guò)兩種形式快速配置info端點(diǎn)的信息
配置形式
在yml文件中通過(guò)設(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)上

也可以通過(guò)請(qǐng)求端點(diǎn)信息路徑獲取對(duì)應(yīng)json信息
編程形式
通過(guò)配置的形式只能添加固定的數(shù)據(jù),如果需要?jiǎng)討B(tài)數(shù)據(jù)還可以通過(guò)配置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)行是否成功。通過(guò)編程的形式可以擴(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無(wú)法預(yù)知該如何展示,所以通過(guò)界面無(wú)法看到此數(shù)據(jù),通過(guò)HTTP請(qǐng)求路徑可以獲取到當(dāng)前端點(diǎn)的信息,但是需要先開(kāi)啟當(dāng)前端點(diǎn)對(duì)外功能,或者設(shè)置當(dāng)前端點(diǎn)為默認(rèn)開(kāi)發(fā)的端點(diǎn)。

總結(jié)
- 端點(diǎn)的指標(biāo)可以自定義,但是每種不同的指標(biāo)根據(jù)其功能不同,自定義方式不同
- info端點(diǎn)通過(guò)配置和編程的方式都可以添加端點(diǎn)指標(biāo)
- health端點(diǎn)通過(guò)編程的方式添加端點(diǎn)指標(biāo),需要注意要為對(duì)應(yīng)指標(biāo)添加啟動(dòng)狀態(tài)的邏輯設(shè)定
- metrics指標(biāo)通過(guò)在業(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)文章
Java?ThreadPoolExecutor線程池有關(guān)介紹
這篇文章主要介紹了Java?ThreadPoolExecutor線程池有關(guān)介紹,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Maven中exec插件執(zhí)行Java程序的實(shí)現(xiàn)
在Maven項(xiàng)目中,可以使用Maven的插件來(lái)執(zhí)行Java程序,本文主要介紹了Maven中exec插件執(zhí)行Java程序的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
Java微服務(wù)分布式調(diào)度Elastic-job環(huán)境搭建及配置
Elastic-Job在配置中提供了JobEventConfiguration,支持?jǐn)?shù)據(jù)庫(kù)方式配置,會(huì)在數(shù)據(jù)庫(kù)中自動(dòng)創(chuàng)建JOB_EXECUTION_LOG和JOB_STATUS_TRACE_LOG兩張表以及若干索引,來(lái)記錄作業(yè)的相關(guān)信息2023-02-02
Java中StringBuilder與StringBuffer的區(qū)別
在Java編程中,字符串的拼接是一項(xiàng)常見(jiàn)的操作。為了有效地處理字符串的拼接需求,Java提供了兩個(gè)主要的類:StringBuilder和StringBuffer,本文主要介紹了Java中StringBuilder與StringBuffer的區(qū)別,感興趣的可以了解一下2023-08-08
如何解決idea的Translation插件google翻譯無(wú)法使用問(wèn)題
這篇文章主要介紹了如何解決idea的Translation插件google翻譯無(wú)法使用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Java中@DateTimeFormat和@JsonFormat注解介紹
@DateTimeFormat和@JsonFormat都是處理時(shí)間格式化問(wèn)題的,把其他類型轉(zhuǎn)換成自己需要的時(shí)間類型,下面這篇文章主要給大家介紹了關(guān)于Java中@DateTimeFormat和@JsonFormat注解介紹的相關(guān)資料,需要的朋友可以參考下2022-11-11
Springboot基于BCrypt非對(duì)稱加密字符串的實(shí)現(xiàn)
本文主要介紹了Springboot基于BCrypt非對(duì)稱加密字符串的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
springboot+vue實(shí)現(xiàn)websocket配置過(guò)程解析
這篇文章主要介紹了springboot+vue實(shí)現(xiàn)websocket配置過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

