SpringBootAdmin + SpringCloud 整合 [視頻教程]



此文的配套視頻: 稍后放出

使用SpringBoot Admin 進行日志的記錄

SpringBootAdmin用來管理和監控SpringBoot、SpringCloud 應用程序,它利用spring-boot-starter-actuator提供的功能,將各個微服務的狀態整合到一起,並提供良好的界面查看支持,並且能夠動態的修改實例日志級別。SpringBootAdmin分為server端和client端,server端可查看各個微服務的狀態,client端將微服務注冊到server端。

1、SpringBoot Admin 簡介

使用SpringBoot Admin進行日志的記錄,可以很輕松的是實現對SpringBoot、SpringCloud項目運行狀態的監控。Spring Boot Admin本身也是一個Web應用,每個Spring Boot應用程序都被視為客戶端並注冊到管理服務器。

Spring Boot Admin是一個開源社區項目,用於管理和監控SpringBoot應用程序。 應用程序作為Spring Boot Admin Client向為Spring Boot Admin Server注冊(通過HTTP)或使用SpringCloud注冊中心(例如Eureka,Nacos)發現。 UI是的Vue.js應用程序,展示Spring Boot Admin Client的Actuator端點上的一些監控。常見的功能如下:

  • 顯示健康狀況
  • 顯示詳細信息,例如
  • JVM和內存指標
  • micrometer.io指標
  • 數據源指標
  • 緩存指標
  • 顯示內部信息
  • 關注並下載日志文件
  • 查看JVM系統和環境屬性
  • 查看Spring Boot配置屬性
  • 支持Spring Cloud的可發布/ env-和// refresh-endpoint
  • 輕松的日志級別管理
  • 與JMX-beans交互
  • 查看線程轉儲
  • 查看http-traces
  • 查看審核事件
  • 查看http端點
  • 查看預定的任務
  • 查看和刪除活動會話(使用spring-session)
  • 查看Flyway / Liquibase數據庫遷移
  • 下載heapdump
  • 狀態更改通知(通過電子郵件,Slack,Hipchat等)
  • 狀態更改的事件日志(非持久性)

Git地址:https://github.com/codecentric/spring-boot-admin

文檔地址:https://codecentric.github.io/spring-boot-admin/2.1.6/#getting-started

Spring Boot Admin 背后的數據采集是由Spring Boot Actuator端點提供。actuator相關映射,啟動時會自動加載

啟動時加載的 actuator相關映射

2、使用 SpringBoot Admin 監控服務

Admin-Server並注冊到Nacos:創建一個SpringBoot項目,命名為provider-monitor,引入如下SpringCloud、Nacos、SpringBoot Admin的依賴:

1.1 導入依賴

        <!-->spring-boot-admin-starter-server-->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>${spring-boot-admin.version}</version>
        </dependency>

        <!--健康檢查-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

版本需要配套,否則會拋出異常:

    <spring-boot.version>2.0.8.RELEASE</spring-boot.version>
    <spring-boot-admin.version>2.0.0</spring-boot-admin.version>
 

1.2 配置yml

#### 暴露端點
management:
  endpoints:
    web:
     base-path: "/actuator"  # 配置 Endpoint 的基礎路徑
     exposure:
        include: '*'  #在yaml 文件屬於關鍵字,所以需要加引號
  endpoint:
    logfile:
      # spring boot admin  client不配置日志文件路徑(同時配置logback-spring.xml對應的日志輸出配置,否則無法輸出日志),
      # 控制台上的Logging模塊下的Logfile會報錯:Fetching logfile failed.Request failed with status code 404
      external-file: E:/logs/service-provider-demo/logs/output.log
      enabled: true
    health:
      show-details: always
    # 未配置/注釋 以下內容
#  boot:
#    admin:
#      context-path: consumer

1.3 集成spring security

官方說明:

