在微服务架构普及的今天,Spring Boot 应用的监控与运维成为核心需求。Spring Boot Actuator 提供了强大的原生监控端点,但原生 HTTP 接口访问低效、可视化能力薄弱,难以满足企业级运维需求。Spring Boot Admin(SBA)作为基于 Actuator 的上层监控工具,通过 Vue.js 实现了优雅的可视化界面,支持应用注册、状态监控、指标分析、告警通知等一站式功能,是轻量级微服务监控的首选方案。

本文将从技术原理、实操落地、进阶优化三个维度,带大家构建一套高可用、高安全、可扩展的 Spring Boot Admin 监控体系,覆盖从本地开发到生产部署的全流程。

一、Spring Boot Admin 核心原理与技术架构

1.1 核心定位与价值

Spring Boot Admin 是由 codecentric 开源的社区项目,本质是 Actuator 端点的"可视化网关"

  • 对开发/运维人员:提供统一的 UI 界面,无需记忆复杂的 Actuator 接口,直观查看应用状态、指标数据;
  • 对系统架构:支持多应用、多实例集中管理,解决微服务架构下"监控分散"的痛点;
  • 核心优势:轻量化(无额外中间件依赖)、配置简单(自动集成 Actuator)、扩展性强(支持自定义告警、权限控制)。

1.2 技术架构拆解

SBA 采用 C/S 架构,核心组件分为三部分:

┌─────────────────┐      ┌─────────────────┐      ┌─────────────────┐
│  SBA Client     │      │  SBA Server     │      │  注册中心(可选)│
│  (被监控应用)  │──────▶│  (监控控制台)  │◀─────▶│  (Eureka/Nacos)│
└─────────────────┘      └─────────────────┘      └─────────────────┘
  • SBA Client:集成在被监控应用中,通过 Actuator 暴露监控端点,并将自身信息注册到 SBA Server;
  • SBA Server:核心组件,负责:
    1. 接收 Client 注册或从注册中心拉取应用实例;
    2. 调用应用的 Actuator 端点获取数据;
    3. 通过 Vue.js 前端展示监控数据;
    4. 触发状态变更告警;
  • 注册中心:可选组件,适用于微服务集群,SBA Server 从注册中心自动发现应用实例,无需手动配置 Client 地址。

1.3 版本兼容性说明

SBA 版本与 Spring Boot 版本强绑定,需严格匹配(否则会出现依赖冲突或功能异常):

Spring Boot 版本

SBA 推荐版本

核心依赖变化

2.2.x

2.2.x

基于 Spring WebFlux 实现

2.7.x

2.7.x

支持 Spring Security 5.x

3.x

3.x

适配 Spring Boot 3.x 自动配置,支持 Spring Security 6.x

注意:本文基于 Spring Boot 2.7.x + SBA 2.7.x 实现,3.x 版本需调整依赖坐标(如 jakarta.servlet-api 替代 javax.servlet-api)。

二、快速搭建:基础监控环境(无注册中心)

本章节实现最简化的 SBA 部署:1 个 SBA Server + 1 个 SBA Client(被监控应用),Client 直接通过 HTTP 注册到 Server。

2.1 环境准备

  • JDK 8+
  • Maven 3.6+
  • Spring Boot 2.7.10
  • Spring Boot Admin 2.7.10

2.2 搭建 SBA Server

2.2.1 依赖配置(pom.xml)
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.10</version>
</parent>
<<dependencies>
    <!-- SBA Server 核心依赖(含 UI 界面) -->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-server</artifactId>
        <version>2.7.10</version>
    </dependency>
    <!-- Web 依赖(SBA Server 基于 WebFlux,需引入 reactive-web) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <!-- 日志依赖(便于排查问题) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</</dependencies>
2.2.2 启动类配置
import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableAdminServer // 开启 SBA Server 功能
public class SbaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SbaServerApplication.class, args);
    }
}
2.2.3 配置文件(application.yml)
server:
  port: 8080 # SBA Server 端口
spring:
  application:
    name: sba-server # 应用名,用于识别 Server 实例
logging:
  level:
    de.codecentric.boot.admin.server: INFO # SBA 核心日志级别
    org.springframework.web.reactive: WARN # WebFlux 日志级别(避免冗余)
2.2.4 启动验证
  1. 运行启动类,日志输出 Netty started on port(s): 8080 表示启动成功(SBA Server 基于 WebFlux,默认使用 Netty 容器);
  2. 访问 http://127.0.0.1:8080,看到 SBA 中文界面(默认支持国际化),显示"暂无应用注册",说明 Server 部署正常。

