前言
上一章節,我們介紹了
Actuator
的使用,知道了可通過訪問不同的端點路徑,獲取相應的監控信息。但使用后也能發現,返回的監控數據都是以JSON串的形式進行返回的,對於實施或者其他人員來說,不是很直觀,而當需要監控的應用越來越多時,依次去訪問對應的應用也過於繁瑣和低效了。所以,本章節來介紹下Spring Boot Admin
這個UI監控工具。
Spring-Boot-Admin是什么
先看看,官網給其定義:
簡單來說,Spring Boot Admin
是一個管理和監控Spring Boot
應用程序的開源軟件。每個應用都認為是一個客戶端,通過HTTP
或者服務注冊發現Spring Cloud
(Eureka、Consul等等)注冊到admin server
中進行展示,Spring Boot Admin UI
部分使用AngularJs
將數據展示在前端。
Spring Boot Admin
是一個針對spring-boot
的actuator
接口進行UI美化封裝的監控工具。它可以:在列表中瀏覽所有被監控spring-boot項目的基本信息,詳細的Health信息、內存信息、JVM信息、垃圾回收信息、各種配置信息(比如數據源、緩存列表和命中率)等,還可以直接修改logger
的level
。
監控實例
Spring Boot Admin
包含admin-server
與admin-client
兩個組件,admin-server
通過采集actuator
端點數據,顯示在spring-boot-admin-ui
上。
**提醒:為了演示服務端和客戶端,本實例創建了一個maven多模塊
項目。
**
admin-server端
admin-server
端主要是數據展現功能,包含了一個ui頁面。
創建一個spring-boot-admin-server
工程。
0.引入pom依賴
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-dependencies</artifactId>
<version>1.5.7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
注意:由於使用的SprinBoot
為1.5.15
版本,所以選用的Spring Boot Admin
版本為1.5.7
版本。同時為了版本依賴,使用dependencyManagement
加入了spring-boot-admin-dependencies
進行版本管理。
1.啟動類,加入注解@EnableAdminServer
。
@SpringBootApplication
@EnableAdminServer
@Slf4j
public class Chapter28AdminServerApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(Chapter28AdminServerApplication.class, args);
log.info("Chapter28AdminServer啟動!");
}
}
一個服務端就基本配置結束了,啟動應用,訪問:http://127.0.0.1:8080 ,即可看見監控頁面了:
由於現在還沒有加入客戶端,所以應用列表都是空的。
admin-client端
被監控的應用只需要加入相關依賴和服務端配置即可。
創建一個spring-boot-admin-client
項目
0.引入pom依賴
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>
1.配置文件加入服務端地址等信息。
application.properties
# 應用名稱 便於識別
spring.application.name=spring-boot-admin-client
server.port=8081
#服務端地址
spring.boot.admin.url=http://127.0.0.1:8080
# 關閉安全認證
management.security.enabled=false
# 利用info端點,加入版本等信息
info.version=@project.version@
info.name=@project.artifactId@
# 可自定義信息
info.author=oKong
info.blog=http://blog.lqdev.cn/
注意:為了能獲取maven的配置內容,需要在pom文件中加入以下配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
只需要這兩部,客戶端就配置完了,啟動下,訪問http://127.0.0.1:8080 ,即可看見監控頁面已經包含了此應用數據了:
此時,我們點擊詳情,即可看見各類監控數據了。
環境變量:
線程信息:
日志相關:
若需要動態的修改日志級別,按官網的提示,需要加入logback-spring.xml
文件,具體的可查看官網文檔吧,寫的很詳細了。
其他監控指標,大家可以自行查看下。
注意:在生產環境中,為了數據的安全,還是需要加上安全認證的,具體的可以查看官方文檔:securing-spring-boot-admin,相對比較簡單,簡單來說就是加入spring-boot-starter-security
進行安全認證,這里可以直接引入spring-boot-admin-server-ui-login
進行登錄安全認證。本文就不闡述了。
監控通知
雖然我們可以通過界面進行可視化監控,但不可能實時去盯着屏幕的,我們希望在服務有問題,比如下線、CPU異常等情況時,能通過郵件等形式及時通知對應責任人,這樣就能做到預警效果了。
在SpingBootAdmin
中,提供了多種通知機制,來實現監控告警功能。
可以看見,其集成了國外的一些通訊軟件,而對於我們而言,還是使用郵件通知比較靠譜。當然也能自定義通知,進行個性化消息通知功能,比如釘釘機器人通知等。
發送郵件通知
這里簡單以郵件通知為例。具體郵件發送相關知識點,可查看:第二十六章:郵件發送,這里不在闡述了。
以下配置都是在服務端spring-boot-admin-server
進行添加。
0.引入pom依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
1.配置郵箱信息。
# 郵件相關
# SMTP服務器地址
spring.mail.host=smtp.qq.com
# SMTP服務器端口號 默認-1
# spring.mail.port=-1
# 發送方帳號
spring.mail.username=郵箱
# 發送方密碼(授權碼)
spring.mail.password=郵箱密碼
#javaMailProperties 配置
# 開啟用戶身份驗證
spring.mail.properties.mail.smtp.auth=true
# 發送給誰
spring.boot.admin.notify.mail.to=499452441@qq.com
# 誰發的
spring.boot.admin.notify.mail.from=499452441@qq.com
再次啟動服務端應用和客戶端,之后停止客戶端,就可以收到下線通知郵件了。
同時,我們還能自定義發送郵件的主題和內容,配置文件加入
# 主題格式
# 使用中文會亂碼,可使用yml文件格式解決
# 之類直接unicode編碼了
# 應用#{application.name}(#{application.id}) 狀態為:#{to.status}
spring.boot.admin.notify.mail.subject=\u5e94\u7528#{application.name}(#{application.id}) \u72b6\u6001\u4e3a\uff1a#{to.status}
# 郵件內容
#應用#{application.name} (#{application.id})\n狀態從 #{from.status} 變為 #{to.status}\n\n 應用健康地址:#{application.healthUrl}
spring.boot.admin.notify.mail.text=\u5e94\u7528#{application.name} (#{application.id})\n\u72b6\u6001\u4ece #{from.status} \u53d8\u4e3a #{to.status}\n\n \u5e94\u7528\u5065\u5eb7\u5730\u5740\uff1a#{application.healthUrl}
多說幾句:這里的subject
和text
都支持SpEL(Spring Expression Language)
表達式的,關於SpEL
表達式,有興趣的同學可以自行搜索下,是一個支持運行時查詢和操作對象圖的強大的表達式語言,類似於EL
表達式,定界符為#{}
,一種簡化開發的表達式,通過使用表達式來簡化開發,減少一些邏輯、配置的編寫。
而此次,發送郵件的參數,通過跟蹤源碼獲悉,入口的參數為ClientApplicationEvent
,對應路徑為:de.codecentric.boot.admin.event.ClientApplicationEvent
,即應用信息。其繼承的類如下:
當應用發送狀態變更時,就會觸發ClientApplicationStatusChangedEvent
事件了,對應的參數如下所示:
所以,需要額外一些參數時,可以根據de.codecentric.boot.admin.model.Application
的屬性獲取更加詳細的信息,如metadata
、info
等等。
之后,發送的郵件內如如下:
自定義通知
除了使用自帶的一些通知機制外,我們還能通過自定義,來進行個性化通知的創建,比如在一些場景下,我們會把消息推送到MQ服務器上或者手機上等等。實現通知比較簡單,就是實現
Notifier
接口,而官方提供給了一個抽象類AbstractStatusChangeNotifier
,我們直接繼承此類就好了。
0.創建一個自定義通知類
CustomNotifier.java
/**
* 自定義通知
* @author oKong
*
*/
@Component
@ConfigurationProperties("okong.custom.notify")
@Setter
@Getter
@Slf4j
public class CustomNotifier extends AbstractStatusChangeNotifier{
String name;
@Override
protected void doNotify(ClientApplicationEvent event) throws Exception {
//這里只是為了示例 ,直接輸出到控制台了。
log.info("{}-自定義通知:應用-{}", name,event.getApplication().getName());
}
}
1.配置文件配置屬性name的值
# 自定義通知類型
okong.custom.notify.name=oKong
再次,啟動應用,當監控的應用狀態發生變動時,可以看見郵件和自定義通知都生效了,控制台可以看見自定義輸出內容了。
大家可以結合實際的業務需求,編寫不同的自定義通知類的,比如利用小程序或者微信公眾號,發送微信信息;或者發送短信;或者其他的通訊工具都可以的,自由發揮~
參考資料
總結
本章節主要講解了利用
Spring Boot Admin
這個web監控工具進行可視化的監控應用各指標信息。關於使用Spring Cloud
注冊中心來進行客戶端自動注冊與發現的,本系列就不闡述了,因為涉及到一些Eureka
的相關知識點,后期會在白話SpringCloud
的實施監控里面進行詳細闡述,而且基於Spring Boot2
的界面風格也有大變動,使用Vue.js
來進行構建了,同時很會集成Hystrix
和turbine
的集成監控,會更加方便。
最后
目前互聯網上很多大佬都有
SpringBoot
系列教程,如有雷同,請多多包涵了。原創不易,碼字不易,還希望大家多多支持。若文中有所錯誤之處,還望提出,謝謝。
老生常談
- 個人QQ:
499452441
- 微信公眾號:
lqdevOps
個人博客:http://blog.lqdev.cn
完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-28
原文地址:http://blog.lqdev.cn/2018/09/14/springboot/chapter-twenty-eight/