前言

随着微服务架构的流行,对系统运行状况的监控和管理变得至关重要。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>


五、监控器的优势

  1. 实时监控:Actuator提供了丰富的端点,能够实时监控系统的运行状况、性能指标和健康状况,帮助开发人员及时发现并解决问题。
  2. 可配置性:通过配置文件,我们可以灵活地控制哪些端点需要暴露,从而保证系统的安全性和稳定性。
  3. 自定义扩展: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的强大功能和灵活性为微服务的监控和管理提供了便利,是现代软件开发中不可或缺的重要组件。

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