2.3 搭建 SBA Client(被监控应用)

2.3.1 依赖配置(pom.xml)
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.10</version>
</parent>
<<dependencies>
    <!-- Web 依赖(被监控应用为 Spring MVC 项目) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Actuator 核心依赖(暴露监控端点) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!-- SBA Client 依赖(用于注册到 Server) -->
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-client</artifactId>
        <version>2.7.10</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</</dependencies>
2.3.2 配置文件(application.yml)
server:
  port: 18080 # 客户端端口,避免与 Server 冲突
spring:
  application:
    name: demo-application # 应用名,将在 SBA 界面显示
  boot:
    admin:
      client:
        url: http://127.0.0.1:8080 # SBA Server 地址
        instance:
          # 客户端实例信息配置
          name: ${spring.application.name} # 实例名称
          service-url: http://127.0.0.1:${server.port} # 客户端访问地址
          management-base-url: http://127.0.0.1:${server.port} # Actuator 端点基础路径
          metadata:
            # 元数据:用于后续安全认证(提前预留)
            user.name: ${spring.security.user.name:admin}
            user.password: ${spring.security.user.password:admin123}

# Actuator 配置:核心!控制端点暴露
management:
  endpoints:
    web:
      exposure:
        include: '*' # 暴露所有端点(生产环境需按需配置,如 health,info,metrics,threaddump)
      base-path: /actuator # 端点基础路径(默认就是 /actuator)
  endpoint:
    health:
      show-details: always # 健康检查显示详细信息
      probes:
        enabled: true # 支持健康探针(K8s 部署时有用)
    metrics:
      enabled: true # 启用指标端点
    threaddump:
      enabled: true # 启用线程 dump 端点
2.3.3 启动类配置
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoClientApplication.class, args);
    }
}
2.3.4 注册验证
  1. 启动 Client 应用,日志输出 Application registered itself as xxx 表示注册成功;
  2. 刷新 SBA Server 界面(http://127.0.0.1:8080),会看到 demo-application 实例状态为 UP
  3. 点击实例名称,进入详情页,可查看:
    • 基础信息:进程 ID、运行时间、CPU/内存使用率;
    • 指标数据:JVM 内存、垃圾回收、HTTP 请求量;
    • 运维工具:线程 Dump、内存 Dump、日志级别调整。

三、核心功能深度解析:从监控到运维

SBA 的核心价值在于将 Actuator 端点可视化、操作化,以下是关键功能的技术细节与实战场景。

3.1 健康状态监控(Health)

3.1.1 技术原理

SBA 定期调用 Client 的 /actuator/health 端点,获取健康状态(UP/DOWN/OFFLINE/UNKNOWN),默认检查间隔为 10 秒(可通过 spring.boot.admin.server.instance-monitoring.interval 调整)。

3.1.2 扩展场景
  • 自定义健康检查:通过实现 HealthIndicator 接口,添加业务健康检查(如数据库连接、缓存可用性、第三方接口连通性);
@Component
public class DatabaseHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        // 模拟数据库连接检查
        boolean isConnected = true; // 实际场景需替换为真实检查逻辑
        if (isConnected) {
            return Health.up().withDetail("database", "MySQL connected").build();
        } else {
            return Health.down().withDetail("database", "MySQL disconnected").build();
        }
    }
}
  • 健康状态聚合:微服务应用可通过 health-groups 分组健康检查(如 readiness/liveness 探针,适配 K8s 部署)。

3.2 指标监控(Metrics)

3.2.1 核心指标分类

SBA 整合了 Micrometer(Spring Boot 2.x 默认指标收集框架),支持以下指标类型:

指标类型

对应端点

监控场景

JVM 指标

/actuator/metrics/jvm.*

内存泄漏、GC 频繁问题排查

应用指标

/actuator/metrics/application.*

启动时间、线程数

HTTP 指标

/actuator/metrics/http.server.requests

接口响应时间、QPS、错误率

数据源指标

/actuator/metrics/datasource.*

数据库连接池使用率、慢查询

缓存指标

/actuator/metrics/cache.*

缓存命中率、缓存大小

3.2.2 实战技巧
  • 自定义指标:通过 MeterRegistry 埋点业务指标(如订单量、支付成功率);
