目录

SpringBoot整合可视化监控工具——SpringBoot Admin

目录

父项目

子模块------server

子模块------client

开放监控指标

性能

环境

日志配置

映射

[问题一: 明明项目启动却还是Instance 是 office](#问题一: 明明项目启动却还是Instance 是 office)

[问题二: 记springboot中yml文件最后一位是星号*的写法](#问题二: 记springboot中yml文件最后一位是星号*的写法)


在说软件监控之前,我们先来了解一下软件的发展史,起初的软件多为单体项目,代码量少功能也比较简单,所以如果软件出了问题维护人员是很好定位解决的,但是随着业务量的激增,软件体量也变得很大,尤其是分布式结构的出现使得维护难度变得更大。所以监控软件变得必不可少,监控软件一般作为一个独立的模块被开发出来,监控着各个模块的运行情况,例如CPU、内存、网络IO等情况。早期的监控软件需要我们公司自己来开发,但是开发难度不是每个公司都能hold住的,后来有开发人员将自己写的监控软件开源了出来,这才使得监控变得容易。

现在我们可以使用SpringBoot集成一款GitHub上开源的监控软件SpringBoot Admin来达到这个目的。

好了,说了这么多,到底SpringBoot怎么整合SpringBoot Admin呢,下面给大家介绍。

本次用的开发工具是IDEA2022,SpringBoot版本是2.7.1,项目结构是分布式结构,分别由父项目admin、子模块server、子模块client三个部分组成。

父项目

首先我们新建一个maven工程作为父项目,主要的作用是聚合子模块方便打包、版本管理。我们点击新建项目,找到第一个New Project,为项目起名为admin,点击创建,完成。

子模块------server

这里子模块server的作用是一个监控的项目,它的本质是一个web工程,同样我们点击新建项目,选择SpringBoot项目,起名为server,点击下一步。

勾选上web模块和ops下的server部分,如下图,最后点击创建,完成。

我这里推荐勾选选择,如果你的项目已经创建好了,也可以通过引入依赖的方式来整合,依赖如下,

复制代码
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.7.1</version>
</dependency>

到此为止我们的监控项目就建好了,接下来需要注解开启监控,在server的启动类上加上@EnableAdminServer注解,这样就大功告成了!

最后启动spring项目在浏览器输入**http://localhost:8080/applications**就进入监控页面了!

此时我们可以看到被监控的应用数为0,这是因为我们还没有新建被监控的子模块,接下来我们新建一个子模块。

子模块------client

上述步骤完成之后我们需要建立一个子模块被监控,本质也是一个web项目。同server一样我们新建一个SpringBoot项目,点击下一步。

这里需要勾选的也是web模块,不同的是这次ops变成了client,如下图,点击创建,完成。

这里我同样推荐方式,如果你的项目已经建立,则可以引入依赖,依赖如下

复制代码
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.7.1</version>
</dependency>

这样我们就建好了一个被监控的web项目,因为它是一个web项目,所以我们需要先将它的端口改成与server不同的以免冲突,这里我改成了8081,配置文件中还需要加上一个配置spring.boot.admin.client.url,这个配置的意思是被监控的信息要发到哪个服务器,所以这里我们写上server的url如下图。

这些完成之后我们就可以启动client了,点击启动按钮,等待几秒钟,我们刷新刚才打开的页面,可以发现被监控的实例数变成了1,这样就被监控了!

点击这个实例,我们跳到详情页,可以看到它是处于启动状态。

如果你看到这里可能会有疑问,为什么就这一个指标?这是默认的指标,我们需要配置来开放更多的指标出来。

开放监控指标

我们打开client的配置文件,在其中加上下面两个配置,如图所示。然后重启项目。

复制代码
#开放指定信息给服务器看
management.endpoint.health.show-details=always
management.endpoints.web.exposure.include= *

刷新页面,你会发现新增了很多新指标!

那么接下来我介绍一下这两个配置的作用,

第一个配置 management.endpoint.health.show-details=always对应右侧的健康明细,包括磁盘使用情况,线程进程情况。

***第二个配置 management.endpoints.web.exposure.include= ****指的是左侧除了健康状况以外的其他监控项,例如日志配置、缓存、类等。这里的"*"号代表开放所有。

我挑几个比较常用的给大家介绍。

性能

性能可以看出各个模块启动的时间,也可以添加别的指标。

环境

这里的环境包括运行环境,jre版本等信息。

日志配置

日志配置可以更改对应的实例中的日志级别。

映射

映射可以看到项目中所有的接口信息。

这就是一些常用的指标,其中还有几个没有介绍到的,大家可以根据自己项目的使用情况去添加。

问题一: 明明项目启动却还是Instance 是 office

http://192.168.0.66:22586/actuator/health 访问超时

Actuator Health 超时导致 Spring Boot Admin 反复 Offline / Up 的临时解决方案

复制代码
#开放端点用于SpringBoot Admin的监控
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always
  health:
    redis:
      enabled: false

问题二: 记springboot中yml文件最后一位是星号*的写法

网上看到是写在properties的

复制代码
management.endpoints.web.exposure.include=*

在自己的项目是yml的

复制代码
management:

  endpoints:

    web:

      exposure:

        include: *

写成这样会报错:

复制代码
Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning an alias in 'reader', line 69, column 18: include: * ^ expected alphabetic or numeric character, but found

后来找了原因,原来不能直接写 * ,要双引号括起来的

复制代码
management:

  endpoints:

    web:

      exposure:

        include: "*"

问题三(客户端发生): Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

解决方法: https://blog.csdn.net/cxclll/article/details/126745903

问题四: springbootadmin日志开启后无法更新日志信息

复制代码
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!--  日志存放路径  -->
    <property name="log.path" value="sinosoft_framwork_logs"/>
    <!--  日志输出格式  -->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
    <!--  控制台输出  -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%highlight${log.pattern}</pattern>
        </encoder>
    </appender>
    <!--  系统日志输出  -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/info.log</file>
        <!--  循环政策:基于时间创建日志文件  -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--  日志文件名格式  -->
            <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--  日志最大的历史 30天  -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--  过滤的级别  -->
            <level>INFO</level>
            <!--  匹配时的操作:接收(记录)  -->
            <onMatch>ACCEPT</onMatch>
            <!--  不匹配时的操作:拒绝(不记录)  -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/error.log</file>
        <!--  循环政策:基于时间创建日志文件  -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--  日志文件名格式  -->
            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--  日志最大的历史 30天  -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--  过滤的级别  -->
            <level>ERROR</level>
            <!--  匹配时的操作:接收(记录)  -->
            <onMatch>ACCEPT</onMatch>
            <!--  不匹配时的操作:拒绝(不记录)  -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--  系统模块日志级别控制   -->
    <logger name="com.yuncheng" level="info"/>
    <!--  Spring日志级别控制   -->
    <logger name="org.springframework" level="warn"/>
    <!-- myibatis 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"/>
    <root level="info">
        <appender-ref ref="console"/>
    </root>
    <!-- 系统操作日志 -->
    <root level="info">
        <appender-ref ref="file_info"/>
        <appender-ref ref="file_error"/>
    </root>
</configuration>

# log4j2.xml中有详细的日志配置
logging:
  #config: classpath:config/log4j2.xml
  file:
    # 日志文件 日志  spring admin boot日志输出配置,需要跟logback-spring.xml配置中日志路径一致
    path: sinosoft_framwork_logs/springbootadmin.log    #开启Spring Boot Admin 来动态的配置项目中的日志级别和日志文件。

Spring Boot Admin,贼好使 - 知乎

好了,SpringBoot Admin这款监控软件就介绍到这里,如果你项目中的子模块特别多的话也可以多添加几个client,我这里只用了一个client举例,最后希望我的分享能帮助到你。

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
.生产的驴2 小时前
SpringBoot 接口限流Lua脚本接合Redis 服务熔断 自定义注解 接口保护
java·大数据·数据库·spring boot·redis·后端·lua
一切皆有迹可循2 小时前
SpringBoot整合MinIO快速入门:实现分布式文件存储与管理
spring boot·分布式·后端
洛可可白3 小时前
Spring Boot中自定义注解的创建与使用
java·spring boot·后端
Alkaid:4 小时前
解决Long类型前端精度丢失和正常传回后端问题
java·前端·javascript·vue.js
唐人街都是苦瓜脸4 小时前
Java RPC 框架是什么
java·开发语言·rpc
追逐时光者4 小时前
一款 .NET 开源、免费、轻量级且非侵入性的防火墙软件
后端·.net
魔道不误砍柴功4 小时前
Java性能调优2025:从JVM到Kubernetes的全链路优化策略
java·jvm·kubernetes
爱吃鱼饼的猫5 小时前
【SpringBoot篇】如何使用CommandLineRunner实现缓存预热
spring boot·spring·缓存
多云的夏天5 小时前
C++-FFmpeg-(5)-1-ffmpeg原理-ffmpeg编码接口-AVFrame-AVPacket-最简单demo
java·开发语言
无名之逆5 小时前
[特殊字符] Hyperlane:Rust 高性能 HTTP 服务器库,开启 Web 服务新纪元!
java·服务器·开发语言·前端·网络·http·rust