pring Boot Actuator 是 Spring Boot 提供的對應用的自省和監控功能,如健康檢查,審計,指標收集,HTTP 跟蹤等,可以幫助開發和運維人員監控和管理 Spring Boot 應用。該模塊採集應用的內部信息,並暴露給外部的模塊,支持 HTTP 和 JMX,並可以與一些第三方... ...
程式員優雅哥 SpringBoot 2.7 實戰基礎 - 11 - 使用 Spring Boot Admin 監控應用狀態
1 Spring Boot Actuator
Spring Boot Actuator 是 Spring Boot 提供的對應用的自省和監控功能,如健康檢查,審計,指標收集,HTTP 跟蹤等,可以幫助開發和運維人員監控和管理 Spring Boot 應用。該模塊採集應用的內部信息,並暴露給外部的模塊,支持 HTTP 和 JMX,並可以與一些第三方監控系統(如 Prometheus)整合。
1.1 Actuator endpoint
端點 Endpoint 是 Actuator 的核心組成部分,用來監視應用程式的各種狀態。 Spring Boot Actuator 內置很多 Endpoint,總體上看分成三類:
- 應用配置類:主要包括配置信息、Spring Bean 的信息、配置文件信息、環境信息等;
- 度量指標類:應用在運行期間的信息,包括堆棧、健康狀態、線程池信息、HTTP請求統計等;
- 操作控制類:如 shutdown,提供了對應用的關閉等操作類功能。
1.2 添加依賴
在 pom.xml 中添加 Actuator 的 starter:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
1.3 訪問端點
添加依賴後,啟動服務,可通過如下請求查看暴露的端點:
http://localhost:9099/actuator
該請求返回:
{
"_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
}
}
}
從返回的結果可以看出預設只開放了 /actuator/health
端點。訪問該端點 http://localhost:9099/actuator/health
:
{"status":"UP"}
其他未開放的端點可以獨立配置開啟或禁用。
在 application.yml 中添加如下配置,開放所有的端點,並顯示詳細的 health:
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
重啟服務,再次查看暴露的端點,可以看出有如下端點:
2 Spring Boot Admin
Spring Boot Actuator 提供了各種端點,Spring Boot Admin 能夠將 Actuator 中的信息進行界面化的展示,並提供實時報警功能。
在微服務環境中,使用 Spring Boot Admin,通常包括服務端和客戶端,服務端只運行 Spring Boot Admin Server,收集各個客戶端的數據,並以可視化界面顯示出來。客戶端運行 Spring Boot Admin Client,或者通過服務發現與註冊獲取應用的信息。
這裡的 demo 我就不在 Spring Boot Admin Server了,將當前 hero-springboot-demo 既作為 server、也作為 client 使用。在後面的實戰篇章中會獨立 Admin Server,同時客戶端也不使用 client,而是通過服務註冊與發現。
2.1 添加依賴
在 pom.xml 中添加 Spring Boot Admin Server 的依賴:
<!-- 實戰中該依賴只在獨立的 Admin Server 中使用,此處僅為測試 -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.7.4</version>
</dependency>
<!-- 實戰中客戶端也不需要添加該依賴,而是通過服務發現與註冊,此處僅為測試 -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.7.4</version>
</dependency>
需要註意版本號,由於 Spring Boot 版本使用的是 2.7.x
,Spring Boot Admin Server 的版本也要用 2.7.x
,千萬別亂搞!
2.2 開啟 Admin Server
在啟動類 DemoApplication 上添加註解 @EnableAdminServer
開啟 Spring Boot Admin Server。
@EnableAdminServer
@EnableAsync
@MapperScan("com.yygnb.demo.mapper")
@SpringBootApplication
public class DemoApplication {
...
}
2.3 配置客戶端
在 application.yml 中添加如下配置:
- 配置 Admin Server 的 context-path;
- 為客戶端配置 Admin Server 的地址。
spring:
application:
name: hero-springboot-demo
boot:
admin:
client:
url: 'http://localhost:9099/monitor'
context-path: '/monitor'
2.4 訪問 Admin Server
重啟服務,在瀏覽器中訪問 Spring Boot Admin Server:
http://localhost:9099/monitor
可以看到當前應用的作為客戶端註冊到 Admin Server 上:
再次強調,上述操作僅僅針對demo學習,非真實的企業級開發!
3 自定義告警
當應用狀態異常時,Spring Boot Admin 會自動實時告警,而告警的方式可以由我們自定義。這裡模擬日誌的方式。
在 config 包下創建類 DemoNotifier
,該類繼承自 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()));
}
}
此時,註冊到這個Admin Server的其他客戶端啟動、停止等,當前應用都會監聽到事件,輸出日誌。實戰中可以在這裡面發送郵件、消息等。
4 登錄訪問
上面配置的 Admin Server 無需登錄就可以訪問,在真實開發中需要登錄後才能訪問。admin server 也提供了登錄頁面。
4.1 添加依賴
在 pom.xml 添加 Spring Security 的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
4.2 配置用戶名密碼
在 application.yml 中配置登錄的用戶名和密碼:
spring:
application:
name: hero-springboot-demo
boot:
admin:
client:
url: 'http://localhost:9099/monitor'
context-path: '/monitor'
security:
user:
name: admin
password: 111111
上面的配置在之前的基礎上增加了:spring.security.user
的配置。
4.3 添加配置類
在 config 包下添加 Spring Security 的配置類 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
。
上面配置包括幾個部分:
- 僅對路徑 /monitor/** 請求許可權控制;
- 登錄頁面和登錄成功後的預設地址;
- 表單登錄配置;
- 禁用 CSRF。
4.4 測試運行
重啟服務,訪問之前開發的 computer 等介面,可以正常訪問;如果訪問 /monitor 等路徑,就會跳轉 Spring Boot Admin 提供的登錄頁:
使用配置的用戶名密碼(admin/111111)登錄,登錄成功後進入 Admin Server 頁面。
感謝你閱讀本文,如果本文給了你一點點幫助或者啟發,還請三連支持一下,點贊、關註、收藏,作者會持續與大家分享更多乾貨