目录
问题一: 明明项目启动却还是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
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日志开启后无法更新日志信息
日志配置——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 来动态的配置项目中的日志级别和日志文件。
好了,SpringBoot Admin这款监控软件就介绍到这里,如果你项目中的子模块特别多的话也可以多添加几个client,我这里只用了一个client举例,最后希望我的分享能帮助到你。