Spring Cloud筆記(6)使用Spring Boot Admin監(jiān)控服務(wù)

微服務(wù)的核心思想就是拆分業(yè)務(wù),將單個(gè)系統(tǒng)按業(yè)務(wù)邊界切分為多個(gè)可獨(dú)立部署的微服務(wù)子系統(tǒng)。這樣可以讓系統(tǒng)更容易擴(kuò)展,更快速的迭代,但必然會(huì)導(dǎo)致系統(tǒng)內(nèi)服務(wù)實(shí)例數(shù)量的大量增加,再加上服務(wù)實(shí)例可能部署到不同的操作系統(tǒng)和網(wǎng)段,對(duì)整個(gè)系統(tǒng)進(jìn)行管理和監(jiān)控的難度比單系統(tǒng)環(huán)境要高出不少。幸運(yùn)的是,針對(duì)Spring Boot技術(shù)體系我們有一個(gè)開箱即用的系統(tǒng)監(jiān)控解決方案——Spring Boot Admin,對(duì)于中小規(guī)模的微服務(wù)系統(tǒng),它幾乎可以提供一切必要的監(jiān)控需求,而且更重要的是它對(duì)于業(yè)務(wù)系統(tǒng)是非侵入性的,只需要幾行配置就可以將一個(gè)基于Spring Boot技術(shù)開發(fā)的應(yīng)用納入到監(jiān)控之中。

Spring Boot Admin分為兩部分:client和server。client為被監(jiān)控端,通過(guò)集成Spring Boot Actuator組件暴露出各種監(jiān)控指標(biāo)和信息,并注冊(cè)到一個(gè)server端;server端接受client的注冊(cè),并定時(shí)查詢client端提供的監(jiān)控信息,管理員可以通過(guò)server端內(nèi)置的一個(gè)web應(yīng)用查看client的各項(xiàng)指標(biāo)和信息。

現(xiàn)在我們就來(lái)利用Spring Boot Admin來(lái)為Spring Cloud Demo項(xiàng)目加入服務(wù)指標(biāo)監(jiān)控的功能。首先來(lái)創(chuàng)建一個(gè)monitor模塊,作為Spring Boot Admin的server端,在pom.xml中加入如下配置:

    <!--spring-boot-admin-starter-server必須和spring-boot的版本匹配,2.1.X的版本無(wú)法在spring boot 2.2.0以上的版本運(yùn)行-->
     <dependency>
        <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

項(xiàng)目啟動(dòng)類中需要加入一個(gè)@EnableAdminServer的注解:

@SpringBootApplication
@EnableAdminServer
public class MonitorApplication {
    public static void main(String[] args) {
        SpringApplication.run(MonitorApplication.class, args);
    }
}

application.yml配置文件只需要加入consul的相關(guān)配置即可,用于尋找其它被監(jiān)控的client。Spring Boot Admin的客戶端有兩種注冊(cè)方式,第一種是在被監(jiān)控的服務(wù)客戶端直接引入spring-boot-admin-starter-client,并配置server端的監(jiān)控地址,主動(dòng)向server端進(jìn)行注冊(cè),這種一般用于監(jiān)控獨(dú)立的應(yīng)用;第二種就是和Spring Cloud體系相匹配的,通過(guò)服務(wù)注冊(cè)中心直接尋找需要被監(jiān)控的客戶端信息,在我們的demo里面就是consul,在consul中注冊(cè)了的服務(wù)會(huì)直接成為Spring Boot Admin的client。

這樣的話,我們demo里面的服務(wù)提供方只需要做很小的改造即可接入Spring Boot Admin的監(jiān)控體系。主要就是加入Spring Boot Actuator支持,通過(guò)該框架來(lái)暴露出各種監(jiān)控指標(biāo)的,這樣server端才能夠?qū)ΡO(jiān)控指標(biāo)進(jìn)行匯總和圖形化展示。demo的parent項(xiàng)目之前已經(jīng)添加了Spring Boot Actuator的依賴,但是默認(rèn)只會(huì)暴露出一個(gè)/actuator/heath的接口,這對(duì)我們的監(jiān)控來(lái)說(shuō)是遠(yuǎn)遠(yuǎn)不夠的,所以還需要在每個(gè)服務(wù)提供方暴露出更多的監(jiān)控指標(biāo)。具體來(lái)說(shuō),就是在配置文件中加入以下Actuator的配置:

#輸出監(jiān)控指標(biāo)用于服務(wù)監(jiān)控,暴露的監(jiān)控指標(biāo)可根據(jù)實(shí)際情況調(diào)整
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: ALWAYS
#如果要在Spring boot admin中查看日志,需要指定存儲(chǔ)的文件
logging:
  file: ./logs/order-service.log

現(xiàn)在將服務(wù)全部啟動(dòng),訪問(wèn)monitor的地址http://localhost:9010,就可以看到Spring boot admin的監(jiān)控頁(yè)面了:

監(jiān)控首頁(yè).png

需要注意的是,Spring Boot Admin完全依賴Actuator暴露的接口進(jìn)行監(jiān)控,如果沒有實(shí)現(xiàn)這些接口,默認(rèn)就會(huì)顯示離線(比如consul實(shí)例實(shí)際上是在線的)。進(jìn)入到具體的某個(gè)服務(wù),可以看到更多的監(jiān)控指標(biāo),還能夠在線查看日志和修改logger的日志級(jí)別:
明細(xì)信息.png

Spring Boot Admin還支持對(duì)標(biāo)題和UI進(jìn)行部分的定制,具體的配置項(xiàng),可參考官方文檔

monitor模塊可以收集到應(yīng)用的一些敏感信息,如果需要暴露到外網(wǎng)進(jìn)行查看,就必須添加相關(guān)的安全措施。我們可以通過(guò)spring security框架,快速為server端添加相應(yīng)的用戶登錄驗(yàn)證功能。首先在monitor中加入spring security的依賴:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

然后編寫一個(gè)Spring Security的配置類,驗(yàn)證規(guī)則可根據(jù)實(shí)際情況進(jìn)行修改:

@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
    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 + "/actuator/health").permitAll()
                .anyRequest().authenticated()
                .and()
                 //login登錄頁(yè)是spring boot admin ui里面已經(jīng)集成了的
                .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
                .logout().logoutUrl(adminContextPath + "/logout").and()
                .httpBasic().and()
                .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                .ignoringAntMatchers(
                        adminContextPath + "/instances",
                        adminContextPath + "/actuator/**"
                );
    }
}

重新啟動(dòng)后,再次訪問(wèn)monitor模塊,就需要進(jìn)行登錄驗(yàn)證了:


登錄頁(yè)面.png

登錄的用戶名和密碼可以在application.yml中配置:

spring:
  #允許登錄監(jiān)控系統(tǒng)的用戶名和密碼
  security:
    user:
      name: admin
      password: 123456

需要注意的是,如果沒有使用注冊(cè)中心,而是通過(guò)spring-boot-admin-starter-client的方式直接向server端注冊(cè)的client,還需要加入server端的驗(yàn)證信息才能成功注冊(cè),類似像這樣:

spring
    boot:
      admin:
        client:
          #server端的注冊(cè)地址
          url: http://localhost:9010
          username: admin
          password: 123456
          instance:
            #client的訪問(wèn)地址前綴,server通過(guò)該地址獲取監(jiān)控信息
            service-base-url: http://192.168.1.252:8090

本文的相關(guān)代碼可以查看這里 spring-cloud-demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容