@Component
public class BusinessMetrics {
    private final Counter orderCounter;

    public BusinessMetrics(MeterRegistry registry) {
        // 定义订单创建计数器
        this.orderCounter = registry.counter("business.order.create", "status", "success");
    }

    // 订单创建成功时调用
    public void incrementOrderCount() {
        orderCounter.increment();
    }
}
  • 指标筛选与排序:在 SBA 界面的「Metrics」 tab 中,通过 tag 筛选(如按 HTTP 状态码、接口 URI 筛选),支持趋势图查看。

3.3 运维工具集

3.3.1 日志级别动态调整
  • 原理:调用 /actuator/loggers/{loggerName} 端点,修改日志级别(TRACE/DEBUG/INFO/WARN/ERROR/OFF);
  • 实战场景:生产环境排查问题时,无需重启应用,临时开启某个包的 DEBUG 日志(如 cn.iocoder),排查完成后恢复为 INFO。
3.3.2 线程 Dump 与内存 Dump
  • 线程 Dump:调用 /actuator/threaddump 端点,获取线程堆栈,用于排查死锁、线程阻塞(如 Tomcat 线程池满);
  • 内存 Dump:调用 /actuator/heapdump 端点,下载 heapdump.hprof 文件,用 MAT 工具分析内存泄漏(如大对象未释放、线程池泄漏)。
3.3.3 环境配置与配置刷新
  • 环境查看:展示 /actuator/env 端点数据,包括系统属性、环境变量、应用配置;
  • 配置刷新:结合 Spring Cloud Config,调用 /actuator/refresh 端点,实现配置热更新(需在 Client 中引入 spring-cloud-starter-config 依赖)。

四、进阶配置:高可用、高安全、可扩展

4.1 基于注册中心的集群部署(高可用)

当微服务实例较多时,Client 直接注册到 Server 的方式难以维护,需集成注册中心(如 Nacos/Eureka/Consul),实现应用自动发现。

4.1.1 集成 Nacos 示例(推荐)
(1)SBA Server 配置
  • 新增依赖:
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>
  • 配置文件(application.yml):
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos 地址
        username: nacos
        password: nacos
eureka: # 若使用 Eureka,替换为 Eureka 配置
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka
  • 启动类添加 @EnableDiscoveryClient 注解。
(2)SBA Client 配置
  • 移除 spring.boot.admin.client.url 配置,新增 Nacos 依赖(同 Server);
  • 配置文件:
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos
(3)高可用扩展
  • SBA Server 集群:部署多个 Server 实例,注册到同一 Nacos 集群,Client 通过 Nacos 自动发现 Server;
  • 负载均衡:Client 端配置 spring.boot.admin.client.url 为 Nacos 集群地址,或通过 Nginx 反向代理 Server 实例。

4.2 安全认证配置(生产级必备)

默认情况下,SBA Server 界面无需登录即可访问,存在安全风险,需集成 Spring Security 实现认证与授权。

4.2.1 SBA Server 安全配置
  • 新增依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  • 安全配置类:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.server.SecurityWebFilterChain;

@Configuration
@EnableWebFluxSecurity // SBA Server 基于 WebFlux,需用 WebFlux 安全配置
public class SbaSecurityConfig {

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        return http
                // 配置权限规则
                .authorizeExchange()
                .pathMatchers("/assets/**", "/login").permitAll() // 静态资源、登录页允许匿名访问
                .anyExchange().authenticated() // 其他接口需认证
                .and()
                // 表单登录(默认登录页为 /login)
                .formLogin()
                .and()
                // 登出配置
                .logout().logoutUrl("/logout")
                .and()
                // 启用 HTTP Basic 认证(用于 Client 与 Server 通信)
                .httpBasic()
                .and()
                // 禁用 CSRF(微服务场景下无需 CSRF 防护)
                .csrf().disable()
                .build();
    }

    @Bean
    public MapReactiveUserDetailsService userDetailsService() {
        // 配置管理员用户(生产环境建议从数据库读取)
        UserDetails admin = User.withUsername("admin")
                .password("{noop}admin123") // {noop} 表示明文密码(生产环境需用 BCrypt 加密)
                .roles("ADMIN")
                .build();
        return new MapReactiveUserDetailsService(admin);
    }
}
4.2.2 SBA Client 认证配置

Server 开启认证后,Client 需携带认证信息才能注册,同时 Server 访问 Client 的 Actuator 端点也需认证:

