1. 程式人生 > >Spring Boot Admin【Finchley 版】

Spring Boot Admin【Finchley 版】

一、 Spring Boot Admin介紹

  1. Spring Boot Actuator提供了對單個Spring Boot的監控,資訊包含:應用狀態、記憶體、執行緒、堆疊等等,比較全面的監控了Spring Boot應用的整個生命週期。
    但是Actuator的監控也有一些問題:第一,所有的監控都需要呼叫固定的介面來檢視,如果全面檢視應用狀態需要呼叫很多介面;第二,如果Spring Boot應用叢集非常大,每個應用都需要呼叫不同的介面來檢視監控資訊,操作非常繁瑣低效。為了解決上述問題,誕生了另外一個開源應用:Spring Boot Admin。
  2. Spring Boot Admin 是一個管理和監控Spring Boot 應用程式的開源專案,分為admin-server和admin-client兩個元件,admin-server將採集到的相關應用的actuator端點資料顯示在spring-boot-admin-ui上。另外,通過 spring-boot-admin 可以動態切換日誌級別、監控應用的各項指標等。
    Spring Boot Admin可以同時監控多個Spring Boot應用,通過eureka、consul等註冊中心的方式實現多服務的監控和管理,每個Spring Boot應用都是一個admin-client。

二、 Spring Boot Admin監控Spring Boot應用

搭建Admin Server端

  1. pom.xml中新增以下依賴

        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency
    >
    <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.jolokia</groupId> <artifactId>jolokia-core</artifactId> </dependency> <!--訪問/actuator/info介面--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>build-info</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
  2. 配置檔案application.yml

    (1) Spring Boot2.x中,Actuator預設只開放了/actuator/info、/actuator/health兩個端點,如果要訪問其他埠需要自己通過配置management.endpoints.web.exposure.include屬性來實現,下面我們暴露了所有endpoints,如果應用到生產環境,考慮到安全問題,對於Actuator的Endpoints要根據需要進行配置。
    (2) Spring Boot Admin 註冊到Eureka Server 中後,可以管理所有註冊到 Eureka Server 的應用,包括 Spring Boot Admin自己,Spring Boot Admin 會自動從註冊中心抓取這些應用的相關資訊並進行監控。

    server:
      port: 5000
    
    eureka:
      instance:
        leaseRenewalIntervalInSeconds: 10
        health-check-url-path: /actuator/health   #健康檢查的地址
        instance-id: microservicecloud-adminserver #服務中心中該服務的註冊名
        prefer-ip-address: true #是否顯示IP
      client:
        registryFetchIntervalSeconds: 5
        serviceUrl:
          defaultZone: http://localhost:7001/eureka  #註冊中心地址
    
    management:
      endpoints:
        web:
          exposure:
            include: "*"
  3. 啟動類
    添加註解@EnableAdminServer

    @Configuration
    @EnableAutoConfiguration
    @EnableAdminServer
    public class AdminserverApplication5000 {
    
        public static void main(String[] args) {
            SpringApplication.run(AdminserverApplication5000.class,args);
        }
    }

    上述配置完成之後,啟動Eureka Server和Admin Server,訪問http://localhost:5000,可以看到如下介面
    這裡寫圖片描述

Admin Client端

通過服務發現的方式配置客戶端。

  1. pom.xml中新增以下依賴

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  2. application.yml配置檔案

    server:
      port: 5001
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
      instance:
        instance-id: microservicecloud-adminclient 
        prefer-ip-address: true
    
    management:
      endpoints:
        web:
          exposure:
            include: '*'  // SpringBootActuator監控暴露所有介面
  3. 啟動類

    @SpringBootApplication
    @EnableEurekaClient
    public class AdminclientApplication5001 {
    
        public static void main(String[] args) {
            SpringApplication.run(AdminclientApplication5001.class, args);
        }
    }

    配置完成後,啟動Eureka Server和Admin Server、Admin Client(Admin服務端和客戶端的啟動無先後順序),再次訪問http://localhost:5000,介面如下

    選中其中一個服務,進入首頁,可以檢視該服務的具體監控資訊。
    這裡寫圖片描述

