1. 程式人生 > 實用技巧 >SpringBootAdmin + SpringCloud 整合 [視訊教程]

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相關對映,啟動時會自動載入

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模組 檢視日誌詳情

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

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

到這裡就結束,可以直接啟動。admin會自己拉取Nacos(或Eureka)上註冊的Provider資訊,主動去註冊。

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

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