利用 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: youemail@example.com
...
spring.mail.host: smtp.example.com
spring.mail.username: youemail@example.com
spring.mail.password: # 授權碼
spring.boot.admin.notify.mail.to: admin@example.com
配置並啟動完成后,可以嘗試將 Client 項目中止:

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

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