實戰(zhàn):使用Spring Boot Admin實現(xiàn)運(yùn)維監(jiān)控平臺
我們知道,使用Actuator可以收集應(yīng)用系統(tǒng)的健康狀態(tài)、內(nèi)存、線程、堆棧、配置等信息,比較全面地監(jiān)控了Spring Boot應(yīng)用的整個生命周期。但是還有一個問題:如何呈現(xiàn)這些采集到的應(yīng)用監(jiān)控數(shù)據(jù)、性能數(shù)據(jù)呢?在這樣的背景下,就誕生了另一個開源軟件Spring Boot Admin。下面就來介紹什么是Spring Boot Admin以及如何使用Spring Boot Admin搭建完整的運(yùn)維監(jiān)控平臺。
一、什么是Spring Boot Admin
Spring Boot Admin是一個管理和監(jiān)控Spring Boot應(yīng)用程序的開源項目,在對單一應(yīng)用服務(wù)監(jiān)控的同時也提供了集群監(jiān)控方案,支持通過eureka、consul、zookeeper等注冊中心的方式實現(xiàn)多服務(wù)監(jiān)控與管理。Spring Boot Admin UI部分使用Vue JS將數(shù)據(jù)展示在前端。
Spring Boot Admin分為服務(wù)端(spring-boot-admin-server)和客戶端(spring-boot-admin-client)兩個組件:
spring-boot-admin-server通過采集actuator端點(diǎn)數(shù)據(jù)顯示在spring-boot-admin-ui上,已知的端點(diǎn)幾乎都有進(jìn)行采集。
spring-boot-admin-client是對Actuator的封裝,提供應(yīng)用系統(tǒng)的性能監(jiān)控數(shù)據(jù)。此外,還可以通過spring-boot-admin動態(tài)切換日志級別、導(dǎo)出日志、導(dǎo)出heapdump、監(jiān)控各項性能指標(biāo)等。
Spring Boot Admin服務(wù)器端負(fù)責(zé)收集各個客戶的數(shù)據(jù)。各臺客戶端配置服務(wù)器地址,啟動后注冊到服務(wù)器。服務(wù)器不停地請求客戶端的信息(通過Actuator接口)。具體架構(gòu)如下圖所示。

上圖為Spring Boot Admin的整體架構(gòu),在每個Spring Boot應(yīng)用程序上增加Spring Boot Admin Client組件。這樣每個Spring Boot應(yīng)用即Admin客戶端,Admin服務(wù)端通過請求Admin客戶端的接口收集所有的Spring Boot應(yīng)用信息并進(jìn)行數(shù)據(jù)呈現(xiàn),從而實現(xiàn)Spring Boot應(yīng)用監(jiān)控。
二、使用Spring Boot Admin搭建運(yùn)維監(jiān)控平臺
下面就通過示例,演示如何使用Spring Boot Admin 搭建運(yùn)維監(jiān)控平臺。
1、創(chuàng)建服務(wù)器端
Spring Boot Admin服務(wù)器端主要負(fù)責(zé)收集各個客戶的數(shù)據(jù)。建立一個Spring Boot Admin服務(wù)器端只需要簡單的兩步。下面通過示例演示創(chuàng)建Spring Boot Admin服務(wù)器端的過程。
1. 配置依賴
創(chuàng)建新的Spring Boot項目,在新建的項目中添加Spring Boot Admin服務(wù)器端的依賴JAR包:spring-boot-admin-starter-server。
<dependency><groupId>de.codecentricgroupId><artifactId>spring-boot-admin-starter-serverartifactId><version>2.1.3version>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency>
上面,我們添加加spring-boot-starter-web是為了讓應(yīng)用處于啟動狀態(tài)。
2. 配置啟動端口
修改系統(tǒng)配置文件application.properties,配置服務(wù)端的啟動端口為8000:
server.port=80003. 啟用Admin服務(wù)器
使用@EnableAdminServer注解啟動Admin服務(wù)器,示例代碼如下:
// 啟用Admin服務(wù)器public class AdminServerApplication {public static void main(String[] args) {SpringApplication.run(AdminServerApplication.class, args);}}
4. 運(yùn)行測試
完成以上3步之后,啟動服務(wù)器端,在瀏覽器中訪問http://localhost:8000,可以看到如下所示的界面。

從Admin服務(wù)端的啟動界面可以看到,Applications頁面會展示應(yīng)用數(shù)量、實例數(shù)量和狀態(tài)3個信息。這里由于沒有啟動客戶端,因此顯示出“No applications registered.”的信息。
2、創(chuàng)建客戶端
接下來我們創(chuàng)建一個客戶端并注冊到服務(wù)器端。
1. 配置依賴
創(chuàng)建新的Spring Boot項目,在新建的項目中添加Spring Boot Admin客戶端的依賴JAR包:spring-boot-admin-starter-server。
<dependency><groupId>de.codecentricgroupId><artifactId>spring-boot-admin-starter-clientartifactId><version>2.1.0version>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency>
上面的示例,我們添加了是spring-boot-admin-starter-client注解,它會自動添加Actuator相關(guān)依賴,所以這里不需要重復(fù)添加Actuator的相關(guān)依賴。
2. 配置客戶端
修改application.properties配置文件,增加如下配置:
server.port=8001spring.application.name=Admin Clientspring.boot.admin.client.url=http://localhost:8000management.endpoints.web.exposure.include=*
關(guān)配置說明如下:
server.port:當(dāng)前應(yīng)用設(shè)置端口為8001。
spring.application.name:設(shè)置Application名稱,其默認(rèn)名稱都是spring-boot-application。
spring.boot.admin.client.url:配置Admin服務(wù)器的地址。
management.endpoints.web.exposure.include=*:打開客戶端Actuator的監(jiān)控。
3. 運(yùn)行驗證
配置完成后啟動客戶端,客戶端會自動注冊到Admin服務(wù)器,Admin服務(wù)器檢查到客戶端的變化并展示其應(yīng)用信息。重新刷新地址http://localhost:8000后,可以看到如圖15-7所示的頁面。

