SpringBoot的Admin服務(wù)監(jiān)控詳解
一、介紹
1、SBA簡介
Spring Boot Admin(SBA)是一個開源的社區(qū)項目,用于管理和監(jiān)控 Spring Boot 應(yīng)用程序。應(yīng)用程序可以通過 http 的方式,或 Spring Cloud 服務(wù)發(fā)現(xiàn)機制注冊到 SBA 中,然后就可以實現(xiàn)對 Spring Boot 項目的可視化管理和查看了。
Spring Boot Admin 可以監(jiān)控 Spring Boot 單機或集群項目,它提供詳細的健康 (Health)信息、內(nèi)存信息、JVM 系統(tǒng)和環(huán)境屬性、垃圾回收信息、日志設(shè)置和查看、定時任務(wù)查看、Spring Boot 緩存查看和管理等功能。
2、SBA工程介紹
Spring Boot Admin分為服務(wù)端和客戶端,服務(wù)端、客戶端都是獨立的web項目,服務(wù)端是監(jiān)控程序,客戶端是被監(jiān)控的程序,這里需要創(chuàng)建兩個SpringBoot工程,一個對應(yīng)服務(wù)端,一個對應(yīng)客戶端
二、SBA服務(wù)端構(gòu)建
1、SBA服務(wù)端簡單構(gòu)建
首先新建一個SpringBoot工程,在pom.xml中導(dǎo)入相關(guān)依賴
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<!--2.2.0后admin的管理頁面支持中文-->
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
其次在配置文件設(shè)置好端口后,在啟動類上添加注解@EnableAdminServer,啟動項目打開瀏覽器訪問//ip:port即可訪問
2、服務(wù)端訪問權(quán)限設(shè)置
2.1 Spring Security賬號登錄
SBA 默認是沒有權(quán)限驗證的,而生產(chǎn)環(huán)境一定要配置權(quán)限驗證,我們這里通過添加 Spring Security 框架來實現(xiàn)權(quán)限攔截。首先引入相關(guān)依賴
<!--springboot security 安全相關(guān)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
在application.properties里設(shè)置賬號密碼
#配置一個賬號和密碼 spring.security.user.name=admin spring.security.user.password=123456
編寫配置類
/**
* Security安全配置
*/
@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
//項目應(yīng)用路徑
private final String adminContextPath;
public SecuritySecureConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(adminContextPath + "/");
http.authorizeRequests()
//無需登錄即可訪問
.antMatchers(adminContextPath + "/assets/**").permitAll()
.antMatchers(adminContextPath + "/login").permitAll()
//.antMatchers(adminContextPath + "/instances/**").permitAll()
.anyRequest().authenticated()
.and()
//登錄和登出路徑
.formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
.logout().logoutUrl(adminContextPath + "/logout").and()
//開啟http basic支持,admin-client注冊時需要使用
.httpBasic().and()
.csrf()
//開啟基于cookie的csrf保護
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
//忽略這些路徑的csrf保護以便admin-client注冊
.ignoringAntMatchers(
adminContextPath + "/instances",
adminContextPath + "/actuator/**"
);
}
}2.2 客戶端actuator端口保護
另外客戶端是要暴露actuator的web端口的,為了安全,客戶端只允許服務(wù)端請求actuator的web接口,為了方便客戶端區(qū)分請求來源,我們在請求頭注入自定義參數(shù)
/**
* 注入額外的請求頭,方便客戶端區(qū)分請求來源
*/
@Component
public class HttpHeadersProviderConfig implements HttpHeadersProvider {
@Value("${server.port}")
private String port;
@Override
public HttpHeaders getHeaders(Instance instance) {
HttpHeaders httpHeaders = new HttpHeaders();
//設(shè)置約定好的請求頭參數(shù)
httpHeaders.add("spring-boot-admin-service", port);
return httpHeaders;
}
}3、數(shù)據(jù)監(jiān)控與通知
3.1 自帶郵件報警通知
首先引入郵件相關(guān)依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
在 SBA 的配置文件 application.properties 中添加以下收、發(fā)郵箱的配置
# 配置發(fā)送郵箱 spring.boot.admin.notify.mail.from=xxx@qq.com # 配置接收郵箱 spring.boot.admin.notify.mail.to=xxx@qq.com # 配置郵箱 smtp 地址(qq 發(fā)送郵箱的固定 host 是 smtp.qq.com) spring.mail.host=smtp.qq.com # 配置郵箱授權(quán)碼(此處為授權(quán)碼,而非密碼,獲取授權(quán)碼本文下一步有說明),需要開啟郵箱SMTP服務(wù) spring.mail.password=xxxxxx # 配置郵箱的賬戶名(這個是上面配置發(fā)送郵件的賬戶名) spring.mail.username=xxx@qq.com
經(jīng)過以上配置之后,無需添加任何代碼,就可以實現(xiàn)項目狀態(tài)改變的郵件提醒功能了。
3.2 自定義通知
自定義通知,當(dāng)實例狀態(tài)發(fā)生改變,及時通知(發(fā)郵件、企業(yè)微信、釘釘都可以,自己實現(xiàn))
/**
* 自定義通知
* 繼承 AbstractStatusChangeNotifier 類,實現(xiàn)了 doNotify 方法,
* 當(dāng)應(yīng)用狀態(tài)改變的時候會回調(diào) doNotify 方法。
*/
@Component
public class CustomNotifierConfig extends AbstractStatusChangeNotifier {
public CustomNotifierConfig(InstanceRepository repository) {
super(repository);
}
@Override
protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
return Mono.fromRunnable(() -> {
if (event instanceof InstanceStatusChangedEvent) {
System.out.println("實例名稱:"+instance.getRegistration().getName());
System.out.println("實例服務(wù)地址:"+instance.getRegistration().getServiceUrl());
String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();
switch (status) {
case "DOWN":
System.out.println("健康檢查沒通過!");
break;
case "OFFLINE":
System.out.println("服務(wù)離線!");
break;
case "UP":
System.out.println("服務(wù)上線!");
break;
case "UNKNOWN":
System.out.println("服務(wù)未知異常!");
break;
default:
System.out.println(status);
break;
}
}
});
}
}三、SBA客戶端構(gòu)建
1、簡單構(gòu)建
新建工程,導(dǎo)入相關(guān)依賴
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>2.6.6</version> </dependency> <!--查看狀態(tài)信息的--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在application.yml中配置
spring:
# Spring Boot Admin 監(jiān)控服務(wù)器端地址
boot:
admin:
client:
port: 9000
url: http://localhost:${spring.boot.admin.client.port}
# 如果設(shè)置了賬號密碼就需要
username: admin
password: 123456
# 開啟監(jiān)控所有項
management:
endpoints:
#公開所有端點web接口
web:
exposure:
include: '*'
endpoint:
health:
#顯示db、redis、rabbti連接情況等
show-details: always
#啟用端點,默認情況下,除shutdown以外的所有端點均已啟用
shutdown: true
# 具體的日志路徑
logfile:
external-file: xxx
#添加描述
info:
describe: SpringBootAdmin,Test Client Service!
author: shawn
version: 1.0.0配置完啟動后就可以查看相關(guān)監(jiān)控項,具體客戶端的監(jiān)控首頁,有我們在客戶端寫的info信息、磁盤監(jiān)控、堆、非堆內(nèi)存監(jiān)控、進程、線程監(jiān)控、垃圾回收監(jiān)控

