【Spring Boot】利用 Spring Boot Admin 進行項目監控管理

利用 Spring Boot Admin 進行項目監控管理

一、Spring Boot Admin 是什麼

Spring Boot Admin (SBA) 是一個社區開源項目,用於管理和監視 Spring Boot 應用程序。應用程序通過 http 的方式註冊到 Spring Boot 管理客戶端,或者通過 Spring Cloud 的服務發現機制,然後針對 actuator 接口將數據通過 Vue.js 進行可視化管理。

對於我們來說,我們可以通過 Spring Boot Admin 瀏覽所有被監控的 Spring Boot 項目,詳細的 Health 信息、內存信息、JVM 系統和環境屬性、垃圾回收信息等。

二、Spring Boot Admin 起步

Spring Boot Admin 由兩種角色組成:一種是 Server 端;一種是 Client 端,即要被監控的應用。下面分別進行兩種角色的配置:

Spring Boot Admin Server

引入依賴 [pom.xml]

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

@EnableAdminServer 註解

@SpringBootApplication
@EnableAdminServer
public class AdminApplication {

    public static void main(String[] args) {
        SpringApplication.run(AdminApplication.class, args);
    }

}

application.yml 配置

spring:
  application:
    name: spring-boot-admin-server

server:
  port: 8080

management:
  endpoint:
    health:
      show-details: always
  endpoints:
    web:
      exposure:
        include: '*'

啓動後訪問 http://localhost:8080 就可以看見一個 UI 界面

此時應用和實例都是,是因爲我們沒有註冊客戶端,接下來我們實現來客戶端。

Spring Boot Admin Client

引入客戶端依賴 [pom.xml]

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

程序入口沒有特別需要修改的地方

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

application.yml 配置

spring:
  application:
    name: spring-boot-admin-client
  boot:
    admin:
      client:
        url: http://localhost:8080

server:
  port: 8081

此時再訪問 localhost:8080 就可以發現新增了一個應用實例,如下圖所示:

那麼到這裏我們一個基本的 Spring Boot Admin 應用就配置成功了。

點擊菜單欄中的 wallboard,再點擊要查看的應用程序,就可以訪問應用的信息,如內存狀態信息等:

三、SBA 結合 Spring Cloud 註冊中心

除了上面案例中,直接在客戶端中配置相應的 SBA 配置外,還可以配合 Spring Cloud 的服務註冊與發現應用(例如:Eureka, Consul) ,接下來演示如何配置:

新建統一的依賴管理

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.jojo</groupId>
    <artifactId>admin-demo-dependencies</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>admin-demo-dependencies</name>
    <description>Demo project for Spring Boot Admin</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <!-- Environment Settings -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <!-- Spring Settings -->
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
        <spring-boot-admin.version>2.1.0</spring-boot-admin.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

搭載服務註冊中心

引入依賴

<dependencies>
    <!-- Spring Boot Begin -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- Spring Boot End -->

    <!-- Spring Cloud Begin -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <!-- Spring Cloud End -->
</dependencies>

應用程序入口

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

application.yml

spring:
  application:
    name: admin-demo-eureka

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      default-zone: http://${eureka.instance.hostname}:${server.port}/eureka
    register-with-eureka: false
    fetch-registry: false

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: ALWAYS

配置成功後啓動應用程序,訪問 localhost:8761,可以看到類似下圖的 UI 界面:

創建 SBA 服務端

引入依賴

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.1.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.jolokia</groupId>
    <artifactId>jolokia-core</artifactId>
</dependency>

應用程序入口

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

application.yml 配置

spring:
  application:
    name: admin-demo-admin-server
server:
  port: 8769
eureka:
  client:
    registryFetchIntervalSeconds: 5
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
  instance:
    leaseRenewalIntervalInSeconds: 10
    health-check-url-path: /actuator/health
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: ALWAYS

創建 SBA 客戶端

引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</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>

applicaion.yml 配置文件

spring:
  application:
    name: admin-demo-admin-client
server:
  port: 8762
eureka:
  instance:
    leaseRenewalIntervalInSeconds: 10
    health-check-url-path: /actuator/health

  client:
    registryFetchIntervalSeconds: 5
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL:http://localhost:8761}/eureka/
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: ALWAYS

應用程序入口

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

將三個應用啓動後,訪問 localhost:8769 就可以監控各個應用的運行情況了:

四、集成郵件通知

SBA 中也可以集成郵件通知,當註冊的服務下線、宕機時,向指定的郵箱發送信息郵件。其配置也十分容易,只需要在 yaml 配置文件中配置郵箱的發送方和郵件的收件方,以及在 pom 文件中引入 `` 的依賴即可。下面演示這段配置:

pom.xml配置:加入 mail 的依賴

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

application.yml:在配置文件中配置收件人以及發件方信息,並且開啓郵箱提醒

spring:
  boot:
    admin:
      notify:
        mail:
          enabled: true
          from: [email protected]
          
...

spring.mail.host: smtp.example.com
spring.mail.username: [email protected]
spring.mail.password: # 授權碼
spring.boot.admin.notify.mail.to: [email protected]

配置並啓動完成後,可以嘗試將 Client 項目中止:

然後打開收件方的郵箱,就可以看見 SBA 發送的郵件了

五、參考

SBA 官方文檔:https://codecentric.github.io/spring-boot-admin/current/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章