客戶端啟動之后,Admin服務(wù)器界面的Application數(shù)量會增加。單擊Application下的數(shù)值可以查看完整的應(yīng)用信息。頁面會展示被監(jiān)控的應(yīng)用列表,單擊應(yīng)用名稱會進(jìn)入此應(yīng)用的詳細(xì)監(jiān)控信息頁面。

這個頁面會實時顯示應(yīng)用的運(yùn)行監(jiān)控信息,包括之前介紹的Actuator所有的端點(diǎn)數(shù)據(jù)信息。
Spring Boot Admin以圖形化的形式展示了應(yīng)用的各項信息,這些信息大多來自于Spring Boot Actuator提供的接口。利用圖形化的形式很容易看到應(yīng)用的各項參數(shù)變化,甚至有些頁面還可以進(jìn)行一些配置操作,比如改變打印日志的級別等。
三、告警提醒功能
雖然Spring Boot Admin提供了強(qiáng)大的監(jiān)控功能,但它不能存儲歷史數(shù)據(jù),我們不可能一直盯著系統(tǒng),為此,Spring Boot Admin提供了強(qiáng)大的提醒功能,能夠在發(fā)生服務(wù)狀態(tài)變更的時候發(fā)出告警。支持的Email等提醒功能,同時也支持自定義告警提醒。
下面就來介紹Spring Boot Admin的告警提醒功能。
1、郵件提醒
設(shè)置Spring Boot Admin的郵件提醒,需要用到Spring Boot的郵件組件:spring-boot-starter-mail。這里只展示郵件提醒功能的使用。
配置依賴
修改前面的服務(wù)器端,在pom.xml 文件中,增加郵件組件,示例代碼如下:
<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-mailartifactId>dependency>
修改系統(tǒng)配置
修改application.properties 系統(tǒng)配置文件,增加郵件發(fā)送配置,和告警通知配置,示例代碼如下:
# 郵件服務(wù)配置spring.mail.host=smtp.163.comspring.mail.username=18618243664@163.comspring.mail.password=#郵箱授權(quán)碼spring.mail.properties.mail.smtp.auth=truespring.mail.properties.mail.smtp.ssl.enable=true#告警接收spring.boot.admin.notify.mail.enabled=truespring.boot.admin.notify.mail.to=417114764@qq.comspring.boot.admin.notify.mail.from=18618243664@163.com
上面,我們配置了Spring Boot 發(fā)送郵件的相關(guān)配置,這個是通用的。然后配置了告警消息的接收地址。
驗證測試
我們再次啟動服務(wù)端和客戶端,然后停止客戶端,模擬應(yīng)用宕機(jī)的情況。這樣Spring Boot Admin 就會發(fā)送告警郵件提醒。

2、自定義告警提醒
除了郵件提醒之外,通常我們還需要其他的提醒方式,比如:短信,日志等。我們可以通過自定義的方式實現(xiàn)自定義的消息告警方式。
Spring Boot Admin 實現(xiàn)自定義告警提醒也非常簡單,只要實現(xiàn)Notifier接口即可。具體實現(xiàn)方式:繼承AbstractEventNotifier 或AbstractStatusChangeNotifier這兩個類。然后重寫doNotify中實現(xiàn)具體的業(yè)務(wù)邏輯。
下面通過示例演示自定義告警提醒功能:
首先,創(chuàng)建AppStatusNotifier類,實現(xiàn)告警提醒功能,示例代碼如下:
*** 自定義的事件通知者* weiz**/public class AppStatusNotifier extends AbstractEventNotifier {private static final Logger LOGGER = LoggerFactory.getLogger(LoggingNotifier.class);public AppStatusNotifier(InstanceRepository repository) {super(repository);}protected MonodoNotify(InstanceEvent event, Instance instance) {return Mono.fromRunnable(() -> {if (event instanceof InstanceStatusChangedEvent) {LOGGER.info("Instance {} ({}) is {}", instance.getRegistration().getName(), event.getInstance(),((InstanceStatusChangedEvent) event).getStatusInfo().getStatus());}else {LOGGER.info("Instance {} ({}) {}", instance.getRegistration().getName(), event.getInstance(),event.getType());}});}}
然后,再次運(yùn)行服務(wù)端和客戶端。啟動成功之后,再關(guān)掉客戶端,模擬應(yīng)用宕機(jī)的情況。

我們看到服務(wù)端后臺日志顯示,服務(wù)端已經(jīng)收到了客戶端狀態(tài)改變的告警消息。客戶端狀態(tài)已經(jīng)變?yōu)镺FFLINE。
最后
以上,就將Spring Boot Admin搭建運(yùn)維監(jiān)控平臺介紹完畢,