由於有多種方法可以解決分布式Web應用程序中的身份驗證和授權,因此Spring Boot Admin不會提供默認方法。默認情況下spring-boot-admin-server-ui提供登錄頁面和注銷按鈕。

我們這里采用spring security提供安全保障,在Spring Boot Admin Server中統一配置

Web應用程序中的身份驗證和授權有多種方法,因此Spring Boot Admin不提供默認方法。默認情況下,spring-boot-admin-server-ui提供登錄頁面和注銷按鈕。我們結合 Spring Security 實現需要用戶名和密碼登錄的安全認證。

sc-admin-server工程的pom文件需要增加以下的依賴:

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

在 sc-admin-server工的配置文件 application.yml 中配置 spring security 的用戶名和密碼,這時需要在服務注冊時帶上 metadata-map 的信息,如下:

spring:
  security:
    user:
      name: "admin"
      password: "admin"
      
eureka:
  instance:
    metadata-map:
      user.name: ${spring.security.user.name}
      user.password: ${spring.security.user.password}

@EnableWebSecurity注解以及WebSecurityConfigurerAdapter一起配合提供基於web的security。繼承了WebSecurityConfigurerAdapter之后,再加上幾行代碼,我們就能實現要求用戶在進入應用的任何URL之前都進行驗證的功能,寫一個配置類SecuritySecureConfig繼承WebSecurityConfigurerAdapter,配置如下:

@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 {
        // @formatter:off
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(adminContextPath + "/");

        http.authorizeRequests()
                //授予對所有靜態資產和登錄頁面的公共訪問權限。
                .antMatchers(adminContextPath + "/assets/**").permitAll()
                .antMatchers(adminContextPath + "/login").permitAll()
                //必須對每個其他請求進行身份驗證
                .anyRequest().authenticated()
                .and()
                //配置登錄和注銷
                .formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
                .logout().logoutUrl(adminContextPath + "/logout").and()
                //啟用HTTP-Basic支持。這是Spring Boot Admin Client注冊所必需的
                .httpBasic().and();
        // @formatter:on
    }
}

1.4 啟動器類

添加 @EnableAdminServer 注解

package com.crazymaker.springcloud.adminserver;

import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableAdminServer
@EnableDiscoveryClient
public class AdminServerApplication {

    public static void main(String[] args) {
        SpringApplication.run( AdminServerApplication.class, args );
    }
}


admin 會自己拉取 Eureka 上注冊的 app 信息,主動去注冊。這也是唯一區別之前入門中手動注冊的地方,就是 client 端不需要 admin-client 的依賴,也不需要配置 admin 地址了,一切全部由 admin-server 自己實現。這樣的設計對環境變化很友好,不用改了admin-server后去改所有app 的配置了。

1.5、測試

在這里插入圖片描述

在這里插入圖片描述

3.actuator 啟用和暴露端點

執行器端點使您可以監視應用程序並與之交互。Spring Boot包含許多內置端點,您可以添加自己的端點。例如,health端點提供基本的應用程序運行狀況信息。

每個端點都可以啟用或禁用。這控制了是否創建了端點以及它的bean在應用程序上下文中是否存在。為了可以遠程訪問,端點還必須通過JMX或HTTP公開。大多數應用程序選擇HTTP,其中終結點的ID和前綴/actuator映射到URL。例如,默認情況下,health端點映射到/actuator/health。

端點列表:

