目录
前言
随着微服务架构的流行,对系统运行状况的监控和管理变得至关重要。Spring Cloud提供了强大的监控工具Actuator,能够实时监控服务的运行状态、性能指标和健康状况。本文将介绍如何使用Spring Cloud的Actuator来实现微服务的监控。
一、引入Actuator依赖
首先,我们需要在项目中引入Spring Boot Actuator的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
这样做会自动添加Actuator相关的端点,我们可以通过这些端点来获取系统的运行信息。
二、暴露Actuator端点
默认情况下,Actuator的端点是不对外暴露的,为了方便监控,我们需要手动配置来暴露这些端点。
1. 配置文件
yamlCopy codemanagement:
endpoints:
web:
exposure:
include: "*" # 暴露所有端点
base-path: /monitor # 设置端点的根路径
endpoint:
health:
show-details: always # 显示健康检查的详细信息
shutdown:
enabled: true # 启用关闭应用的端点
在上述配置中,我们通过 management.endpoints.web.exposure.include
指定了要暴露的端点,这里设置为 *
表示暴露所有端点。同时,我们将端点的根路径设置为 /monitor
,方便统一管理。
2. 监控端点
Spring Boot Actuator提供了许多端点,包括 /health
、/info
、/metrics
等。这些端点可以提供关于应用程序运行状况的信息。
例如,访问 /monitor/health
端点可以获取应用程序的健康状况信息。
三、自定义健康检查
有时候,我们需要根据业务需求自定义健康检查逻辑。Spring Boot Actuator允许我们通过实现 HealthIndicator
接口来自定义健康检查。
自定义健康检查类
package cn.weizi.main.endpoint;
import cn.weizi.main.pojo.R;
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.atomic.AtomicLong;
@Service
@CrossOrigin
@RestController
@RequestMapping("/Custom")
public class CustomHealthIndicator extends AbstractHealthIndicator {
private final AtomicLong lastRequestTime = new AtomicLong(System.currentTimeMillis());
@Override
protected void doHealthCheck(Health.Builder builder) {
long currentTime = System.currentTimeMillis();
long timeSinceLastRequest = currentTime - lastRequestTime.get();
try {
if (timeSinceLastRequest <= 10000) {
builder.up();
} else {
builder.down().withDetail("error", "10秒内没有请求");
}
} catch (Exception ex) {
builder.down().withException(ex);
}
}
@GetMapping("check")
private R check() {
// 处理实际的请求逻辑
lastRequestTime.set(System.currentTimeMillis());
// 这里可以放置其他处理逻辑
return new R(true, "UP");
}
}
在上述示例中,我们实现了一个自定义的健康检查类 CustomHealthIndicator
,通过继承 AbstractHealthIndicator
并实现 doHealthCheck
方法来自定义健康检查逻辑。在这里,我们检查了最后一次请求的时间,如果超过10秒没有请求,将会返回一个健康状态为 DOWN
的信息。
四、vue前端代码
<template>
<div>
<van-notice-bar left-icon="volume-o" text="为了减少系统占用,此页面每5秒刷新一次,如果不想等待,可以下拉刷新"/>
<div v-if="loadingShow">
<van-overlay :show="loadingShow">
<div @click.stop>
<van-loading size="50px">加载中...</van-loading>
</div>
</van-overlay>
</div>
<div v-else>
<van-cell-group>
<van-cell
v-for="(component, componentName) in data.components"
:key="componentName"
:title="componentName"
:label="getStatusTag(component.status)"
:value="component.status === 'DOWN' ? '查看异常' : '运行正常'"
@click="handleCellClick(component)"
/>
</van-cell-group>
<van-dialog v-model="dialogVisible" title="异常" theme="round-button">
<p class="error-message">{{ currentComponentError }}</p>
</van-dialog>
</div>
</div>
</template>
<script>
import request from "@/unilts/request";
import redirectToHome from "@/unilts/redirectToHome";
export default {
components: {},
data() {
return {
dialogVisible: false,
currentComponentError: '',
loadingShow: false,
data: {
status: 'UP',
components: {
EVS: {
status: 'UP',
details: {
error: 'null',
},
},
},
},
};
},
created() {
this.onDataInit();
// 初始加载数据
this.timer = setInterval(() => {
this.onDataInit(); // 每隔一定时间重新加载数据
}, 5000); // 5秒一次,可以根据需求调整时间间隔
},
destroyed() {
clearInterval(this.timer); // 清除定时器,防止内存泄漏
},
methods: {
async onDataInit() {
this.loadingShow = true;
await request.get("/SystemState/health").then((res) => {
console.log(res.data)
if (res.data.flag) {
this.data = res.data.data;
} else {
this.data = res.data.data;
}
}).finally(() => {
this.loadingShow = false;
})
},
getStatusTag(status) {
if (status === 'UP') {
return <van-tag type="success">正常</van-tag>;
} else {
return <van-tag type="danger">异常</van-tag>;
}
},
handleCellClick(component) {
this.currentComponentError = '';
if (component.status === 'DOWN') {
this.currentComponentError = component.details.error;
this.dialogVisible = true;
}
},
},
};
</script>
<style>
.error-message {
white-space: pre-line;
word-wrap: break-word;
max-width: 30ch; /* 可根据需要调整最大宽度 */
margin: auto; /* 添加居中的样式 */
text-align: center; /* 文本水平居中 */
}
</style>
五、监控器的优势
- 实时监控:Actuator提供了丰富的端点,能够实时监控系统的运行状况、性能指标和健康状况,帮助开发人员及时发现并解决问题。
- 可配置性:通过配置文件,我们可以灵活地控制哪些端点需要暴露,从而保证系统的安全性和稳定性。
- 自定义扩展:Actuator允许开发人员自定义健康检查逻辑,根据具体业务需求进行监控和管理,使得监控更加灵活和定制化。
六、监控指标的可视化
除了通过端点获取监控信息外,我们还可以将监控指标可视化,以便更直观地了解系统的运行状况。常见的可视化工具包括Grafana和Prometheus等。
1. Grafana
Grafana是一款开源的数据可视化工具,支持多种数据源,并提供丰富的图表和仪表盘功能。我们可以通过将Actuator的监控数据导入到Grafana中,实现监控指标的可视化展示。
2. Prometheus
Prometheus是一款开源的监控系统,可以实时收集并存储时间序列数据,支持多维度的查询和告警功能。我们可以将Actuator暴露的监控端点数据导入到Prometheus中,从而实现监控指标的存储和分析。
通过与Grafana或Prometheus等工具的集成,我们可以更直观地了解系统的运行情况,并及时采取措施应对潜在的问题,保证系统的稳定性和可靠性。
七、安全性考虑
在暴露Actuator端点时,我们需要考虑系统的安全性。默认情况下,Actuator的端点是不对外暴露的,我们需要手动配置来暴露这些端点,并且可以通过配置用户名和密码来保护这些端点。
安全配置示例
yamlCopy codespring:
security:
user:
name: admin
password: password
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
shutdown:
enabled: true
在上述配置中,我们通过 spring.security.user
配置了用户名和密码,用于保护Actuator端点。只有提供了正确的用户名和密码才能访问这些端点,从而确保系统的安全性。
八、总结
本文介绍了如何使用Spring Cloud的Actuator来实现微服务的监控,并介绍了监控指标的可视化、安全性考虑和监控告警机制等相关内容。Actuator作为微服务架构中不可或缺的监控工具,为开发人员提供了实时监控系统运行状况的便利,并帮助他们及时发现并解决问题,保证系统的稳定性和可靠性。
通过合理配置和使用Actuator,我们可以更好地管理和监控微服务,提高系统的可维护性和可靠性,为用户提供更好的服务体验。
在本文中,我们深入探讨了Actuator的配置和使用,以及与其他监控工具的集成,希望能够对读者在微服务监控领域的实践提供一些参考和帮助。 Actuator的强大功能和灵活性为微服务的监控和管理提供了便利,是现代软件开发中不可或缺的重要组件。