Spring Boot(五十三):SpringBoot Actuator之简单实现

news2025/1/11 9:03:10

1 场景介绍

对于一个大型的几十个、几百个微服务构成的微服务架构系统,在线上时通常会遇到下面一些问题,比如:

        1. 如何知道哪些服务除了问题,如何快速定位? (健康状况)

        2. 如何统一监控各个微服务的性能指标(内存、jvm、并发数、线程池、Http 请求统计)

        3. 如何统一管理各个微服务的日志?(切换线上日志等级,快速搜索日志...)

        4. 如何优雅管理服务下线(正在运行的线程不发生中断)

所以在这种大型分布式应用的环境下,我们如何能够快速发现问题、快速解决问题, 必须要有监控平台、(链路追踪、日志)

2 SpringBoot Actuator

SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等

2.1 实现

项目结构如下:

新建springboot项目 actuator_admin为父模块

修改pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.8-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>actuator</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>../01_actuator</module>
    </modules>

    <name>actuator</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </pluginRepository>
    </pluginRepositories>

</project>

新建springboot Module:01_actuator

修改pom文件中的parent为actuator_admin模块。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
<!--        <groupId>org.springframework.boot</groupId>-->
<!--        <artifactId>spring-boot-starter-parent</artifactId>-->
<!--        <version>2.7.8-SNAPSHOT</version>-->
        <groupId>com.example</groupId>
        <artifactId>actuator</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.actuator</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </pluginRepository>
    </pluginRepositories>

</project>

启动01_actuator运行

访问localhost:8080接口

 接口返回的内容如下:

{
	"_links": {
		"self": {
			"href": "http://localhost:8081/actuator",
			"templated": false
		},
		"health": {
			"href": "http://localhost:8081/actuator/health",
			"templated": false
		},
		"health-path": {
			"href": "http://localhost:8081/actuator/health/{*path}",
			"templated": true
		}
	}
}

以上暴露的接口都是可以访问的。但不是所有的接口的暴露出来了,下面我们将所有的接口全部暴露出来。

修改application.properties暴露所有监控信息为HTTP

server.port=8081
#以web方式暴露所有端点
management.endpoints.web.exposure.include= *

#暴露所有监控信息为HTTP
management.endpoints.enabled-by-default=true

#修改访问端口的后缀
management.endpoints.web.base-path= /handsome

访问localhost:8081/handsome

接口返回内容如下:

{
	"_links": {
		"self": {
			"href": "http://localhost:8081/handsome",
			"templated": false
		},
		"beans": {
			"href": "http://localhost:8081/handsome/beans",
			"templated": false
		},
		"caches-cache": {
			"href": "http://localhost:8081/handsome/caches/{cache}",
			"templated": true
		},
		"caches": {
			"href": "http://localhost:8081/handsome/caches",
			"templated": false
		},
		"health": {
			"href": "http://localhost:8081/handsome/health",
			"templated": false
		},
		"health-path": {
			"href": "http://localhost:8081/handsome/health/{*path}",
			"templated": true
		},
		"info": {
			"href": "http://localhost:8081/handsome/info",
			"templated": false
		},
		"conditions": {
			"href": "http://localhost:8081/handsome/conditions",
			"templated": false
		},
		"shutdown": {
			"href": "http://localhost:8081/handsome/shutdown",
			"templated": false
		},
		"configprops": {
			"href": "http://localhost:8081/handsome/configprops",
			"templated": false
		},
		"configprops-prefix": {
			"href": "http://localhost:8081/handsome/configprops/{prefix}",
			"templated": true
		},
		"env": {
			"href": "http://localhost:8081/handsome/env",
			"templated": false
		},
		"env-toMatch": {
			"href": "http://localhost:8081/handsome/env/{toMatch}",
			"templated": true
		},
		"loggers": {
			"href": "http://localhost:8081/handsome/loggers",
			"templated": false
		},
		"loggers-name": {
			"href": "http://localhost:8081/handsome/loggers/{name}",
			"templated": true
		},
		"heapdump": {
			"href": "http://localhost:8081/handsome/heapdump",
			"templated": false
		},
		"threaddump": {
			"href": "http://localhost:8081/handsome/threaddump",
			"templated": false
		},
		"metrics": {
			"href": "http://localhost:8081/handsome/metrics",
			"templated": false
		},
		"metrics-requiredMetricName": {
			"href": "http://localhost:8081/handsome/metrics/{requiredMetricName}",
			"templated": true
		},
		"scheduledtasks": {
			"href": "http://localhost:8081/handsome/scheduledtasks",
			"templated": false
		},
		"mappings": {
			"href": "http://localhost:8081/handsome/mappings",
			"templated": false
		}
	}
}