ID 描述
auditevents 公開當前應用程序的審核事件信息。需要一個AuditEventRepositoryBean。
beans 顯示應用程序中所有Spring Bean的完整列表。
caches 公開可用的緩存。
conditions 顯示在配置和自動配置類上評估的條件以及它們匹配或不匹配的原因。
configprops 顯示所有的整理列表@ConfigurationProperties。
env 公開Spring的屬性ConfigurableEnvironment。
flyway 顯示已應用的所有Flyway數據庫遷移。需要一個或多個FlywayBean。
health 顯示應用程序運行狀況信息。
httptrace 顯示HTTP跟蹤信息(默認情況下,最近100個HTTP請求-響應交換)。需要一個HttpTraceRepositoryBean。
info 顯示任意應用程序信息。
integrationgraph 顯示Spring Integration圖。需要對的依賴spring-integration-core。
loggers 顯示和修改應用程序中記錄器的配置。
liquibase 顯示已應用的所有Liquibase數據庫遷移。需要一個或多個LiquibaseBean。
metrics 顯示當前應用程序的“指標”信息。
mappings 顯示所有@RequestMapping路徑的整理列表。
scheduledtasks 顯示應用程序中的計划任務。
sessions 允許從Spring Session支持的會話存儲中檢索和刪除用戶會話。需要使用Spring Session的基於Servlet的Web應用程序。
shutdown 使應用程序正常關閉。默認禁用。
threaddump 執行線程轉儲。

如果您的應用程序是Web應用程序(Spring MVC,Spring WebFlux或Jersey),則可以使用以下附加端點:

ID 描述
heapdump 返回hprof堆轉儲文件。
jolokia 通過HTTP公開JMX bean(當Jolokia在類路徑上時,不適用於WebFlux)。需要對的依賴jolokia-core。
logfile 返回日志文件的內容(如果已設置logging.file.name或logging.file.path屬性)。支持使用HTTP Range標頭來檢索部分日志文件的內容。
conditions 顯示在配置和自動配置類上評估的條件以及它們匹配或不匹配的原因。
prometheus 以Prometheus服務器可以抓取的格式公開指標。需要對的依賴micrometer-registry-prometheus。

3.1 啟用端點

默認情況下,除了shutdown端點是關閉的,其它的都是啟用的。

management.endpoint.<id>.enabled

1)啟用shutdown端點

management.endpoint.shutdown.enabled=true

2)關閉默認端點

management.endpoints.enabled-by-default=false

3)啟用info端點

management.endpoint.info.enabled=true
  • 禁用的端點將從應用程序上下文中完全刪除。
  • 如果只想更改公開端點的技術,請使用include和exclude屬性。

3.2 暴露端點

停止公開所有在JMX上公開的端點,只公開info和health兩個端點,使用如下屬性:

management.endpoints.jmx.exposure.include=health,info

通過HTTP公開所有的端點,除了env和beans端點,使用如下的屬性:

management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans

[端點參考資料]:Spring Boot Actuator

4.微服務Provider改造

對前面的 service-consumer-demo、service-provider-demo 兩個微服務進行改造, 加入spring-boot-admin的監控。

4.1 導入依賴



    <!-- admin-client -->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-client</artifactId>
    </dependency>

  

2.2 配置yml

# 服務名
spring:
  application:
    name: admin-client
  # 指定admin監控中心地址
  boot:
    admin:
      client:
        url: http://localhost:9009
# 服務端口
server:
  port: 9010

# 定義日志文件輸出路徑  [注釋后 不顯示 本服務的 logfile 模塊]
logging:
  file: E:/data/adminTest/logs/output.log

# include 暴露端點
management:
  endpoints:
    web:
      exposure:
        include: '*'
# 在訪問/actuator/health時顯示完整信息
  endpoint:
    health:
      show-details: always

使用context-path

很多時候項目由於模塊比較多,通常會配置servlet的context-path屬性增加一節路徑加以區分不同服務,如下

server:
  port: 8005
  servlet:
    context-path: /activity

這時候actuator訪問路徑就是http://ip:port/activity/actuator SpringBoot Admin是沒法識別到的,actuator默認訪問的還是http://ip:port/actuator,這時候需要我們進行配置management的context-path屬性,如下

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.36:8848
        metadata:
          management:
            context-path: ${server.servlet.context-path}/actuator

加上spring security密碼

在Spring Boot Admin Server中統一配置采用spring security提供安全保障,客戶端需要配置security賬號密碼,服務注冊時帶上metadata-map信息.

5 實現在線日志查看

具體操作:

