利用 Spring Boot Admin 進行項目監控管理 一、Spring Boot Admin 是什麼 Spring Boot Admin (SBA) 是一個社區開源項目,用於管理和監視 Spring Boot 應用程式。應用程式通過 的方式註冊到 Spring Boot 管理客戶端,或者通過 ...
利用 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/