Health:监控状况

        一个组件指标状态为Down则总状态信息Down,很多组件中都定制了Health子节点指标: 比如jdbc、redis、等等

shutdown:优雅关闭

注意需要web服务器的支持

配置文件添加:

server.shutdown=graceful

Metrics:运行时指标

Loggers:日志记录 

配置文件添加

logging.file.name: D:/logs/xushu.log

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

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

相关文章

不确定性量化 (UQ) 可以显著提高预测准确性,在不确定的世界中获得最佳结果昆士兰大学Mike McKerns-中国学者网

在不确定的世界中获得最佳结果,不确定性量化可以解开成功与失败之间的区别。不确定性量化 &#xff08;UQ&#xff09; 可以显著提高预测准确性&#xff0c;提供设计优化&#xff0c;并在充满未知的世界中促进快速解决方案改进。昆士兰大学的一个机构"不确定性量化基金会&…

vue3中常用的指令之v-bind和v-on

一、v-bind指令 一个vue2和vue3之间的不同之处&#xff1a;Vue2中template模板中只能有一个根元素&#xff0c;但是在Vue3中允许template中有多个元素。 1.v-bind的绑定基本属性 某些属性也希望是动态绑定的&#xff0c;比如动态绑定a元素中的href属性。 v-bind可以绑定一个…

verilog学习笔记- 14)静态数码管显示实验

目录 简介: 实验任务: 硬件设计: 程序设计: 下载验证: 简介: 数码管也称半导体数码管&#xff0c;它是将若干发光二极管按一定图形排列并封装在一起的一种数码显示器件。常见的数码管如图这种数码管主要被称为八段数码管或 8 字形数码管&#xff0c;可用来显示小数点、数…

【Linux 基础】

【Linux 基础】 一、 Linux 概述 1. Linux 介绍 UNIX 是一个强大的多用户、多任务操作系统&#xff0c;于1969年在贝尔实验室开发&#xff0c;UNIX 的商标权有国际开放组织&#xff08;The Open Group&#xff09;所拥有&#xff0c;UNIX 操作系统是商业版&#xff0c;需要收…

【OpenGL学习】Shader和Shader类的抽象

Shader 本节学习OpenGL中Shader的使用并将其抽象为类&#xff0c;简要介绍OpenGL所使用的着色器语言GLSL。 一、什么是Shader&#xff1f; 参考维基百科中对Shader的定义&#xff1a;着色器 - 维基百科&#xff0c;自由的百科全书 (wikipedia.org) 计算机图形学领域中&…

SpringBoot处理跨域总结

