來源:北大青鳥總部 2023年04月10日 11:04
在微服務(wù)大行其道的今天,在任何互聯(lián)網(wǎng)公司,其項目中的服務(wù)都動輒幾十上百,多則成千上萬也是很常見的,比如,想阿里,京東這種國民級的應(yīng)用,任何一個項目的服務(wù)數(shù)量都是我們難以想象的,即使為了便于管理和降低服務(wù)之間的耦合,將各種服務(wù)拆分之后,服務(wù)的量級,更是一般中小公司難比得上的。
那么問題就來了,那么多的服務(wù)萬一有一天,哪個二貨程序員手一抖,把哪個服務(wù)給關(guān)掉了,這可就麻煩大了,如果是有降級、容錯或者集群的情況下,還好有應(yīng)對方案,如果沒有的話,那就可就等著卷鋪蓋走人吧,要知道,想阿里這種體量的公司,每秒的交易額不止千萬級別啊,想想這可是要損失多少啊,當(dāng)然阿里這種體量的公司也一般不會出現(xiàn)這種情況,即使哪一天真的發(fā)生了黑天鵝事件,阿里的技術(shù)大佬們也能及時收到告警發(fā)現(xiàn)問題,及時處理。
偷偷告訴大家一個小秘密,在一些大的公司,很多技術(shù)人員的手機其實都是24h待機的,就是為了出現(xiàn)任何問題,都能及時收到報警,及時處理。
其實說了這么多,只有一個目的是要保證我們的服務(wù)可用,系統(tǒng)安全可靠,所以這就需要我們有個好的監(jiān)控工具,可以監(jiān)控我們的服務(wù)的狀態(tài),是不是正常,有沒有掛掉。
今天我們就來學(xué)習(xí)一個SpringBoot自帶的可以監(jiān)控服務(wù)狀態(tài)的工具,并且可視化做的非常簡潔,它就是我們今天的主角SpringBoot Admin,既然主角登場了,我們就讓它先來做個自我介紹吧!
SpringBoot Admin是一個開源社區(qū)項目,用于管理和監(jiān)控SpringBoot應(yīng)用程序。應(yīng)用程序作為SpringBoot Admin Client向為SpringBoot Admin Server注冊(通過HTTP)或使用SpringCloud注冊中心(例如Eureka,Consul)發(fā)現(xiàn)。
好了自我介紹做完了,接下來就讓我們的主角給我們露一手吧,開始吧...
依然遵循著宋丹丹老師,教我們把大象裝冰箱的三步走策略,先來開始我們的第一步:搭建SpringBoot Admin監(jiān)控管理端項目,這個管理端就是可以可視化的觀察服務(wù)的狀態(tài)等各種數(shù)據(jù),一會我們會看下它的盛世容顏,首先,我們使用SpringInitializr初始化一個SpringBoot項目,讓后加入SpringBoot Admin的服務(wù)端依賴。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.2.3</version>
</dependency>
接下來就是第二步,就是是主啟動類上,添加注解,表示開啟SpringBoot Admin 監(jiān)控管理功能。
/**
* Spring Boot Admin 監(jiān)控管理
*/
@SpringBootApplication
@EnableAdminServer // 開啟監(jiān)控管理
public class SpringBootManagerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootManagerApplication.class, args);
}
}
到此我們的監(jiān)控管理端的代碼,就寫完了,是不是soeasy?。?!接下來最后一步,啟動項目,打開瀏覽器(把冰箱門蓋上),等待奇跡的發(fā)生...
此時是我們看到?jīng)]有任何服務(wù)被監(jiān)控。
好,到這里我們的監(jiān)控管理端,就完成了,有了監(jiān)控端,那它監(jiān)控管理誰呢?管理那些服務(wù)呢?總的有服務(wù)讓它監(jiān)控吧,領(lǐng)導(dǎo)之所以是領(lǐng)導(dǎo),那是因為它手底下有很多小弟,是不是,所以我們的還要在創(chuàng)建一個客戶端。
依然是老規(guī)矩,三步走戰(zhàn)略。第一步依然是使用SpringInitializr初始化一個SpringBoot項目springboot-admin-client,加入SpringBoot Admin客戶端依賴。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.2.3</version>
</dependency>
</dependencies>
第二步我要添加一些配置,可以讓監(jiān)控服務(wù)端監(jiān)控到自己,以及暴露哪些信息可以被監(jiān)控到。
# 配置端口
server.port=8081
# 監(jiān)控端端口
spring.boot.admin.client.url=http://127.0.0.1:8080
# 客戶端的名稱
spring.boot.admin.client.instance.name=client
# 配置客戶端展示哪些信息,*表示展示全部信息
management.endpoints.web.exposure.include=*
第三步就是重新刷新監(jiān)控端,就會發(fā)祥有一個實例在了,就說明我們的客戶端成功的被監(jiān)控服務(wù)端,監(jiān)測到了。
點擊應(yīng)用墻可以看到有一個client實例。
點擊中這個大大的實例就可以看到很多關(guān)于這個實例的詳細(xì)信息,因為我們上面配置的可以暴露所有信息,所以下面展示的信息是比較多的。
到這里我們的SpringBootAdmin的監(jiān)控服務(wù)端和客戶端就都完成了,當(dāng)然我們是可以有多個客戶端的,這個大家可以在創(chuàng)建一個client,這樣在監(jiān)控服務(wù)端就會有兩個實例了。
好奇的寶寶可能就會問了,如果我們的client掛了會怎樣呢?接下來咱么就演示一下服務(wù)掛了的情況,我們把client停掉,過個兩秒再來刷新一下瀏覽器的監(jiān)控服務(wù)端。
紅色的警告表示我們的服務(wù)是離線狀態(tài),還有服務(wù)掉線的數(shù)量一目了然,如果接著去看下服務(wù)的詳細(xì)信息,這個時候也是看不到了。
如果我們看上面這中狀況,就說明我的服務(wù)是出現(xiàn)了問題,我要及時處理。
好奇的寶寶可能又要問了,我們不可能7*24小時盯著界面看哪個應(yīng)用離線了啊,萬一那個應(yīng)用掛掉了,我們沒有發(fā)現(xiàn)課怎么辦呢,稍安勿躁,這些SpringBoot都替我們想好了!
SpringBoot Admin除了提供可視化監(jiān)控手段外,也提供了自動報警的功能,項目離線時自動通知售后、運維等相關(guān)技術(shù)人員,Perfect?。?!
比如,如果我們想要實現(xiàn),當(dāng)服務(wù)出現(xiàn)問題的時候,可以馬上發(fā)郵件通知相關(guān)人員,那我們就可以在郵件的發(fā)送系統(tǒng)中添加一個配置就OK了。
# Spring Boot Admin 發(fā)件收件信息
spring.boot.admin.notify.mail.from=xxxx@163.com # 從哪個郵箱發(fā)出郵件
spring.boot.admin.notify.mail.to=xxxx@163.com # 郵件發(fā)送給誰
spring.boot.admin.notify.mail.cc=xxxx@163.com # 郵件抄送給誰
只需要這么一點點的配置,就可以實現(xiàn)7*24不間斷的,監(jiān)控我們的服務(wù)了,是不是很簡單呢?
小伙伴兒們有沒有一種技術(shù)越學(xué)越簡單的感覺呢!