2、actuator的web端口安全設(shè)置
客戶端是要暴露actuator的web端口的,為了安全,客戶端只允許服務(wù)端請求actuator的web接口(通過約定好的請求頭來判斷)
/**
* 針對actuator接口做安全限制,只允許服務(wù)端調(diào)用
*/
@WebFilter
@ServletComponentScan
@Component
public class ActuatorFilter implements Filter {
@Value("${spring.boot.admin.client.port}")
private String adminServicePort;
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
//判斷約定好的請求頭參數(shù)
if (request.getRequestURI().contains("/actuator") && !adminServicePort.equals(request.getHeader("spring-boot-admin-service"))){
throw new RuntimeException("抱歉,你無權(quán)限訪問,Actuator端口受保護! Sorry, you have no permission to access it,Actuator port protected!");
}
filterChain.doFilter(servletRequest, servletResponse);
}
}四、總結(jié)
SpringBoot-Admin監(jiān)控Client有兩種模式:
Client端引入spring-boot-admin-starter-client依賴,配置好Server的相關(guān)信息。
將所有Client端注冊到服務(wù)發(fā)現(xiàn)(Eureka)組件中去,同時把Server端也注冊,這樣Server端就可以監(jiān)控所有Client端了,不用對Client都添加依賴。
到此這篇關(guān)于SpringBoot的Admin服務(wù)監(jiān)控詳解的文章就介紹到這了,更多相關(guān)Admin服務(wù)監(jiān)控內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ActiveMQ結(jié)合Spring收發(fā)消息的示例代碼
這篇文章主要介紹了ActiveMQ結(jié)合Spring收發(fā)消息的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
SpringBoot+Vue項目部署上線的實現(xiàn)示例
本文主要介紹了SpringBoot+Vue項目部署上線的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
HttpClient 請求 URL字符集轉(zhuǎn)碼問題
這篇文章主要介紹了HttpClient 請求 URL字符集轉(zhuǎn)碼問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
使用SpringMVC響應(yīng)json格式返回的結(jié)果類型
這篇文章主要介紹了使用SpringMVC響應(yīng)json格式返回的結(jié)果類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Java實現(xiàn)的兩種常見簡單查找算法示例【快速查找與二分查找】
這篇文章主要介紹了Java實現(xiàn)的兩種常見簡單查找算法,結(jié)合具體實例形式分析了java快速查找與二分查找的原理與簡單實現(xiàn)技巧,需要的朋友可以參考下2017-09-09
mybatis簡介與配置_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了mybatis簡介與配置,介紹了MyBatis+Spring+MySql簡單配置,有興趣的可以了解一下2017-09-09
springcloud下hibernate本地化方言配置方式
這篇文章主要介紹了springcloud下hibernate本地化方言配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

