首頁 > 軟體

Spring boot admin 服務監控利器詳解

2022-08-04 22:07:34

一、簡介

用於對 Spring Boot 應用的管理和監控。可以用來監控服務是否健康、是否線上、以及一些jvm資料等等。
Spring Boot Admin 分為伺服器端(spring-boot-admin-server)和使用者端(spring-boot-admin-client),伺服器端和使用者端之間採用 http 通訊方式實現資料互動;單體專案中需要整合 spring-boot-admin-client 才能讓應用被監控。
在 SpringCloud 專案中,spring-boot-admin-server 是直接從註冊中心抓取應用資訊,不需要每個微服務應用整合 spring-boot-admin-client 就可以實現應用的管理和監控。

主要的功能點有:

  • 顯示應用程式的監控狀態
  • 應用程式上下線監控
  • 檢視 JVM,執行緒資訊
  • 視覺化的檢視紀錄檔以及下載紀錄檔檔案
  • 動態切換紀錄檔級別
  • Http 請求資訊跟蹤

二、搭建

1、伺服器端

需先搭建伺服器端,監控服務,被監控的服務連線過來即可,開箱即用。

1、新建一個專案做為伺服器端
2、引入spring-boot-admin伺服器端依賴

	  <!--用於檢查系統的監控情況-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>
  <!--Spring Boot Admin Server監控伺服器端-->
 <dependency>
     <groupId>de.codecentric</groupId>
     <artifactId>spring-boot-admin-starter-server</artifactId>
     <version>2.3.1</version>
 </dependency>
   <!--增加安全防護,防止別人隨便進-->
 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
  </dependency>

3、啟動類上開啟admin@EnableAdminServer

4、security安全防護設定

import de.codecentric.boot.admin.server.config.AdminServerProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {

    private final String adminContextPath;

    public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
        this.adminContextPath = adminServerProperties.getContextPath();
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 登入成功處理類
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(adminContextPath + "/");

        http.authorizeRequests()
                //靜態檔案允許存取
                .antMatchers(adminContextPath + "/assets/**").permitAll()
                //登入頁面允許存取
                .antMatchers(adminContextPath + "/login", "/css/**", "/js/**", "/image/*").permitAll()
                //其他所有請求需要登入
                .anyRequest().authenticated()
                .and()
                //登入頁面設定,用於替換security預設頁面
                .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
                //登出頁面設定,用於替換security預設頁面
                .logout().logoutUrl(adminContextPath + "/logout").and()
                .httpBasic().and()
                .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                .ignoringAntMatchers(
                        "/instances",
                        "/actuator/**"
                );
    }
}

5、yml設定

server:
  port: 9111
spring:
  boot:
    admin:
      ui:
        title: HMB服務監控中心
      client:
        instance:
          metadata:
            tags:
              environment: local
         #要獲取的client的端點資訊
      probed-endpoints: health,env,metrics,httptrace:trace,threaddump:dump,jolokia,info,logfile,refresh,flyway,liquibase,heapdump,loggers,auditevents
      monitor: # 監控傳送請求的超時時間
        default-timeout: 20000
  security: # 設定賬號密碼
    user:
      name: admin
      password: admin
# 伺服器端點詳細監控資訊
management:   
  trace:
    http:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always

6、啟動專案

存取 http://ip:埠,

如我的http://localhost:9111,賬號密碼都是admin(上面的security配的)

7、自定義服務狀態變化後,提醒功能

import de.codecentric.boot.admin.server.domain.entities.Instance;
import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
import de.codecentric.boot.admin.server.domain.events.InstanceEvent;
import de.codecentric.boot.admin.server.notify.AbstractStatusChangeNotifier;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

@Component
public class WarnNotifier extends AbstractStatusChangeNotifier {
	public WarnNotifier(InstanceRepository repository) {
		super(repository);
	}

	@Override
	protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
		// 服務名
		String serviceName = instance.getRegistration().getName();
		// 服務url
		String serviceUrl = instance.getRegistration().getServiceUrl();
		// 服務狀態
		String status = instance.getStatusInfo().getStatus();
		// 詳情
		Map<String, Object> details = instance.getStatusInfo().getDetails();
		// 當前服務掉線時間
		Date date = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String format = simpleDateFormat.format(date);
		// 拼接簡訊內容
		StringBuilder str = new StringBuilder();
		str.append("服務名:【" + serviceName + "】 rn");
		str.append("服務狀態:【"+ status +"】 rn");
		str.append("地址:【" + serviceUrl + "】rn");
		str.append("時間:" + format +"rn");

		return Mono.fromRunnable(()->{
			// 這裡寫你服務發生改變時,要提醒的方法
			// 如服務掉線了,就傳送簡訊告知
		});
	}
}

8、伺服器端設定

設定預設引數解釋
spring.boot.admin.context-path/server端的存取路徑
spring.boot.admin.monitor.status-interval10,000ms檢查範例狀態的時間間隔。

2、使用者端

被監控的服務,需要連線伺服器端

1、依賴

 <dependency>
     <groupId>de.codecentric</groupId>
     <artifactId>spring-boot-admin-starter-client</artifactId>
     <version>2.3.1</version>
 </dependency>
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>

2、yml設定

server:
  port: 9222
spring:
  application:
    name: client
  boot:
    admin:
      client: # spring-boot-admin 使用者端設定
        url: http://localhost:9111 #伺服器端連線地址
        username: admin # 伺服器端賬號
        password: admin # 伺服器端密碼
        instance:
          prefer-ip: true # 使用ip註冊

# 伺服器端點詳細監控資訊
management:
  trace:
    http:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always
    logfile: # 紀錄檔(想線上看紀錄檔才配)
      external-file: ./logs/client-info.log # 紀錄檔所在路徑

3、啟動專案

此時使用者端就已經註冊進來了。

點選可檢視更多資訊:

點選紀錄檔也可線上檢視紀錄檔:

此時,如果我們服務掉線了,就會觸發伺服器端的預警功能,告知我們。

4、使用者端設定

3、微服務

除特別說明外,都是在上面的基礎上新增

3.1、伺服器端

1、新增依賴

  <!--  nacos註冊中心設定-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      <version>2.2.5.RELEASE</version>
  </dependency>

2、yml新增設定

spring:
  cloud: 
    nacos: 
      discovery:
        server-addr: localhost:8848
#        namespace: # 要和你的服務同一名稱空間

3.2、使用者端

使用者端不用引spring-boot-admin-starter-clien依賴,springbootadmin會去服務列表裡找

如果服務有設定context-path路徑,則需新增yml設定

spring:
  cloud:
    nacos:
      discovery:
        metadata:  # minitor監控的context-path設定
          management:
            context-path: ${server.servlet.context-path}/actuator

4、我的微服務預警傳送其他服務狀態資訊思路

問題:由於該元件重寫狀態發生變化時的介面,沒有提供其他服務的狀態資訊,只有本服務,但是如果是叢集、多範例,我又想知道,該服務其他範例或者其他的服務狀態資訊,是否存活。

結果展示:如我的預警內容,傳送當前服務狀態、當前服務剩餘健康範例、其他健康服務數等等

到此這篇關於Spring boot admin 服務監控利器詳解的文章就介紹到這了,更多相關Spring boot admin 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com