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)機(jī)制注冊到 SBA 中,然后就可以實現(xiàn)對 Spring Boot 項目的可視化管理和查看了。
Spring Boot Admin 可以監(jiān)控 Spring Boot 單機(jī)或集群項目,它提供詳細(xì)的健康 (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 默認(rèn)是沒有權(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保護(hù) .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) //忽略這些路徑的csrf保護(hù)以便admin-client注冊 .ignoringAntMatchers( adminContextPath + "/instances", adminContextPath + "/actuator/**" ); } }
2.2 客戶端actuator端口保護(hù)
另外客戶端是要暴露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 #啟用端點,默認(rèn)情況下,除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)控、進(jì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端口受保護(hù)! 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)文章
Spring Boot構(gòu)建優(yōu)雅的RESTful接口過程詳解
這篇文章主要介紹了spring boot構(gòu)建優(yōu)雅的RESTful接口過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08Spring Boot Admin(監(jiān)控工具)的使用
今天我們將會講解一個優(yōu)秀的監(jiān)控工具Spring Boot Admin。 它采用圖形化的界面,讓我們的Spring Boot管理更加簡單,需要的朋友可以參考下2020-02-02Spring MVC Interceptor 實現(xiàn)性能監(jiān)控的功能代碼
本篇文章主要介紹了Spring MVC Interceptor 實現(xiàn)性能監(jiān)控的功能代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09Java實現(xiàn)的微信圖片處理工具類【裁剪,合并,等比例縮放等】
這篇文章主要介紹了Java實現(xiàn)的微信圖片處理工具類,可實現(xiàn)針對圖片的裁剪、合并、等比例縮放、旋轉(zhuǎn)、識別等各種常見的圖片處理功能,需要的朋友可以參考下2017-11-11