欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot的Admin服務(wù)監(jiān)控詳解

 更新時間:2024年01月27日 10:23:02   作者:魅Lemon  
這篇文章主要介紹了SpringBoot的Admin服務(wù)監(jiān)控詳解,Spring Boot Admin(SBA)是一個開源的社區(qū)項目,用于管理和監(jiān)控 Spring Boot 應(yīng)用程序,需要的朋友可以參考下

一、介紹

1、SBA簡介

官網(wǎng)參考文檔

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)文章

最新評論