解决跨域的五种方法1、CorsFilter新建一个类Configuration public class CorsConfig {Beanpublic CorsFilter corsFilter() {//1. 添加 CORS配置信息CorsConfiguration config new CorsConfiguration();//放行哪些原始域//springboot版本为2.4.0以前写法config.addAllowedOrig…

kaggle竞赛 | Instant Gratification

kaggle比赛链接&#xff1a; https://www.kaggle.com/competitions/instant-gratification/data 目录普通方案优胜方案1. 用方差筛选特征2.QDA二次判别分析3.数据分组&#xff08;伪标签&#xff09;4.查看结果赛题总结普通方案 # 数据集路径 INPUT_PATH ../input/import num…

python学习笔记---进程和线程【廖雪峰】

进程和线程 现在&#xff0c;多核CPU已经非常普及了&#xff0c;但是&#xff0c;即使过去的单核CPU&#xff0c;也可以执行多任务。由于CPU执行代码都是顺序执行的&#xff0c;那么&#xff0c;单核CPU是怎么执行多任务的呢&#xff1f; 答案就是操作系统轮流让各个任务交替…

ESP-IDF:企业链表例程,实现初始化,插入,打印等功能。

例程&#xff1a; 简单地写一下企业链表&#xff0c;实现初始化&#xff0c;插入&#xff0c;打印等功能。 /企业链表/ typedef struct LINKNODE09 { // 定义节点 LINKNODE09 *next; } linknode09; // 定义表头 typedef struct LINKLIST09 { // 定义表头 linknode09 head; in…

【胖虎的逆向之路】03——Android一代壳脱壳办法罗列实操

【胖虎的逆向之路】03——Android脱壳办法罗列&脱壳原理详解 【胖虎的逆向之路】01——动态加载和类加载机制详解 【胖虎的逆向之路】02——Android整体加壳原理详解&实现 文章目录【胖虎的逆向之路】03——Android脱壳办法罗列&脱壳原理详解前言一、主流脱壳方法…

uefi和legacy的区别对比

legacy&#xff1a;[ˈleɡəsi]&#xff0c;遗产、遗留。 uefi&#xff1a;Unified Extensible Firmware Interface&#xff0c;统一可扩展固件接口。 当我们自己重装或安装操作系统的时候&#xff0c;可能会遇到硬盘的uefi和legacy两种&#xff0c;不过大多数人并不知道uefi和…

低代码开发前景如何?大家都真的看好低代码开发吗?

栖低代码开发前景如何&#xff0c;大家都真的看好低代码开发吗&#xff1f;之前有些过很多关于低代码的内容&#xff0c;这篇就来梳理下国内外低代码开发平台发展现状及前景。 关于低代码解读看这篇>> 什么是低代码&#xff08;Low-Code&#xff09;&#xff1f; 关于低…

SpreadJS.Release.16.0.2 Crack by Xacker

SpreadJS拥有 500 多个 Excel 函数的世界销量第一的 JavaScript 电子表格 快速提供真正类似 Excel 的电子表格体验 - 对 Excel 零依赖。创建财务应用程序&#xff0c;仪表板,图表,数据透视表,性能基准,科学实验室笔记本&#xff0c;以及其他类似的 JavaScript 电子表格应用程序…

77. 语言模型以及代码实现

1. 语言模型 给定文本序列 x1,…,xT,语言模型的目标是估计联合概率p&#xff08;x1,…,xT&#xff09;它的应用包括 做预训练模型&#xff08;eg BERT&#xff0c;GPT-3&#xff09;生成文本&#xff0c;给定前面几个词&#xff0c;不断使用xt~p(x1,…,xt-1) 来生成后续文本判…

CSS选择器整理学习(上)

在前端项目开发中&#xff0c;有时候需要对特殊的元素进行特殊的处理&#xff0c;但有时候元素的位置不确定、层级不确定、数量不确定等问题&#xff0c;导致我们没办法进行元素的选择&#xff0c;这个时候我们就需要用到元素选择器了。 一、CSS选择器 1、.class 选择器例子…

图像处理解决流程--外观检测

一、图像外观检测和面积计算 1、获取标准图像&#xff0c;提取要测定的区域&#xff08;截取成多个ROI&#xff09; 2、将目标图像的位置进行平移和旋转&#xff08;将目标图像和标准图像进行重叠&#xff09; 3、根据标准图像的区域进行以此计算目标图像的信息 4、判断统计 二…

Ajax基础

Ajax 是 Asynchronous JavaScript and XML&#xff08;异步 JavaScript 和 XML&#xff09;的简写 Ajax 中的异步&#xff1a;可以异步地向服务器发送请求&#xff0c;在等待响应的过程中&#xff0c;不会阻塞当前页面&#xff0c;浏览器可以做自己的事情。直到成功获取响应后…

Maven高级进阶

文章目录1&#xff0c;分模块开发1.1 分模块开发设计1.2 分模块开发实现1.2.1 环境准备1.2.2 抽取domain层步骤1:创建新模块步骤2:项目中创建domain包步骤3:删除原项目中的domain包步骤4:建立依赖关系步骤5:编译maven_02_ssm项目步骤6:将项目安装本地仓库1.2.3 抽取Dao层步骤1:…

iOS vue devtools工具的手把手安装,及Vue.js not detected的解决

使用vue插件Vue.js devtools 一.通过谷歌商店直接下载&#xff08;要翻墙&#xff09; 二.不翻墙的方法&#xff1a; 1.官网下载 git地址&#xff1a;https://github.com/vuejs/devtools git clone https://github.com/vuejs/devtools2.完成后命令行里切到该目录下&#x…

AppScan绕过登录验证码深入扫描

系列文章 AppScan介绍和安装 AppScan 扫描web应用程序 AppScan被动手动探索扫描 第四节-绕过登录验证码深入扫描 我们工作中最长碰到的工作场景是网站采用https协议&#xff0c;这时我们要用appScan进行扫描时&#xff0c;就需要先安装证书 1.证书安装 1.新建一个文件&…