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

news2024/11/24 7:41:40

目录

父项目

子模块——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日志开启后无法更新日志信息

<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举例,最后希望我的分享能帮助到你。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/783157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【字符流】案例:文件到集合

案例&#xff1a;文件到集合 1.需求&#xff1a; 把文本文件中的数据读取到集合&#xff0c;并遍历集合。要求&#xff1a;文件中的每一行数据是一个集合元素 2.思路 创建字符缓冲输入流对象创建ArrayList集合对象调用字符缓冲输入流对象的方法读数据把读取到的字符串数据存…

【Lingo软件求解案例一:MCM1988:B题两辆平板车的装货问题】

题目描述 有 七种规格的包装箱 要装到 两辆平板车 上 包装箱的宽和高是一样的 但是厚度&#xff08;t 厘米&#xff09;和重量&#xff08;w 公斤&#xff09;是不一样的 表格中给出每种包装箱的厚度、重量和数量 每辆平板车有10.2米长的地方可以用来装包装箱 像面包片一样 载…

【PostgreSQL内核学习(七)—— 查询规划(生成路径)】

查询规划——预处理 生成路径 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明引用来源。 本文主要参考了《PostgresSQL数据库内核分析》一书 生…

进阶C语言——动态内存管理

好久不见&#xff0c;今天我们学习一下C语言的动态内存管理&#xff0c;这是一个和指针一样重要的章节&#xff0c;所以大家一定要好好学这章。 1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};…

Obsidian同步到Notion

插件介绍 将Obsidian的内容同步到Notion需要使用一个第三方插件"Obsidian shared to Notion"EasyChris/obsidian-to-notion: Share obsidian markdown file to notion and generate notion share link 同步obsdian文件到notion&#xff0c;并生成notion分享链接&am…

数据仓库表设计理论

数据仓库表设计理论 数仓顾名思义是数据仓库&#xff0c;其数据来源大多来自于业务数据(例如:关系型数据库)&#xff0c;当设计数仓中表类型时(拉链表、增量表、全量表、流水表、切片表)时&#xff0c;应先观察业务数据的特点再设计数仓表结构 首先业务数据是会不断增长的-即…

flask介绍、快速使用、配置文件、路由系统

前言: Flask框架和Django框架的区别&#xff1a; Django框架&#xff1a; 大而全&#xff0c;内置的app的很多&#xff0c;第三方app也很多Flask框架&#xff1a; 小而精&#xff0c;没有过多的内置app&#xff0c;只能完成web框架的基本功能&#xff0c;很多功能都需要借助第三…

护城河理论

护城河理论 护城河理论|来自股神巴菲特&#xff0c;是指投资的企业在某一方面的核心竞争力。 模型介绍 在2000年的伯克希尔哈撒韦的年会上&#xff0c;巴菲特说&#xff1a;让我们来把护城河作为一个伟大企业的首要标准&#xff0c;保持它的宽度&#xff0c;保持它不被跨越。我…

【字符流】案例:集合到文件

案例&#xff1a;集合到文件 1.需求&#xff1a; 把ArrayList集合中的字符串数据写入到文本文件。要求&#xff1a;每一个字符串元素作为文件中的一行数据 2.思路 创建ArrayList集合往集合中存储字符串元素创建字符缓冲输出流对象遍历集合&#xff0c;得到每一个字符串数据调…

『Dubbo SPI源码分析』依赖注入机制分析

Dubbo Wrapper 依赖注入机制分析 基于 2.7.0 版本上一章&#xff1a;『Dubbo SPI源码分析』Wrapper 机制分析 创建测试 demo 首先创建一个接口&#xff0c;举例为 Car package com.luban.dubbo_spi.api;SPI public interface Car {public void getColor();public void getC…

数据结构(王道)——数据结构之 由遍历序列构造二叉树

结论&#xff1a;给出遍历序列当中的一种&#xff0c;不能唯一确定一颗二叉树。

[回馈]ASP.NET Core MVC开发实战之商城系统(一)

经过一段时间的准备&#xff0c;新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始&#xff0c;今天着重讲解布局设计&#xff0c;环境搭建&#xff0c;系统配置&#xff0c;及首页商品类型&#xff0c;banner条&#xff0c;友情链接等功能的开发。 首页布局设计 首页是…

Android使用Shape画格子图和圆形

觉得画来玩玩&#xff0c;比较有趣&#xff0c;记录一下。 1格子。 <?xml version"1.0" encoding"utf-8"?> <layer-list xmlns:android"http://schemas.android.com/apk/res/android"><item ><shape><solid andro…

性能测试-Jmeter之Linux下压力测试

我们在做测试的时候&#xff0c;有时候要运行很久&#xff0c;公司用的测试服务器一般都是linux&#xff0c;就可以运行在linux下面&#xff0c;linux下面不能像windows一样有图形化界面&#xff0c;那怎么运行脚本呢&#xff0c;就先在windows上把脚本做好&#xff0c;然后在l…

解决ORACLE PLSQL查询速度慢问题

在表内已建有索引情况下&#xff0c;查询速度有时快&#xff0c;有时慢的问题。 数据库&#xff1a;Oracle&#xff0c; 工具&#xff1a;PlsqlDev 不走索引的原因通常有以下几种&#xff1a; 1.索引失效或丢失&#xff1a;当数据库中的索引被减少、删除或者失效时&#xff0…

浅析JAVA虚拟机结构与机制

本文旨在给所有希望了解 可以看出&#xff0c;JVM主要由类加载器子系统、运行时数据区&#xff08;内存空间&#xff09;、执行引擎以及与本地方法接口等组成。其中运行时数据区又由方法区、堆、Java栈、PC寄存器、本地方法栈组成。 从上图中还可以看出&#xff0c;在内存空间…

Flask 创建文件目录,删除文件目录

项目结构 app.py from flask import Flask, render_template, request, redirect, url_for import osapp Flask(__name__) BASE_DIR os.path.abspath(os.path.dirname(__file__)) FILE_DIR os.path.join(BASE_DIR, testfile)app.route(/, methods[GET, POST]) def index():…

心海舟楫、三一重工面试(部分)

心海舟楫 一道算法题&#xff1a; 我开始给出的是暴力解法&#xff0c;时间复杂度O(n^2)。 在面试官的提示下&#xff0c;实现了时间复杂度为O(n)的解法。 三一重工 没啥特别的

【VTK】VTK 让小球动起来,在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 文章目录 版本环境A.uiA.hA.cppRef. 本文主要目的是在 Qt 界面中&#xff0c;显示出来使用 VTK 构建的小球&#xff0c;并让小球能够动起来。同时为了方便对比…