亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot詳解整合Spring?Boot?Admin實(shí)現(xiàn)監(jiān)控功能

 更新時(shí)間:2022年07月05日 09:28:33   作者:不知名架構(gòu)師  
這篇文章主要介紹了SpringBoot整合Spring?Boot?Admin實(shí)現(xiàn)服務(wù)監(jiān)控,內(nèi)容包括Server端服務(wù)開發(fā),Client端服務(wù)開發(fā)其中Spring?Boot?Admin還可以對(duì)其監(jiān)控的服務(wù)提供告警功能,如服務(wù)宕機(jī)時(shí),可以及時(shí)以郵件方式通知運(yù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)代碼

    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)提示失效的情況

    這篇文章主要介紹了解決idea中yml文件圖標(biāo)問題及自動(dòng)提示失效的情況,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Mysql字段和java實(shí)體類屬性類型匹配方式

    Mysql字段和java實(shí)體類屬性類型匹配方式

    這篇文章主要介紹了Mysql字段和java實(shí)體類屬性類型匹配方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java使用BeanUtils.copyProperties踩坑經(jīng)歷

    java使用BeanUtils.copyProperties踩坑經(jīng)歷

    最近在做個(gè)項(xiàng)目,踩了個(gè)坑特此記錄一下,本文主要介紹了使用BeanUtils.copyProperties踩坑經(jīng)歷,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • java中BeanNotOfRequiredTypeException的問題解決(@Autowired和@Resource注解的不同)

    java中BeanNotOfRequiredTypeException的問題解決(@Autowired和@Resourc

    本文主要介紹了java中BeanNotOfRequiredTypeException的問題解決(@Autowired和@Resource注解的不同),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Spring框架實(shí)現(xiàn)依賴注入的原理

    Spring框架實(shí)現(xiàn)依賴注入的原理

    依賴注入是由“依賴”和“注入”兩個(gè)詞匯組合而成,那么我們?cè)僖淮雾樚倜?,分別分析這兩個(gè)詞語,這篇文章主要介紹了Spring DI依賴注入詳解,需要的朋友可以參考下
    2023-04-04
  • Java中map內(nèi)部存儲(chǔ)方式解析

    Java中map內(nèi)部存儲(chǔ)方式解析

    這篇文章主要介紹了Java中map內(nèi)部存儲(chǔ)方式解析的相關(guān)內(nèi)容,涉及其實(shí)現(xiàn)方式,以及對(duì)存儲(chǔ)方式作了簡單的比較,具有一定參考價(jià)值,需要的朋友可了解下。
    2017-10-10
  • Java控制臺(tái)輸入數(shù)組并逆序輸出的方法實(shí)例

    Java控制臺(tái)輸入數(shù)組并逆序輸出的方法實(shí)例

    這篇文章主要介紹了Java手動(dòng)輸入數(shù)組并逆向輸出的方法實(shí)例,需要的朋友可以參考下。
    2017-08-08
  • Java并發(fā)編程之對(duì)象的共享

    Java并發(fā)編程之對(duì)象的共享

    這篇文章主要介紹了Java并發(fā)編程之對(duì)象的共享,介紹如何共享和發(fā)布對(duì)象,使它們被安全地由多個(gè)進(jìn)程訪問。需要的小伙伴可以參考一下
    2022-04-04
  • javaSystem.out.println()輸出byte[]、char[]異常的問題詳析

    javaSystem.out.println()輸出byte[]、char[]異常的問題詳析

    這篇文章主要給大家介紹了關(guān)于javaSystem.out.println()輸出byte[]、char[]異常問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看啊
    2019-01-01

最新評(píng)論