如何用Springboot Admin監(jiān)控你的微服務(wù)應(yīng)用
目前,微服務(wù)大行其道,各大小公司爭(zhēng)相學(xué)習(xí)模仿,把單體應(yīng)用拆得七零八落。服務(wù)多了,運(yùn)行的實(shí)例多了,給運(yùn)維人員的壓力就更大了。如果有十幾個(gè)應(yīng)用,單單做Health Check就已經(jīng)夠費(fèi)時(shí)間的了。聰明的Springboot提供了Actuator接口,可以非常好獲得應(yīng)用的內(nèi)部信息,然而針對(duì)數(shù)量龐大的服務(wù)卻無能為力。
得益于開源社區(qū)的力量,我們有了Springboot Admin。它能對(duì)注冊(cè)于服務(wù)發(fā)現(xiàn)的所有應(yīng)用監(jiān)控起來,功能包括健康檢查、JVM內(nèi)存、INFO信息、獲得線程棧和堆棧信息、提醒(郵件、Slack、釘釘、自定義...)等。總之,它提供了非常豐富的監(jiān)控功能,減輕運(yùn)維人員的工作任務(wù)。
目前Springboot Admin(后面簡(jiǎn)稱SBA)的最新版本為2.2.0,本文演示將使用該版本。
2 兩種監(jiān)控模式使用SBA監(jiān)控Client有兩種模式,一種是在Client端引入spring-boot-admin-starter-client依賴,配置好Server的地址信息就可以了。另一種模式是將所有Client端注冊(cè)到服務(wù)發(fā)現(xiàn)(Eureka)組件中去,同時(shí)把Server端也注冊(cè),這樣Server端就可以監(jiān)控所有Client端了。
第二種模式是更方便的,不用對(duì)Client都添加依賴,后面的例子使用第二種模式。
服務(wù)端需要添加SBA的依賴和Eureka Client的依賴,如下:
<dependencies> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency></dependencies>
配置文件配置信息如下:
server.port=9000spring.application.name=admin-monitor-serviceeureka.client.service-url.defaultZone=http://localhost:8761/eureka/eureka.client.register-with-eureka=trueeureka.client.fetch-registry=true
啟動(dòng)后就可以監(jiān)控微服務(wù)了(當(dāng)然需要Eureka和其它Client也啟動(dòng)并注冊(cè)),效果圖如下:
上圖顯示共有四個(gè)應(yīng)用受到監(jiān)控:
有一個(gè)ADMIN-MONITOR-SERVICE,即SBA本身;
有兩個(gè)DATA-SERVICE,用于數(shù)據(jù)庫操作的服務(wù);
有一個(gè)GATEWAY,是網(wǎng)關(guān)服務(wù),即Zuul。
能看到服務(wù)的名字,還能看到其版本號(hào)。
3 保護(hù)你的SBA3.1 保護(hù)Server現(xiàn)在SBA啟動(dòng)后直接輸入地址就可以訪問,不需要密碼登陸,這顯然是不安全的。SBA本質(zhì)也是一個(gè)Springboot的Web應(yīng)用,可以用Spring Security來做安全和權(quán)限控制。
添加Spring Security依賴如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>
配置用戶和密碼:
spring.security.user.name=adminspring.security.user.password=admin
重啟應(yīng)用后,就需要登陸密碼才能訪問了,如下:
實(shí)際上Spring Security遠(yuǎn)比這強(qiáng)大,我們可以通過配置把更敏感的信息保護(hù)起來,如HeamDump文件的獲取,日志級(jí)別的修改等。
注意:即使做了上面的措施,也無法保證Server的安全。要想更安全地使用SBA,可以通過添加SSL,使它運(yùn)行在https之上。
3.2 保護(hù)Client目前我們把Client的所有Endpoints都暴露出來,這也是非常危險(xiǎn)的,我們可以有選擇的暴露需要的信息。另外,我們還可以為Client設(shè)置賬戶密碼保護(hù),只有擁有了正確的賬戶密碼,Server端才可以獲得監(jiān)控權(quán)限。
4 監(jiān)控功能SBA為我們提供豐富的監(jiān)控功能,我們選擇幾項(xiàng)展示一下。
4.1 健康檢查與細(xì)節(jié)查看SBA會(huì)監(jiān)控服務(wù)是否健康,包括應(yīng)用及應(yīng)用的組件,如數(shù)據(jù)庫連接等。
圖上還有info信息,這個(gè)是自定義配置的,非常方便,如配置代碼的版本號(hào)等。
info.author=Larry Denginfo.version=1.0.3 Beans
可以查看所有的beans信息。
Configuration Properties查看目前應(yīng)用使用的配置信息。
Scheduled Tasks查看正在使用的定時(shí)調(diào)度任務(wù)。
4.2 日志Loggers展示了當(dāng)前的日志級(jí)別,更強(qiáng)大的是,它可以實(shí)時(shí)調(diào)整日志級(jí)別,而不用去改log4j2配置文件,也不用重啟。在有問題需要更詳細(xì)的日志的時(shí)候,非常方便。
可以實(shí)時(shí)地查看每個(gè)線程的狀態(tài),并且能下載Thread Dump文件,方便有故障的時(shí)候分析。同樣,還能下載Heap Dump文件,在占用內(nèi)存居高不下,還不能GC時(shí),可以用來分析。
Mappings能查看Endpoints的路徑和方法及返回類型等。
Caches可以查看應(yīng)用所使用的緩存,并能操作,如清空緩存。
5 強(qiáng)大的提醒功能雖然SBA提供了強(qiáng)大的監(jiān)控功能,但要人工一直盯著屏幕就太低效了。為此,SBA提供了強(qiáng)大的提醒功能,能夠在發(fā)生服務(wù)狀態(tài)變更的時(shí)候發(fā)出告警。支持的提醒功能有:
Email PagerDuty OpsGenie Hipchat Slack Let’s Chat Telegram等。
同時(shí)還支持自定義,這樣可以整合更豐富的提醒,如短信、電話等。
5.1 郵件提醒為了不讓篇幅過大,下面只展示一下郵件提醒功能的使用,其它可參考用戶手冊(cè)。
添加郵件依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId></dependency>
配置參數(shù):
spring.mail.host=smtp.example.comspring.mail.username=smtp_userspring.mail.password=smtp_passwordspring.boot.admin.notify.mail.to=admin@example.com
郵件提醒其它配置項(xiàng):
自定義提醒很簡(jiǎn)單,只要實(shí)現(xiàn)Notifier接口就行了,建議直接繼承AbstractEventNotifier 或AbstractStatusChangeNotifier這兩個(gè)類。邏輯在方法doNotify中實(shí)現(xiàn)。
public class CustomNotifier extends AbstractEventNotifier { private static final Logger LOGGER = LoggerFactory.getLogger(LoggingNotifier.class); public CustomNotifier(InstanceRepository repository) { super(repository); } @Override protected Mono<Void> doNotify(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()); } }); }}6 總結(jié)
SBA非常強(qiáng)大,一篇文章難以完備,大家可以參考用戶手冊(cè)。
另外,服務(wù)發(fā)現(xiàn)不一定要使用Eureka,如Nacos也是支持的。只使用SBA也是不夠的,對(duì)于監(jiān)控日志,可以使用ELK,這是題外話了,以后有空再整理吧。
以上就是如何用Springboot Admin監(jiān)控你的微服務(wù)應(yīng)用的詳細(xì)內(nèi)容,更多關(guān)于Springboot Admin監(jiān)控微服務(wù)應(yīng)用的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. Python獲取抖音關(guān)注列表封號(hào)賬號(hào)的實(shí)現(xiàn)代碼2. Warning: require(): open_basedir restriction in effect,目錄配置open_basedir報(bào)錯(cuò)問題分析3. php網(wǎng)絡(luò)安全中命令執(zhí)行漏洞的產(chǎn)生及本質(zhì)探究4. 解決Python 進(jìn)程池Pool中一些坑5. php測(cè)試程序運(yùn)行速度和頁面執(zhí)行速度的代碼6. Python如何讀寫CSV文件7. 三個(gè)不常見的 HTML5 實(shí)用新特性簡(jiǎn)介8. ajax請(qǐng)求添加自定義header參數(shù)代碼9. python利用os模塊編寫文件復(fù)制功能——copy()函數(shù)用法10. 無線標(biāo)記語言(WML)基礎(chǔ)之WMLScript 基礎(chǔ)第1/2頁
