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的配置了。

posted @ 2021-01-11 20:24  疯狂创客圈  阅读(498)  评论(0编辑  收藏  举报