spring:
  security:
    user:
      name: client-admin # Client 端 Actuator 认证账号
      password: client123 # 密码(生产环境需加密)
  boot:
    admin:
      client:
        username: admin # SBA Server 认证账号
        password: admin123 # SBA Server 密码
        instance:
          metadata:
            # 告知 Server 访问 Actuator 端点的认证信息
            user.name: ${spring.security.user.name}
            user.password: ${spring.security.user.password}

# Actuator 端点认证配置(仅允许认证用户访问)
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,threaddump
  endpoint:
    health:
      show-details: when_authorized # 仅认证用户可见健康详情

4.3 监控告警:从被动响应到主动预警

SBA 支持多种告警方式,核心是监听应用状态变更事件(InstanceStatusChangedEvent),触发告警通知。

4.3.1 邮件告警(最常用)
(1)Server 配置
  • 新增依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
  • 配置文件:
spring:
  mail:
    host: smtp.163.com # 邮件服务器地址(如 163、QQ 邮箱)
    username: your-email@163.com # 发件人邮箱
    password: your-email-password # 邮箱授权码(非登录密码)
    port: 465
    protocol: smtps # 加密协议(SSL)
    properties:
      mail.smtp.ssl.enable: true
  boot:
    admin:
      notify:
        mail:
          from: your-email@163.com # 发件人
          to: ops@example.com # 收件人(可多个,用逗号分隔)
          cc: dev@example.com # 抄送(可选)
          subject: "【SBA 告警】应用 {applicationName} 状态变更为 {status}" # 告警主题模板
          text: |
            应用名称:{applicationName}
            实例 ID:{instanceId}
            状态变更:{fromStatus} → {toStatus}
            发生时间:{timestamp}
            应用地址:{serviceUrl}
(2)告警触发场景
  • 应用状态从 UP 变为 DOWN/OFFLINE(下线告警);
  • 应用状态从 DOWN 变为 UP(恢复告警);
  • 应用注册/注销(可选,需自定义配置)。
4.3.2 自定义告警(如钉钉、短信)

通过实现 AbstractStatusChangeNotifier 接口,自定义告警逻辑(以钉钉为例):

import de.codecentric.boot.admin.server.domain.entities.Instance;
import de.codecentric.boot.admin.server.domain.events.InstanceEvent;
import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent;
import de.codecentric.boot.admin.server.notify.AbstractStatusChangeNotifier;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@Component
public class DingTalkNotifier extends AbstractStatusChangeNotifier {

    // 钉钉机器人 WebHook 地址(需在钉钉群创建机器人,获取 WebHook)
    private static final String DING_TALK_WEBHOOK = "https://oapi.dingtalk.com/robot/send?access_token=xxx";

    public DingTalkNotifier(InstanceRepository repository) {
        super(repository);
    }

    @Override
    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
        return Mono.fromRunnable(() -> {
            if (event instanceof InstanceStatusChangedEvent) {
                String applicationName = instance.getRegistration().getName();
                String instanceId = event.getInstance();
                String fromStatus = ((InstanceStatusChangedEvent) event).getFrom().getStatus();
                String toStatus = ((InstanceStatusChangedEvent) event).getTo().getStatus();
                String serviceUrl = instance.getRegistration().getServiceUrl();

                // 构建钉钉消息
                Map<String, Object> message = new HashMap<>();
                message.put("msgtype", "text");
                Map<String, String> text = new HashMap<>();
                text.put("content", String.format(
                        "【SBA 钉钉告警】\n" +
                        "应用名称:%s\n" +
                        "实例 ID:%s\n" +
                        "状态变更:%s → %s\n" +
                        "应用地址:%s",
                        applicationName, instanceId, fromStatus, toStatus, serviceUrl
                ));
                message.put("text", text);

                // 发送 HTTP 请求到钉钉 WebHook
                try {
                    String response = HttpRequest.post(DING_TALK_WEBHOOK)
                            .header("Content-Type", "application/json")
                            .body(JSON.toJSONString(message))
                            .execute()
                            .body();
                    log.info("钉钉告警发送成功,响应:{}", response);
                } catch (Exception e) {
                    log.error("钉钉告警发送失败", e);
                }
            }
        });
    }
}
4.3.3 告警优化
  • 避免告警风暴:通过 reminder 配置重复告警间隔(如应用 DOWN 后,每 5 分钟重复告警一次);