5.1、添加jar包

org.slf4j slf4j-api 1.7.25

5.3 在application.yml平級文件夾中添加logback-spring.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="APP_Name" value="adminTest"/> 
    <contextName>${APP_Name}</contextName>
    <!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑,請根據需求配置路徑-->  
    <property name="LOG_HOME" value="E:/data/adminTest/logs"/>
     
    <!-- 彩色日志依賴的渲染類 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
   <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="adminTest >> ${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(LN:%L){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
        
   <!-- 控制台輸出 -->   
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
        
   <!-- 按照每天生成日志文件 -->   
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/output.log</file>   
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--日志文件輸出的文件名-->
        <FileNamePattern>${LOG_HOME}/output-%d{yyyy-MM-dd}.log</FileNamePattern> 
        <!--日志文件保留天數-->
           <MaxHistory>30</MaxHistory>
        </rollingPolicy>
          
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
        <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> 
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>   
        </encoder>
    </appender>
        
    <!-- show parameters for hibernate sql 專為 Hibernate 定制 --> 
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="WARN"/>
    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="WARN"/>
    <logger name="org.hibernate.SQL" level="WARN"/>
    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG"/>
    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="WARN"/>
     
    <!--mybatis log configure-->
    <logger name="com.apache.ibatis" level="WARN"/>
    <logger name="java.sql.Connection" level="WARN"/>
    <logger name="java.sql.Statement" level="WARN"/>
    <logger name="java.sql.PreparedStatement" level="WARN"/>
    <logger name="org.apache.shiro" level="WARN"/>
    <logger name="springfox.documentation" level="WARN"/>

    <!-- 日志輸出級別,注意:如果不寫<appender-ref ref="FILE" /> ,將導致springboot Admin找不到文件,無法查看日志 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

log.path 如何使用環境變量呢?

某些情況下需要變量設置個默認值,以防出現比較惡心的 _IS_UNDEFINED 后綴( log4j不存在的變量會留空)
只要使用" :- " 操作符即可(冒號+減號)。
比如 log.path 沒有定義, 使用該變量的地方就會變成** log.path_IS_UNDEFINED**, 給他一個默認值

${log.path:-/var/logs/myapp}

4.4 actuator的配置

#### 暴露端點
management:
  endpoints:
    web:
     base-path: "/actuator"  # 配置 Endpoint 的基礎路徑
     exposure:
        include: '*'  #在yaml 文件屬於關鍵字,所以需要加引號
  endpoint:
    logfile:
      # spring boot admin  client不配置日志文件路徑(同時配置logback-spring.xml對應的日志輸出配置,否則無法輸出日志),
      # 控制台上的Logging模塊下的Logfile會報錯:Fetching logfile failed.Request failed with status code 404
      external-file: E:/logs/service-provider-demo/logs/output.log
      enabled: true
    health:
      show-details: always
    # 未配置/注釋 以下內容
#  boot:
#    admin:
#      context-path: consumer

四、測試結果

1.不暴露端點 測試

# 未配置/注釋 以下內容
management:
  endpoints:
    web:
      exposure:
        include: "*"
123456

監控中心后台 除Detials外 所有功能失效不暴露端點

3.正常情況

控制台 打印的 項目前綴
控制台 打印的 項目前綴
訪問 localhost[Ip地址]:端口號 即可
本案例中訪問 http://localhost:9009 即可進入監控中心
logfile模塊 查看日志詳情
logfile模塊 查看日志詳情
測試結果

可以通過springbootAdmin調整各個包下的日志等級,相當方便

6 與Nacos(或Eureka)結合的好處

到這里就結束,可以直接啟動。admin會自己拉取Nacos(或Eureka)上注冊的Provider信息,主動去注冊。

這也是唯一區別之前手動注冊的地方,就是Provider 端不需要配置admin地址了,一切全部由admin-server自己實現。

這樣的,不用在改了admin-server之后,強制去改所有Provider的配置了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM