1. 程式人生 > >Spring Cloud第十三篇 | Spring Boot Admin服務監控

Spring Cloud第十三篇 | Spring Boot Admin服務監控

本文是Spring Cloud專欄的第十三篇文章,瞭解前十二篇文章內容有助於更好的理解本文:

  1. Spring Cloud第一篇 | Spring Cloud前言及其常用元件介紹概覽

  2. Spring Cloud第二篇 | 使用並認識Eureka註冊中心

  3. Spring Cloud第三篇 | 搭建高可用Eureka註冊中心

  4. Spring Cloud第四篇 | 客戶端負載均衡Ribbon

  5. Spring Cloud第五篇 | 服務熔斷Hystrix

  6. Spring Cloud第六篇 | Hystrix儀表盤監控Hystrix Dashboard

  7. Spring Cloud第七篇 | 宣告式服務呼叫Feign

  8. Spring Cloud第八篇 | Hystrix叢集監控Turbin

  9. Spring Cloud第九篇 | 分散式服務跟蹤Sleuth

  10. Spring Cloud第十篇 | 分散式配置中心Config

  11. Spring Cloud第十一篇 | 分散式配置中心高可用

  12. Spring Cloud第十二篇 | 訊息匯流排Bus

一、前言

    Spring Boot Admin 是一個管理和監控你的 Spring Boot 應用程式的應用程式。這些應用程式通過 Spring Boot Admin Client(通過 HTTP)註冊或者使用 Spring Cloud(例如 Eureka)發現。UI只是 Spring Boot Actuator 端點上的一個 AngularJs 應用程式。

    原理:Spring Boot Actuator 模組為監控Spring Boot 應用程式暴露的大量的管理端點[ENDPOINT],在Spring Boot Actuator的基礎上提供簡潔的視覺化WEB UI,是用來管理 Spring Boot 應用程式的一個簡單的介面。

二、使用Spring Boot Admin監控服務

Spring Boot Admin也分為server和client(普通應用程式)

1、搭建Admin服務端

1-1、創鍵springboot admin服務端模組(springboot-admin-server)

1-2、新增springboot admin服務端依賴

<dependency>
  <groupId>de.codecentric</groupId>
  <artifactId>spring-boot-admin-starter-server</artifactId>
  <version>2.1.0</version>
</dependency>

1-3、在主類上添加註解@EnableAdminServer

1-4、在application.yml檔案中新增配置,然後啟動

server:
  port: 8788
spring:
  application:
    name: springboot-admin-server

2、搭建Admin客戶端

2-1、建立springboot admin客戶端模組(springcloud-admin-client)

2-2、新增springboot admin客戶端依賴

<dependency>
  <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-starter-client</artifactId>
   <version>2.1.0</version>
</dependency>

2-3、在application.yml檔案中新增配置,然後啟動

server:
  port: 8080
spring:
  application:
    name: springcloud-admin-client
  boot:
    admin:
      client:
      #springboot admin client連線 spring boot admin server 端點地址springboot admin client連線 spring boot admin server 端點地址
        url: http://localhost:8788
        instance:
        #預設使用的是主機名註冊,改為使用ip註冊
          prefer-ip: true
management:
  endpoints:
    web:
      exposure:
        #開放所有頁面節點  預設只開啟了health、info兩個節點
        include: '*'
  endpoint:
    health:
      #顯示健康具體資訊  預設不會顯示詳細資訊
      show-details: always
# 利用info端點,加入版本等資訊
info:
  versin: @project.version@
  name: @project.artifactId@
  group: @project.groupId@
  description: @project.description@
  #還可以自定義資訊
  author: Coding Farmer
  blog: http://www.coding-farmer.cn

2-4、啟動訪問spring boot admin服務端頁面http://localhost:8788,顯示如下

3、給Sring Boot Admin新增認證

i、修改admin服務端(springboot-admin-server)模組

3-i-1、在生產環境中,為了資料的安全,還是需要加上安全認證的,具體的可以檢視官方文件:https://codecentric.github.io/spring-boot-admin/2.1.0/#_securing_spring_boot_admin_server,相對比較簡單,簡單來說就是加入spring-boot-starter-security進行安全認證。

3-i-2、在admin服務端(springboot-admin-server)模組新增依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

3-i-3、在application.yml中新增使用者名稱、密碼

spring:
  security:
    user:
      name: coding-farmer
      password: 123456

3-i-4、編輯SpringbootAdminServerApplication.java檔案,修改為

package com.springcloudlearn;
import de.codecentric.boot.admin.server.config.AdminServerProperties;
import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
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;
@EnableAdminServer
@SpringBootApplication
public class SpringbootAdminServerApplication {
  public static void main(String[] args) {
    SpringApplication.run(SpringbootAdminServerApplication.class, args);
  }
  @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");
      successHandler.setDefaultTargetUrl(adminContextPath + "/");
      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()
          .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
          .ignoringAntMatchers(
              adminContextPath + "/instances",
              adminContextPath + "/actuator/**"
          );
      // @formatter:on
    }
  }
}

