当前位置:首页 > 技术 > 正文内容

基于 Spring Boot Admin 的微服务监控中心构建

访客 技术 2026年8月7日 3

背景与动机

Spring Boot Actuator 为单个应用提供了丰富的运行时监控能力,涵盖健康检查、内存、线程、堆栈等指标。然而,当集群规模扩大时,直接调用各个端点并解析 JSON 输出不仅效率低下,而且对运维人员并不友好。Spring Boot Admin 正是为此而生,它将 Actuator 数据通过美观的 Web UI 集中展示,并支持安全认证与邮件告警,极大提升了可观测性体验。

搭建监控服务端

服务端负责收集所有客户端上报的 Actuator 信息,并渲染到前端界面。以下使用 Spring Boot 2.x 与 spring-boot-admin-starter-server 进行构建。

1. 依赖配置

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.1.5</version>
</dependency>

2. 基础参数

server:
  port: 8088

spring:
  application:
    name: admin-server

3. 启动类

@SpringBootApplication
@EnableAdminServer
public class MonitorServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(MonitorServerApplication.class, args);
    }
}

至此,服务端已可运行,并暴露管理界面。接下来我们为它增加安全防护和异常通知。

4. 集成安全模块

引入登录界面与 Spring Security,实现基于表单的认证。

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server-ui-login</artifactId>
    <version>1.5.7</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

配置文件中定义管理员账号:

security:
  user:
    name: ${admin.user:admin}
    password: ${admin.pass:admin123}

安全策略配置类:

@Configuration
@EnableWebSecurity
public class AdminSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
            .loginPage("/login.html")
            .loginProcessingUrl("/login")
            .permitAll()
            .and()
            .logout().logoutUrl("/logout")
            .and()
            .csrf().disable();

        http.authorizeRequests()
            .antMatchers("/login.html", "/**/*.css", "/img/**", "/third-party/**")
            .permitAll()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
    }
}

登录界面效果:

登录界面

5. 邮件告警通知

当监控的应用状态发生变化时,通过邮件及时通知运维人员。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

邮件服务器配置:

spring:
  mail:
    host: smtp.exmail.qq.com
    port: 465
    username: your-email@domain.com
    password: your-password
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
          ssl:
            trust: smtp.exmail.qq.com

自定义通知器,监听状态变更事件并发送邮件:

@Configuration
@EnableScheduling
public class AlertNotifierConfiguration {

    private static final Logger log = LoggerFactory.getLogger(AlertNotifierConfiguration.class);

    @Autowired
    private JavaMailSender mailSender;

    @Bean
    @Primary
    public RemindingNotifier remindingNotifier() {
        RemindingNotifier notifier = new RemindingNotifier(new AbstractEventNotifier() {
            @Override
            protected void doNotify(ClientApplicationEvent event) {
                if (event instanceof ClientApplicationStatusChangedEvent) {
                    ClientApplicationStatusChangedEvent statusEvent = (ClientApplicationStatusChangedEvent) event;
                    String appName = event.getApplication().getName();
                    String appId = event.getApplication().getId();
                    String healthUrl = event.getApplication().getHealthUrl();
                    String from = statusEvent.getFrom().getStatus();
                    String to = statusEvent.getTo().getStatus();
                    String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                            .format(new Date(statusEvent.getTimestamp()));

                    String message = String.format("应用 %s (ID: %s, Health: %s) 状态从 %s 变为 %s,时间: %s",
                            appName, appId, healthUrl, from, to, time);
                    log.warn(message);

                    SimpleMailMessage mail = new SimpleMailMessage();
                    mail.setFrom("alert@domain.com");
                    mail.setTo("ops@domain.com");
                    mail.setSubject(appName + " 状态变更");
                    mail.setText(message);
                    mailSender.send(mail);
                } else {
                    log.info("事件: {} - {} ({})", event.getApplication().getName(),
                            event.getApplication().getId(), event.getType());
                }
            }
        });
        notifier.setReminderPeriod(TimeUnit.MINUTES.toMillis(5));
        return notifier;
    }

    @Scheduled(fixedRate = 60_000L)
    public void sendPendingReminders() {
        remindingNotifier().sendReminders();
    }
}

邮件通知示例:

邮件告警

客户端注册

每个需要监控的 Spring Boot 应用只需引入客户端依赖,并指向服务端地址即可自动注册。

1. 依赖引入

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.1.5</version>
</dependency>

2. 客户端配置

spring:
  application:
    name: order-service
  boot:
    admin:
      client:
        enabled: true
        instance:
          name: ${spring.application.name}
          prefer-ip: true
        url: http://127.0.0.1:8088
management:
  endpoints:
    web:
      exposure:
        include: '*'

启动客户端后,服务端界面即可看到该实例的详细信息及实时指标。

监控面板展示

概览面板 应用详情

通过 Spring Boot Admin,运维人员可以直观地掌握所有微服务的健康状况、JVM 指标、日志等,结合告警机制,显著提升了故障响应速度。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。