三、為Admin Server新增安全訪問控制

Admin Server服務是Spring Boot的安全端點管理程式,自身的安全也是比不可少的,所以我們需要為Admin Server服務新增安全訪問控制。官方已經提供了對應的支援。

如果Admin的客戶端和服務端都註冊到同一個註冊中心,則不需要在客戶端指定服務端的地址,Admin Server會自動從註冊中心抓取這些應用進行監控,並且不需要在客戶端配置服務端的憑證資訊。

  1. Admin Server端的pom.xml中增加安全控制的依賴

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
  2. 在application.yml中設定使用者名稱和密碼

    eureka:
      instance:
        leaseRenewalIntervalInSeconds: 10
        health-check-url-path: /actuator/health
        instance-id: adminserver
        prefer-ip-address: true
        metadata-map:
          user.name: user  #使用者名稱和密碼必須和security下配置的使用者名稱和密碼相同,否則啟動後服務端是DOWN的狀態
          user.password: 123456
      client:
        registryFetchIntervalSeconds: 5
        serviceUrl:
          defaultZone: http://eureka7001.com:7001/eureka
    spring:
        security:
            user:
            name: user
            password: 123456

    Eureka 中的 metadataMap 專門用來存放一些自定義的資料,當註冊中心或者其他服務需要此服務的某些配置時可以在 metadataMap 裡取。實際上,每個 instance 都有各自的 metadataMap,map中存放著需要用到的屬性。
    例如,上面配置中的 eureka.instance.metadata-map.user.name,當這個服務成功註冊到 Eureka 上,Spring Boot Admin 就會取拿到這個 instance,進而拿到 metadataMap 裡的屬性,然後放入請求頭,向此服務傳送請求,訪問此服務的 Actuator 開放的端點。

  3. 在Admin Server中配置security的攔截配置

        @Configuration
        public static class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
            private final String adminContextPath;
    
            public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
                this.adminContextPath = adminServerProperties.getContextPath();
            }
    
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                // @formatter:off
                SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
                successHandler.setTargetUrlParameter("redirectTo");
    
                http.authorizeRequests()
                        .antMatchers(adminContextPath + "/assets/**").permitAll()
                        .antMatchers(adminContextPath + "/login").permitAll()
                        .anyRequest().authenticated()
                        .and()
                        .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
                        .logout().logoutUrl(adminContextPath + "/logout").and()
                        .httpBasic().and()
                        .csrf().disable();
                // @formatter:on
            }
        }   

    重啟程式,再次訪問http://localhost:5000,提示需要輸入使用者名稱和密碼。
    這裡寫圖片描述

四、郵件告警

Spring Boot Admin將微服務中所有應用資訊在後臺進行了展示,非常方便我們對微服務整體的監控和治理。當某個服務的狀態發生改變時,為保證運維人員能及時知道,Spring Boot Admin支援郵件告警功能。實現步驟:

  1. pom.xml中新增依賴

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-mail</artifactId>
      </dependency>
  2. 修改application.yml

    spring:
      boot:
        admin:
          notify:
            mail:
              to: XXXXX@163.com  # 郵件接收方
              from: [email protected].com  # 郵件傳送方
      mail:
        host: smtp.qq.com   # qq郵箱伺服器主機host,需要在QQ郵箱設定中開啟smtp協議 163郵箱為smtp.163.com
        username: [email protected].com  # qq郵箱賬號
        password: XXXXXXXXXX  # 第三方登入的授權碼
        properties:
          mail.debug: false
          mail.smtp.auth: true
          mail.smtp.starttls.enable: true
          mail.smtp.ssl.enable: true

    上述配置完成之後重新啟動Spring Boot Admin客戶端和服務端,當關閉客戶端服務時[email protected]郵箱中會接收到下圖中的郵件:
    這裡寫圖片描述