spring:
  boot:
    admin:
      notify:
        reminder:
          enabled: true
          initial-delay: 60000 # 首次告警延迟 1 分钟
          period: 300000 # 重复告警间隔 5 分钟
  • 告警过滤:通过 filter 配置不需要告警的应用或状态;
spring:
  boot:
    admin:
      notify:
        filter:
          enabled: true
          statuses: DOWN,OFFLINE # 仅对 DOWN/OFFLINE 状态告警
          applications: demo-application # 仅对指定应用告警(多个用逗号分隔)

五、生产环境部署最佳实践

5.1 性能优化

  • 减少监控压力:Client 端按需暴露 Actuator 端点(避免暴露 beans/env 等重量级端点);
  • 调整监控间隔:Server 端增大实例监控间隔(spring.boot.admin.server.instance-monitoring.interval=30000,单位:毫秒);
  • 关闭不必要的功能:如关闭日志报表(spring.boot.admin.server.ui.logs.enabled=false)、事件日志(spring.boot.admin.server.events.enabled=false)。

5.2 高可用部署

  • SBA Server 集群:部署 2+ 实例,注册到同一注册中心,通过 Nginx 负载均衡;
  • 注册中心高可用:使用 Nacos/Eureka 集群,避免单点故障;
  • 数据持久化:SBA 默认不持久化事件日志,生产环境可集成 Elasticsearch 存储事件(需自定义 InstanceEventRepository)。

5.3 安全加固

  • 密码加密:使用 Spring Security 的 BCrypt 加密用户密码(避免明文配置);
  • HTTPS 配置:Server 和 Client 端均启用 HTTPS,防止数据传输泄露;
  • 网络隔离:SBA Server 部署在内部网络,仅允许运维人员访问,禁止公网暴露。

5.4 与其他监控工具集成

  • 与 Prometheus+Grafana 配合:SBA 负责实时监控和运维操作,Prometheus 负责指标存储和长期分析,Grafana 负责自定义仪表盘;
  • 与 ELK 配合:将 SBA 的日志告警、应用日志导入 Elasticsearch,通过 Kibana 进行日志分析和问题排查。

六、常见问题排查

6.1 Client 注册失败

  • 检查 Server 地址是否正确:spring.boot.admin.client.url 配置是否指向 Server 实际地址;
  • 检查端口占用:Client 端口是否被占用,Server 端口是否可访问;
  • 检查依赖版本:Spring Boot 与 SBA 版本是否兼容;
  • 检查日志:Client 日志查看是否有 Registration failed 异常,Server 日志查看是否有认证失败、连接超时等错误。

6.2 SBA 界面看不到指标数据

  • 检查 Actuator 端点暴露:management.endpoints.web.exposure.include 是否包含 metrics 端点;
  • 检查 Client 依赖:是否引入 spring-boot-starter-actuator 依赖;
  • 检查权限:若开启安全认证,Server 是否有访问 Client 端点的权限(metadata 中是否配置正确的账号密码)。

6.3 告警发送失败

  • 检查邮件配置:SMTP 服务器地址、端口、授权码是否正确,是否开启 SSL/TLS;
  • 检查网络:Server 是否能访问外部邮件服务器/钉钉 WebHook 地址;
  • 检查日志:Server 日志查看 MailNotifier/自定义告警类的异常信息。

七、总结与展望

Spring Boot Admin 是 Spring Boot 应用的"运维瑞士军刀",通过极简配置即可实现应用监控、运维操作、告警通知,特别适合中小规模微服务集群。其核心优势在于轻量化、无侵入性(基于 Actuator 扩展)、可视化友好,可快速落地生产环境。

但 SBA 也存在局限性:缺乏长期指标存储、不支持复杂的告警规则配置、集群监控能力有限。因此,在大规模微服务架构中,建议将 SBA 与 Prometheus+Grafana、ELK 等工具结合,构建"实时监控+长期分析+日志排查"的完整监控体系。

未来,随着 Spring Boot 3.x 和 SBA 3.x 的普及,其对云原生的支持将进一步加强(如原生支持 Kubernetes 探针、OpenTelemetry 集成),成为云原生时代轻量级监控的首选方案。

附录:参考资料

  1. Spring Boot Admin 官方文档:https://codecentric.github.io/spring-boot-admin/2.7.10/
  2. Spring Boot Actuator 官方文档:https://docs.spring.io/spring-boot/docs/2.7.10/reference/html/actuator.html
  3. Micrometer 官方文档:https://micrometer.io/docs
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