3-i-5、訪問http://localhost:8788

ii、修改admin客戶端(springboot-admin-client)模組

3-ii-1、由於服務端配置了密碼,客戶端訪問的時候需要密碼,這是基於SBA訪問模式,也就是所謂的直接連線springboot admin服務端模式,在application.yml檔案中新增username,password

spring:
  application:
    name: springcloud-admin-client
  boot:
    admin:
      client:
      #springboot admin client連線 spring boot admin server 端點地址springboot admin client連線 spring boot admin server 端點地址
        url: http://localhost:8788
        instance:
        #預設使用的是主機名註冊,改為使用ip註冊
          prefer-ip: true
        username: coding-farmer
        password: 123456

3-ii-2、然後啟動客戶端(springboot-admin-client)模組,訪問http://localhost:8788,檢視客戶端服務註冊到了admin服務端上

三、使用Spring Boot Admin監控Spring Cloud服務結合Eureka註冊中心

    當我們監控微服務的時候,服務數量眾多,我們肯定想統一管理微服務,我可以將服務全部註冊到註冊中心上,admin會自己拉取Eureka上註冊的應用資訊,主動去註冊。這也是唯一區別之前手動註冊(SBA連線方式)的地方,就是client端不需要admin-client的依賴,也不需要配置admin地址了,一切全部由admin-server自己實現。這樣的設計對環境變化很友好,不用改了admin-server後去改所有應用的配置了。

1、在上面基礎上繼續修改Admin服務端

1-1、新增依賴

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

1-2、在啟動類上新增Eureka的註解@EnableEurekaClient

1-3、修改後application.yml配置檔案如下,然後啟動

server:
  port: 8788
spring:
  application:
    name: springboot-admin-server
  security:
    user:
      name: coding-farmer
      password: 123456
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8700/eureka
    #客戶端每隔30秒從Eureka服務上更新一次服務資訊
    registry-fetch-interval-seconds: 30
    #需要將我的服務註冊到eureka上
    register-with-eureka: true
    #需要檢索服務
    fetch-registry: true
  #心跳檢測檢測與續約時間
  instance:
    #告訴服務端,如果我10s之內沒有給你發心跳,就代表我故障了,將我剔除掉,預設90s
    #Eureka服務端在收到最後一次心跳之後等待的時間上限,單位為秒,超過則剔除(客戶端告訴服務端按照此規則等待自己)
    lease-expiration-duration-in-seconds: 10
    #每隔2s向服務端傳送一次心跳,證明自已依然活著,預設30s
    #Eureka客戶端向服務端傳送心跳的時間間隔,單位為秒(客戶端告訴服務端自己會按照該規則)
    lease-renewal-interval-in-seconds: 2
    # 啟用ip配置 這樣在註冊中心列表中看見的是以ip+埠呈現的
    prefer-ip-address: true
    # 例項名稱  最後呈現地址:ip:2002
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
    health-check-url-path: /actuator/health
 
   #Eureka 中的 metadataMap 是專門用來存放一些自定義的資料,
   # 當註冊中心或者其他服務需要此服務的某些配置時可以在 metadataMap 裡取。
   # 實際上,每個 instance 都有各自的 metadataMap,map 中存放著需要用到的屬性。
   # 例如,上面配置中的 eureka.instance.metadata-map.username,當這個服務成功註冊到 Eureka 上,
   # Spring Boot Admin 就會取拿到這個 instance,進而拿到 metadataMap 裡的屬性,
   # 然後放入請求頭,向此服務傳送請求,訪問此服務的 Actuator 開放的端點。
   #說白了,這個為了連線到自己,把密碼告訴eureka,spring boot admin server 拿著密碼去連線客戶端應用,監控資訊
    metadata-map:
      user.name: ${spring.security.user.name}
      user.password: ${spring.security.user.password}
      
#使用註冊中心後,他admin也可以監控自身服務狀況
management:
  endpoints:
    web:
      exposure:
        #開放所有頁面節點  預設只開啟了health、info兩個節點
        include: '*'
  endpoint:
    health:
      #顯示健康具體資訊  預設不會顯示詳細資訊
      show-details: always
# 利用info端點,加入版本等資訊
info:
  versin: @project.version@
  name: @project.artifactId@
  group: @project.groupId@
  description: @project.description@
  #還可以自定義資訊
  author: Coding Farmer
  blog: http://www.coding-farmer.cn

1-4、訪問如下http://localhost:8788,使用註冊中心之後他也可以監控自身服務的狀況

2、在上面基礎上繼續修改Admin客戶端

2-1、新增依賴

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2-2、在啟動類上添加註解@EnableEurekaClient

2-3、啟動Admin客戶端,然後訪問Admin服務端http://localhost:8788,你會看到還有Admin服務端已被監控了

 

詳細參考案例原始碼:https://gitee.com/coding-farmer/spirngcloud-learn