使用?Spring?Boot?Admin?監(jiān)控應(yīng)用狀態(tài)的詳細(xì)過(guò)程
pring Boot Actuator 是 Spring Boot 提供的對(duì)應(yīng)用的自省和監(jiān)控功能,如健康檢查,審計(jì),指標(biāo)收集,HTTP 跟蹤等,可以幫助開(kāi)發(fā)和運(yùn)維人員監(jiān)控和管理 Spring Boot 應(yīng)用。該模塊采集應(yīng)用的內(nèi)部信息,并暴露給外部的模塊,支持 HTTP 和 JMX,并可以與一些第三方監(jiān)控系統(tǒng)(如 Prometheus)整合。
程序員優(yōu)雅哥 SpringBoot 2.7 實(shí)戰(zhàn)基礎(chǔ) - 11 - 使用 Spring Boot Admin 監(jiān)控應(yīng)用狀態(tài)
1 Spring Boot Actuator
Spring Boot Actuator 是 Spring Boot 提供的對(duì)應(yīng)用的自省和監(jiān)控功能,如健康檢查,審計(jì),指標(biāo)收集,HTTP 跟蹤等,可以幫助開(kāi)發(fā)和運(yùn)維人員監(jiān)控和管理 Spring Boot 應(yīng)用。該模塊采集應(yīng)用的內(nèi)部信息,并暴露給外部的模塊,支持 HTTP 和 JMX,并可以與一些第三方監(jiān)控系統(tǒng)(如 Prometheus)整合。
1.1 Actuator endpoint
端點(diǎn) Endpoint 是 Actuator 的核心組成部分,用來(lái)監(jiān)視應(yīng)用程序的各種狀態(tài)。 Spring Boot Actuator 內(nèi)置很多 Endpoint,總體上看分成三類(lèi):
應(yīng)用配置類(lèi):主要包括配置信息、Spring Bean 的信息、配置文件信息、環(huán)境信息等;度量指標(biāo)類(lèi):應(yīng)用在運(yùn)行期間的信息,包括堆棧、健康狀態(tài)、線(xiàn)程池信息、HTTP請(qǐng)求統(tǒng)計(jì)等;操作控制類(lèi):如 shutdown,提供了對(duì)應(yīng)用的關(guān)閉等操作類(lèi)功能。
1.2 添加依賴(lài)
在 pom.xml 中添加 Actuator 的 starter:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
1.3 訪(fǎng)問(wèn)端點(diǎn)
添加依賴(lài)后,啟動(dòng)服務(wù),可通過(guò)如下請(qǐng)求查看暴露的端點(diǎn):
http://localhost:9099/actuator
該請(qǐng)求返回:
{ "_links": { "self": { "href": "http://localhost:9099/actuator", "templated": false }, "health-path": { "href": "http://localhost:9099/actuator/health/{*path}", "templated": true }, "health": { "href": "http://localhost:9099/actuator/health", "templated": false } } }
從返回的結(jié)果可以看出默認(rèn)只開(kāi)放了 /actuator/health
端點(diǎn)。訪(fǎng)問(wèn)該端點(diǎn) http://localhost:9099/actuator/health
:
{"status":"UP"}
其他未開(kāi)放的端點(diǎn)可以獨(dú)立配置開(kāi)啟或禁用。
在 application.yml 中添加如下配置,開(kāi)放所有的端點(diǎn),并顯示詳細(xì)的 health:
management: endpoints: web: exposure: include: '*' endpoint: health: show-details: always
重啟服務(wù),再次查看暴露的端點(diǎn),可以看出有如下端點(diǎn):
2 Spring Boot Admin
Spring Boot Actuator 提供了各種端點(diǎn),Spring Boot Admin 能夠?qū)?Actuator 中的信息進(jìn)行界面化的展示,并提供實(shí)時(shí)報(bào)警功能。
在微服務(wù)環(huán)境中,使用 Spring Boot Admin,通常包括服務(wù)端和客戶(hù)端,服務(wù)端只運(yùn)行 Spring Boot Admin Server,收集各個(gè)客戶(hù)端的數(shù)據(jù),并以可視化界面顯示出來(lái)??蛻?hù)端運(yùn)行 Spring Boot Admin Client,或者通過(guò)服務(wù)發(fā)現(xiàn)與注冊(cè)獲取應(yīng)用的信息。
這里的 demo 我就不在 Spring Boot Admin Server了,將當(dāng)前 hero-springboot-demo 既作為 server、也作為 client 使用。在后面的實(shí)戰(zhàn)篇章中會(huì)獨(dú)立 Admin Server,同時(shí)客戶(hù)端也不使用 client,而是通過(guò)服務(wù)注冊(cè)與發(fā)現(xiàn)。
2.1 添加依賴(lài)
在 pom.xml 中添加 Spring Boot Admin Server 的依賴(lài):
<!-- 實(shí)戰(zhàn)中該依賴(lài)只在獨(dú)立的 Admin Server 中使用,此處僅為測(cè)試 --> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.7.4</version> </dependency> <!-- 實(shí)戰(zhàn)中客戶(hù)端也不需要添加該依賴(lài),而是通過(guò)服務(wù)發(fā)現(xiàn)與注冊(cè),此處僅為測(cè)試 --> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.7.4</version> </dependency>
需要注意版本號(hào),由于 Spring Boot 版本使用的是 2.7.x
,Spring Boot Admin Server 的版本也要用 2.7.x
,千萬(wàn)別亂搞!
2.2 開(kāi)啟 Admin Server
在啟動(dòng)類(lèi) DemoApplication 上添加注解 @EnableAdminServer
開(kāi)啟 Spring Boot Admin Server。
@EnableAdminServer @EnableAsync @MapperScan("com.yygnb.demo.mapper") @SpringBootApplication public class DemoApplication { ... }
2.3 配置客戶(hù)端
在 application.yml 中添加如下配置:
- 配置 Admin Server 的 context-path;
- 為客戶(hù)端配置 Admin Server 的地址。
spring: application: name: hero-springboot-demo boot: admin: client: url: 'http://localhost:9099/monitor' context-path: '/monitor'
2.4 訪(fǎng)問(wèn) Admin Server
重啟服務(wù),在瀏覽器中訪(fǎng)問(wèn) Spring Boot Admin Server:
可以看到當(dāng)前應(yīng)用的作為客戶(hù)端注冊(cè)到 Admin Server 上:
再次強(qiáng)調(diào),上述操作僅僅針對(duì)demo學(xué)習(xí),非真實(shí)的企業(yè)級(jí)開(kāi)發(fā)!
3 自定義告警
當(dāng)應(yīng)用狀態(tài)異常時(shí),Spring Boot Admin 會(huì)自動(dòng)實(shí)時(shí)告警,而告警的方式可以由我們自定義。這里模擬日志的方式。
在 config 包下創(chuàng)建類(lèi) DemoNotifier
,該類(lèi)繼承自 AbstractEventNotifier
:
@Slf4j @Component public class DemoNotifier extends AbstractEventNotifier { protected DemoNotifier(InstanceRepository repository) { super(repository); } @Override protected Mono<Void> doNotify(InstanceEvent event, Instance instance) { return Mono.fromRunnable(() -> log.error("Instance info: {}, {}, {}", instance.getRegistration().getName(), event.getInstance(), event.getType())); } }
此時(shí),注冊(cè)到這個(gè)Admin Server的其他客戶(hù)端啟動(dòng)、停止等,當(dāng)前應(yīng)用都會(huì)監(jiān)聽(tīng)到事件,輸出日志。實(shí)戰(zhàn)中可以在這里面發(fā)送郵件、消息等。
4 登錄訪(fǎng)問(wèn)
上面配置的 Admin Server 無(wú)需登錄就可以訪(fǎng)問(wèn),在真實(shí)開(kāi)發(fā)中需要登錄后才能訪(fǎng)問(wèn)。admin server 也提供了登錄頁(yè)面。
4.1 添加依賴(lài)
在 pom.xml 添加 Spring Security 的依賴(lài):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
4.2 配置用戶(hù)名密碼
在 application.yml 中配置登錄的用戶(hù)名和密碼:
spring: application: name: hero-springboot-demo boot: admin: client: url: 'http://localhost:9099/monitor' context-path: '/monitor' security: user: name: admin password: 111111
上面的配置在之前的基礎(chǔ)上增加了:spring.security.user
的配置。
4.3 添加配置類(lèi)
在 config 包下添加 Spring Security 的配置類(lèi) SecurityConfig
:
@Configuration public class SecurityConfig { private final String adminContextPath; public SecurityConfig(AdminServerProperties adminServerProperties) { this.adminContextPath = adminServerProperties.getContextPath(); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); successHandler.setTargetUrlParameter("redirectTo"); successHandler.setDefaultTargetUrl(adminContextPath + "/"); return http.authorizeHttpRequests(auth -> auth.antMatchers( adminContextPath + "/assets/**", adminContextPath + "/login", adminContextPath + "/instances", adminContextPath + "/actuator/**" ).permitAll() .antMatchers(adminContextPath + "/**").authenticated() .anyRequest().permitAll() ).formLogin(form -> form.loginPage(adminContextPath + "/login") .successHandler(successHandler) ).logout(logout -> logout.logoutUrl(adminContextPath + "/logout")) .csrf(AbstractHttpConfigurer::disable) .build(); } }
上面配置文件中的 adminContextPath 就是前面配置的 spring.boot.admin.context-path
,即 /monitor
。
上面配置包括幾個(gè)部分:
- 僅對(duì)路徑 /monitor/** 請(qǐng)求權(quán)限控制;
- 登錄頁(yè)面和登錄成功后的默認(rèn)地址;
- 表單登錄配置;
- 禁用 CSRF。
4.4 測(cè)試運(yùn)行
重啟服務(wù),訪(fǎng)問(wèn)之前開(kāi)發(fā)的 computer 等接口,可以正常訪(fǎng)問(wèn);如果訪(fǎng)問(wèn) /monitor 等路徑,就會(huì)跳轉(zhuǎn) Spring Boot Admin 提供的登錄頁(yè):
使用配置的用戶(hù)名密碼(admin/111111)登錄,登錄成功后進(jìn)入 Admin Server 頁(yè)面。
感謝你閱讀本文,如果本文給了你一點(diǎn)點(diǎn)幫助或者啟發(fā),還請(qǐng)三連支持一下,點(diǎn)贊、關(guān)注、收藏,作者會(huì)持續(xù)與大家分享更多干貨
相關(guān)文章
SpringBoot?@Configuration與@Bean注解使用介紹
這篇文章主要介紹了SpringBoot中的@Configuration與@Bean注解,在進(jìn)行項(xiàng)目編寫(xiě)前,我們還需要知道一個(gè)東西,就是SpringBoot對(duì)我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們?cè)谥笫褂貌艜?huì)更加得心應(yīng)手2022-10-10IntelliJ IDEA像Eclipse一樣打開(kāi)多個(gè)項(xiàng)目的圖文教程
這篇文章主要介紹了IntelliJ IDEA像Eclipse一樣打開(kāi)多個(gè)項(xiàng)目的方法圖文教程講解,需要的朋友可以參考下2018-03-03Java中字符串常見(jiàn)的一些拼接方式總結(jié)
字符串拼接是我們?cè)贘ava代碼中比較經(jīng)常要做的事情,就是把多個(gè)字符串拼接到一起,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java中字符串常見(jiàn)的一些拼接方式,需要的朋友可以參考下2023-04-04Java 處理超大數(shù)類(lèi)型之BigInteger案例詳解
這篇文章主要介紹了Java 處理超大數(shù)類(lèi)型之BigInteger案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09