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

目录

父项目

子模块——server

子模块——client

开放监控指标

性能

环境

日志配置

映射

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

问题二: 记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

SpringBoot Admin OFFLINE_java

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

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

SpringBoot Admin OFFLINE_spring_02

SpringBoot Admin OFFLINE_spring_03

#开放端点用于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日志开启后无法更新日志信息

日志配置——logging.file.name与logging.file.path的使用_坑我是埋定了的博客-CSDN博客

# log4j2.xml中有详细的日志配置
logging:
  config: classpath:config/log4j2.xml
  file:
    # 日志文件 日志  spring admin boot日志输出配置,需要跟logback-spring.xml配置中日志路径一致
    #path: sinosoft_framwork_logs/info.log  #开启Spring Boot Admin 来动态的配置项目中的日志级别和日志文件。
    name: sinosoft_framwork_logs/infoLog.log  # logging.file.name和logging.file.path不能同时生效
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30" packages="com.sinosoft.springbootplus.log4j2" >
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
        <Property name="APP_LOG_ROOT">sinosoft_framwork_logs/</Property>
        <property name="CHARSET">UTF-8</property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}" charset="${CHARSET}"/>
        </Console>
        <RollingRandomAccessFile  name="infoLog"
                                  immediateFlush="false" bufferSize="4096"
                                  fileName="${APP_LOG_ROOT}/infoLog.log"
                                  filePattern="${APP_LOG_ROOT}/infoLog-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${LOG_PATTERN}"  charset="${CHARSET}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="102400KB" />
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${APP_LOG_ROOT}" maxDepth="2" followLinks="true">
                    <IfFileName glob="infoLog-*.log.gz"/>
                    <IfLastModified age="30d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile >
        <RollingRandomAccessFile  name="errorLog"
                                  immediateFlush="false" bufferSize="4096"
                                  fileName="${APP_LOG_ROOT}/errorLog.log"
                                  filePattern="${APP_LOG_ROOT}/errorLog-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="${LOG_PATTERN}"  charset="${CHARSET}"/>
            <Filters>
                <!--ERROR级别以上的所有日志-->
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <Policies>
                <SizeBasedTriggeringPolicy size="102400KB" />
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${APP_LOG_ROOT}" maxDepth="2" followLinks="true">
                    <IfFileName glob="errorLog-*.log.gz"/>
                    <IfLastModified age="90d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile >
        <ConsoleLogAppender >
            <PatternLayout pattern="%msg"  charset="${CHARSET}"/>
        </ConsoleLogAppender>
        <ConsoleLogParamAppender>
            <PatternLayout pattern="%msg"  charset="${CHARSET}"/>
        </ConsoleLogParamAppender>
    </Appenders>
    <Loggers>

        <AsyncLogger  name="com.sinosoft.springbootplus" additivity="false" level="debug">
            <!--上生产要打开此处额appender-->
            <AppenderRef ref="infoLog" />
            <AppenderRef ref="errorLog" />
            <AppenderRef ref="Console" />
        </AsyncLogger >
        <AsyncLogger name="sinosoft.consoleLog" additivity="false">
            <AppenderRef ref="consoleLog" />
        </AsyncLogger>
        <AsyncLogger name="sinosoft.consoleLogParam" additivity="false">
            <AppenderRef ref="consoleLogParam" />
        </AsyncLogger>
        <!-- <Logger  name="com.sinosoft.springbootplus" additivity="false" >
             <AppenderRef ref="infoLog" />
             <AppenderRef ref="errorLog" />
         </Logger >-->
        <!-- 解决SpringBootAdmin错误日志问题 -->
        <logger name="org.apache.catalina.connector.CoyoteAdapter" level="OFF"/>
        <Root level="info">
            <AppenderRef ref="infoLog" />
            <AppenderRef ref="errorLog" />
        </Root>
    </Loggers>
</Configuration>
server:
  port: 8070
  servlet:
    context-path: /
# email
spring:
  mail:
    # 配置邮箱 smtp 地址(qq 发送邮箱的固定 host 是 smtp.qq.com)
    host: smtp.qq.com
    # 你的邮箱
    username: 1345592047@qq.com
    # 你的授权码
    password: kpddccybsvqfibbb
    default-encoding: UTF-8
#    # ????
#    port: 465
#    properties:
#      mail:
#        smtp:
#          auth: true
#          socketFactory:
#            port: 465
#            class: javax.net.ssl.SSLSocketFactory
#            fallback: false
#          starttls:
#            enable: true
#            required: true
  boot:
    admin:
      notify:
        mail:
          # 开启
          enabled: true
          # 接收人
          to: 872268102@qq.com, 563053676@qq.com, 354200205@qq.com
          # 发送人
          from: 1345592047@qq.com
          # ????????
          ignore-changes: {"UNKNOWN:UP"}
      ui:
        public-url: http://springbootadmin.lft.zqxx.wuguobao.com:80
logging:
  file:
    path: sinosoft_framwork_logs/springbootadmin.log  #开启Spring Boot Admin 来动态的配置项目中的日志级别和日志文件。

 

Spring Boot Admin,贼好使 - 知乎

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是一个用于简化创建独立的,基于生产级别的Spring应用程序的框架。它提供了一种快速开发的方式,可以帮助我们更轻松地构建可扩展和高效的应用程序。 大屏可视化是指将数据以图表、仪表盘等形式展示在大屏幕上,以便于人们直观地理解和分析数据。而在Spring Boot中,我们可以利用其简便的配置和强大的功能来实现大屏可视化。 在spring-boot-starter-web的基础上,我们可以引入一些可视化库或框架,如Echarts、D3.js等,来实现大屏可视化。通过这些库或框架,我们可以根据业务需求,自定义各种图表、仪表盘、地图等展示形式,并将数据以JSON格式传递给前端页面。 而在后端,我们可以使用Spring Boot中的Web MVC框架,通过编写Controller来处理保存数据的逻辑,并将处理好的数据传递给前端页面进行展示。同时,我们还可以利用Spring Boot的定时任务功能,定期获取需要展示的数据,并通过异步方式推送给前端页面,以实现数据的实时更新。 此外,Spring Boot还能方便地集成其他组件及第三方服务,如数据库、消息队列等。我们可以将大屏可视化所需的数据存储在数据库中,通过Spring Data JPA等组件进行数据的读写操作;或者通过集成消息队列,实现采集和处理数据的异步流程,提高系统的性能和稳定性。 总之,Spring Boot提供了一个简单而强大的开发框架,使得实现大屏可视化变得更加容易。我们可以利用Spring Boot的快速开发能力和丰富的生态系统,实现功能丰富且高效的大屏可视化系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值