天天看點

使用 Spring Boot Admin 監控應用狀态

作者:馬士兵教育CTO
使用 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,總體上看分成三類:

  1. 應用配置類:主要包括配置資訊、Spring Bean 的資訊、配置檔案資訊、環境資訊等;
  2. 度量名額類:應用在運作期間的資訊,包括堆棧、健康狀态、線程池資訊、HTTP請求統計等;
  3. 操作控制類:如 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
複制代碼           

重新開機服務,再次檢視暴露的端點,可以看出有如下端點:

使用 Spring Boot Admin 監控應用狀态

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 中添加如下配置:

  1. 配置 Admin Server 的 context-path;
  2. 為用戶端配置 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 上:

使用 Spring Boot Admin 監控應用狀态

再次強調,上述操作僅僅針對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。

上面配置包括幾個部分:

  1. 僅對路徑 /monitor/** 請求權限控制;
  2. 登入頁面和登入成功後的預設位址;
  3. 表單登入配置;
  4. 禁用 CSRF。

4.4 測試運作

重新開機服務,通路之前開發的 computer 等接口,可以正常通路;如果通路 /monitor 等路徑,就會跳轉 Spring Boot Admin 提供的登入頁:

使用 Spring Boot Admin 監控應用狀态

使用配置的使用者名密碼(admin/111111)登入,登入成功後進入 Admin Server 頁面。

繼續閱讀