后端可观测性指标监控监控大盘MCP 服务【免费下载链接】spring-boot-adminAdmin UI for administration of spring boot applications项目地址https://gitcode.com/gh_mirrors/sp/spring-boot-admin点击查看免费下载导读当 Spring Boot Admin Server 需要支撑生产环境的可用性时单实例部署会成为明显的单点故障瓶颈。本文围绕官方文档 40-hazelcast.md 展开系统讲解如何利用 Hazelcast 的分布式数据结构将多个 Admin Server 实例组织为集群实现事件存储共享、状态自动同步与分布式通知去重。读完本文你将掌握从依赖引入、网络发现Multicast / TCP/IP / Kubernetes、事件存储调优到负载均衡、会话持久化与故障排查的完整落地能力并了解仓库中自动配置类与样例工程背后的源码级原理。Hazelcast 集群解决了什么问题在默认部署形态下每个 Spring Boot Admin Server 实例拥有自己独立的内存事件存储Event Store。一旦该实例重启或宕机其积累的应用注册、状态变更事件将全部丢失而横向扩容多实例时各实例之间又互不可见。引入 Hazelcast 后集群可以带来以下能力共享事件存储Shared Event Store多个 Admin Server 实例共用同一份分布式事件日志任一节点写入的事件其他节点立即可见无单点故障No Single Point of Failure任意节点宕机不影响集群整体对外服务与状态读取节点间自动同步Automatic Synchronization通过 Hazelcast 分布式 Map 的监听与合并机制事件在集群内自动传播分布式通知Distributed Notifications通知触发器跨节点去重确保一条事件只触发一次邮件、钉钉、Slack 等通知避免多节点重复轰炸。工作原理与架构官方文档用以下流程图描述集群拓扑多个被监控应用Applications分别向 Admin Server 1、Admin Server 2 注册两台 Admin Server 各自持有本地 Event Store同时与 Hazelcast 分布式数据层双向同步形成共享状态。仓库文档 20-Clustering.mdx 中提供了对应的架构示意图直观展示了两个 Admin Server 实例通过 Hazelcast 共享状态、并各自向被监控服务发起健康检查的场景源码视角自动配置如何生效集群能力并非通过额外开关硬编码启用而是由 Spring Boot 的自动配置机制按条件装配。核心类 AdminServerHazelcastAutoConfiguration.java 的关键注解说明了触发条件ConditionalOnSingleCandidate(HazelcastInstance.class)只要容器中存在唯一的HazelcastInstanceBean集群功能即被激活——这也解释了为什么只需提供一个 Hazelcast 实例即可ConditionalOnProperty(prefix spring.boot.admin.hazelcast, name enabled, matchIfMissing true)可通过spring.boot.admin.hazelcast.enabledfalse显式关闭默认开启AutoConfigureAfter(HazelcastAutoConfiguration.class)确保在 Spring Boot 自带的 Hazelcast 自动配置完成之后执行。该自动配置类内部定义了两个关键分布式 Map 的默认名称常量public static final String DEFAULT_NAME_EVENT_STORE_MAP spring-boot-admin-event-store; public static final String DEFAULT_NAME_SENT_NOTIFICATIONS_MAP spring-boot-admin-sent-notifications;spring-boot-admin-event-store保存每个实例InstanceId对应的InstanceEvent事件列表是集群共享的事件存储spring-boot-admin-sent-notifications记录每个实例已发送通知的最大事件版本号用于跨节点通知去重。两个 Map 的名称分别可通过spring.boot.admin.hazelcast.event-store与spring.boot.admin.hazelcast.sent-notifications属性覆盖。在此基础上自动配置会按需装配两个 Bean当不存在自定义InstanceEventStore时创建HazelcastEventStore当存在NotifierBean 时创建HazelcastNotificationTriggerBean(initMethod start, destroyMethod stop)将通知触发与去重整合进 Hazelcast 分布式 Map。事件存储的实现类 HazelcastEventStore.java 继承自 ConcurrentMapEventStore.java在构造时向IMap注册了EntryAdapter条目监听器当任一节点更新 Map 中的事件列表时本地节点会过滤出版本号大于自身已见版本的新事件并通过响应式流ReactorFlux发布出去从而驱动findAll()、find(InstanceId)与实例状态刷新。测试类 HazelcastEventStoreTest.java 即通过真实启动内嵌 Hazelcast 实例来验证上述读写与发布行为。需要特别澄清的边界应用注册不共享集群共享的是事件与通知状态被注册的应用列表本身并不会在节点间复制。文档 20-Clustering.mdx 明确提醒集群中的每个 Admin Server 实例都会独立轮询自己注册的客户端集合也就是说每个被监控服务会收到来自每个 SBA 节点的健康检查请求。若你的被监控服务对请求量敏感应确保每个应用只向集群中的一个 Admin Server 注册。快速开始引入依赖在pom.xml中加入以下依赖Hazelcast 依赖不指定版本由 Spring Boot BOM 统一管理dependencies dependency groupIdde.codecentric/groupId artifactIdspring-boot-admin-starter-server/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId /dependency dependency groupIdcom.hazelcast/groupId artifactIdhazelcast/artifactId /dependency /dependencies说明spring-boot-admin-starter-server默认采用响应式栈WebFlux若你使用 Servlet 栈如样例工程spring-boot-admin-sample-hazelcast可将spring-boot-starter-webflux替换为spring-boot-starter-webmvc。仓库样例的完整依赖清单见 pom.xml。配置 Hazelcast最小配置只提供一个 HazelcastInstance Bean得益于上面的自动配置你甚至无需手写事件存储 Bean。只要声明一个HazelcastInstance例如通过Hazelcast.newHazelcastInstance()创建AdminServerHazelcastAutoConfiguration就会自动装配事件存储与通知触发器。完整配置Java Config 方式官方文档给出了一份可运行的完整配置它同时声明了事件存储 Map 与通知去重 Mapimport com.hazelcast.config.Config; import com.hazelcast.config.MapConfig; import com.hazelcast.config.MergePolicyConfig; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.map.IMap; import com.hazelcast.spi.merge.PutIfAbsentMergePolicy; import de.codecentric.boot.admin.server.domain.events.InstanceEvent; import de.codecentric.boot.admin.server.domain.values.InstanceId; import de.codecentric.boot.admin.server.eventstore.HazelcastEventStore; import de.codecentric.boot.admin.server.eventstore.InstanceEventStore; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.List; Configuration public class HazelcastConfig { Bean public Config hazelcastConfig() { MapConfig mapConfig new MapConfig(spring-boot-admin-event-store) .setBackupCount(1) .setMergePolicyConfig(new MergePolicyConfig( PutIfAbsentMergePolicy.class.getName(), 100)); Config config new Config(); config.addMapConfig(mapConfig); config.setProperty(hazelcast.jmx, true); // Network configuration config.getNetworkConfig() .setPort(5701) .setPortAutoIncrement(true) .getJoin() .getMulticastConfig() .setEnabled(true); return config; } Bean public HazelcastInstance hazelcastInstance(Config hazelcastConfig) { return Hazelcast.newHazelcastInstance(hazelcastConfig); } Bean public InstanceEventStore eventStore(HazelcastInstance hazelcastInstance) { IMapInstanceId, ListInstanceEvent map hazelcastInstance.getMap(spring-boot-admin-event-store); return new HazelcastEventStore(100, map); } }对照源码需要注意两点事件存储 Map 的名称必须与自动配置中的默认常量DEFAULT_NAME_EVENT_STORE_MAP即spring-boot-admin-event-store保持一致否则自动配置装配的HazelcastEventStore与你手写的 Bean 会指向不同的 Map集群共享将失效官方文档这份示例手动创建了HazelcastEventStoreBean覆盖了自动配置的默认行为。若你不需要自定义例如调整单实例最大事件数可以省略该 Bean让自动配置使用默认值默认每个实例最多保留 100 条事件见 HazelcastEventStore.java 的无参构造this(100, eventLog)。基础配置YAML 方式以下 YAML 遵循 Hazelcast 原生配置结构可置于 classpath 下的hazelcast.yamlSpring Boot 的HazelcastAutoConfiguration会自动加载也可以通过spring.hazelcast.config指定外部配置文件位置实现与上方 Java 配置等价的效果spring: application: name: spring-boot-admin-server hazelcast: network: port: 5701 port-auto-increment: true join: multicast: enabled: true tcp-ip: enabled: false网络配置节点如何互相发现Hazelcast 支持多种成员发现机制选择依据是部署环境。仓库样例与文档均强调没有一种配置放之四海而皆准生产环境必须按网络拓扑定制。Multicast推荐用于开发环境Multicast 自动发现无需预先指定成员地址适合本机或开发网络。Java 方式config.getNetworkConfig() .getJoin() .getMulticastConfig() .setEnabled(true) .setMulticastGroup(224.2.2.3) .setMulticastPort(54327);等价 YAMLhazelcast: network: join: multicast: enabled: true multicast-group: 224.2.2.3 multicast-port: 54327注意很多云环境、容器网络默认禁用组播此时 Multicast 无法生效应改用 TCP/IP 或 Kubernetes 发现。TCP/IP推荐用于生产环境生产环境推荐显式列出全部成员地址先关闭 Multicast再启用 TCP-IP 并addMember声明成员列表config.getNetworkConfig() .getJoin() .getMulticastConfig() .setEnabled(false); config.getNetworkConfig() .getJoin() .getTcpIpConfig() .setEnabled(true) .addMember(192.168.1.100) .addMember(192.168.1.101) .addMember(192.168.1.102);等价 YAMLhazelcast: network: join: multicast: enabled: false tcp-ip: enabled: true members: - 192.168.1.100 - 192.168.1.101 - 192.168.1.102仓库样例 SpringBootAdminHazelcastApplication.java 使用的即是 TCP/IP 方案——它关闭 Multicast 与自动发现将成员显式设为127.0.0.1以在单机形成本地集群并注释提示This setups a local cluster, you change it to fit your needs。KubernetesK8s 环境需要额外的发现插件依赖dependency groupIdcom.hazelcast/groupId artifactIdhazelcast-kubernetes/artifactId /dependency随后通过KubernetesConfig基于命名空间与服务名发现集群成员config.getNetworkConfig() .getJoin() .getMulticastConfig() .setEnabled(false); config.getNetworkConfig() .getJoin() .getKubernetesConfig() .setEnabled(true) .setProperty(namespace, default) .setProperty(service-name, spring-boot-admin);事件存储调优分布式 Map 参数事件存储本质是一个IMapInstanceId, ListInstanceEvent其可靠性直接决定集群数据安全。文档给出了推荐配置及含义MapConfig mapConfig new MapConfig(spring-boot-admin-event-store) .setBackupCount(1) // Number of backup copies .setAsyncBackupCount(0) // Async backups .setTimeToLiveSeconds(0) // No expiration .setMaxIdleSeconds(0) // No idle timeout .setMergePolicyConfig(new MergePolicyConfig( PutIfAbsentMergePolicy.class.getName(), 100));setBackupCount(1)至少 1 份同步备份节点宕机不丢数据setAsyncBackupCount(0)异步备份数量按需开启以降低写入延迟setTimeToLiveSeconds(0)/setMaxIdleSeconds(0)事件数据不设过期与空闲淘汰设为 0 表示永不过期setMergePolicyConfig配置脑裂恢复时的合并策略PutIfAbsentMergePolicy保证已有数据不被覆盖。仓库样例 SpringBootAdminHazelcastApplication.java 还展示了事件存储 Map 应使用InMemoryFormat.OBJECT并指出事件 Map 需要可靠地保存全部数据事件过多时 Spring Boot Admin 会自动压缩compact。这个压缩行为正是 ConcurrentMapEventStore.java 中compact()方法所实现的当单个实例的事件列表超过上限时对同一类型事件仅保留最新一条同时为InstanceStatusChangedEvent按状态UP / DOWN / OUT_OF_SERVICE / UNKNOWN / RESTRICTED / OFFLINE各保留一条避免丢失关键状态轨迹。此外该实现还基于事件版本号执行乐观锁校验OptimisticLockingException保证分布式并发写入下事件顺序不紊乱。限制单实例事件数通过构造器第二个参数可控制每个实例最多保留的事件条数超出后由上述压缩机制收敛Bean public InstanceEventStore eventStore(HazelcastInstance hazelcastInstance) { IMapInstanceId, ListInstanceEvent map hazelcastInstance.getMap(spring-boot-admin-event-store); return new HazelcastEventStore(500, map); // Max 500 events per instance }通知去重 Map 的独立调优仓库样例额外对spring-boot-admin-sent-notificationsMap 配置了 LRU 驱逐策略该 Map 仅用于记录某实例已通知到的事件版本号即使数据丢失也至多导致同一条通知被多个节点重复发送一次不会造成更严重后果因此可以用有界容量控制内存占用MapConfig sentNotificationsMap new MapConfig(DEFAULT_NAME_SENT_NOTIFICATIONS_MAP) .setInMemoryFormat(InMemoryFormat.OBJECT) .setBackupCount(1) .setEvictionConfig( new EvictionConfig().setEvictionPolicy(EvictionPolicy.LRU).setMaxSizePolicy(MaxSizePolicy.PER_NODE)) .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMergePolicy.class.getName(), 100));去重逻辑在 HazelcastNotificationTrigger.java 中实现它先从分布式 Map 读取该实例最后一次已发送事件的版本号若事件版本已处理则直接跳过否则通过putIfAbsent/replace的 CAS 语义原子地推进版本号确保多节点并发触发时只有赢得写入的一方真正调用Notifier。高可用部署负载均衡与会话Nginx 负载均衡将流量分发到多个 Admin Server 节点least_conn适合请求量不均的场景upstream spring_boot_admin { least_conn; server admin1:8080; server admin2:8080; server admin3:8080; } server { listen 80; server_name admin.example.com; location / { proxy_pass http://spring_boot_admin; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }会话持久化Admin UI 依赖 HTTP Session。若不做处理负载均衡轮询会导致用户会话漂移。两种常用方案方案一Nginx 层启用粘性会话upstream spring_boot_admin { ip_hash; # Sticky sessions server admin1:8080; server admin2:8080; }方案二使用 Spring Session 将会话存入 Hazelcast实现会话真正跨节点共享故障转移时无需粘性dependency groupIdorg.springframework.session/groupId artifactIdspring-session-hazelcast/artifactId /dependencyEnableHazelcastHttpSession Configuration public class SessionConfig { // Hazelcast will be used for session storage }Docker Compose 一键部署文档给出了三节点加 Nginx 的编排示例三个 Admin 节点通过环境变量HAZELCAST_MEMBERS传递成员列表应用内将其映射为 TCP-IP 成员配置即可version: 3 services: admin1: build: ./admin-server ports: - 8080:8080 environment: - HAZELCAST_MEMBERSadmin1,admin2,admin3 - SERVER_PORT8080 admin2: build: ./admin-server ports: - 8081:8080 environment: - HAZELCAST_MEMBERSadmin1,admin2,admin3 - SERVER_PORT8080 admin3: build: ./admin-server ports: - 8082:8080 environment: - HAZELCAST_MEMBERSadmin1,admin2,admin3 - SERVER_PORT8080 nginx: image: nginx:alpine ports: - 80:80 volumes: - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - admin1 - admin2 - admin3注意容器网络内组播通常不可用上述部署应配合 TCP-IP 或 Kubernetes 发现方式并确保 5701 端口在节点间互通。监控集群健康Hazelcast Management Center开启 Management Center 后可可视化查看成员、分区与 Map 数据hazelcast: management-center: enabled: true url: http://localhost:8083/mancenterJMX 监控通过系统属性开启 Hazelcast 的 JMX 暴露便于接入已有监控体系config.setProperty(hazelcast.jmx, true);仓库样例同样启用了该属性。自定义健康检查通过成员数量判断集群是否健康可进一步暴露为 Actuator 端点或接入告警Component public class HazelcastHealthCheck { private final HazelcastInstance hazelcastInstance; public HazelcastHealthCheck(HazelcastInstance hazelcastInstance) { this.hazelcastInstance hazelcastInstance; } public boolean isHealthy() { return hazelcastInstance.getCluster().getMembers().size() 0; } public int getClusterSize() { return hazelcastInstance.getCluster().getMembers().size(); } }故障排查脑裂Split Brain网络分区导致集群分裂为多个小集群恢复合并时通过 Merge Policy 决定数据取舍。PutIfAbsentMergePolicy在合并时保留已存在的数据避免事件日志被回退mapConfig.setMergePolicyConfig(new MergePolicyConfig( PutIfAbsentMergePolicy.class.getName(), 100));成员无法加入集群按以下顺序排查检查网络连通性5701 为 Hazelcast 默认端口telnet admin1 5701确认组播可用性使用 Multicast 发现时# Check if multicast is enabled ip maddr show检查日志Hazelcast 日志会输出连接尝试与成员加入/失败记录关注Join、Member相关条目。性能问题提高备份数数据更安全但增加网络开销mapConfig.setBackupCount(2);启用异步备份降低写入延迟mapConfig.setAsyncBackupCount(1);监控事件 Map 规模结合事件压缩阈值判断是否过大IMap map hazelcastInstance.getMap(spring-boot-admin-event-store); log.info(Map size: {}, map.size());最佳实践清单生产环境使用 TCP/IP 或 Kubernetes 发现Multicast 在云环境和多数容器网络不可用配置合适的备份数事件 Map 至少 1 份备份setBackupCount(1)保证节点故障不丢事件为事件存储设置合理上限如new HazelcastEventStore(500, map)结合自动压缩避免内存无限增长持续监控集群健康使用 Management Center 或 JMX 观察成员数、Map 容量与分区分布前置负载均衡器将流量均匀分发到多个 Admin Server 节点启用会话持久化粘性会话或 Spring Session Hazelcast保证故障转移时 UI 会话不中断正确配置网络尤其在 Kubernetes / Docker 环境明确成员列表、端口与安全组规则。完整示例与延伸阅读仓库提供了可直接运行验证的完整样例工程 spring-boot-admin-sample-hazelcast其入口类 SpringBootAdminHazelcastApplication.java 集成了本节所述的全部要点事件存储 Map 与通知去重 Map 的双重配置、JMX 开启、TCP-IP 成员发现以及insecure/secure两套安全 Profile后者启用表单登录与 CSRF 保护仅放行/assets/**、/login及/actuator/**。运行方式与普通 Spring Boot 应用一致例如通过./mvnw spring-boot:run -pl spring-boot-admin-samples/spring-boot-admin-sample-hazelcast启动仓库根目录见 mvnw。建议继续阅读仓库内以下相关文档形成完整知识闭环Clustering 集群总览集群共享范围边界、应用注册不复制等关键约束的权威说明Persistence 持久化事件存储的实现细节与持久化方案对比Hazelcast 样例详解样例工程的逐步走读。赞分享后端可观测性指标监控监控大盘MCP 服务【免费下载链接】spring-boot-adminAdmin UI for administration of spring boot applications项目地址https://gitcode.com/gh_mirrors/sp/spring-boot-admin点击查看免费下载相关推荐Spring Boot Admin 基于 Hazelcast 的高可用集群部署实战指南Spring Boot Admin 基于 Hazelcast 的高可用集群部署实战指南 Spring Boot Admin Server 默认将实例事件、通知状后端可观测性指标监控监控大盘MCP 服务spring-boot-demo-admin-server基于 Spring Boot Admin 搭建应用监控服务端实战spring boot demo admin server基于 Spring Boot Admin 搭建应用监控服务端实战 本文以仓库中的 demo admi示例工程后端Spring Boot Admin 持久化与事件存储Persistence Event Store实战指南Spring Boot Admin 持久化与事件存储Persistence Event Store实战指南 Spring Boot Admin 采用 事后端可观测性指标监控监控大盘MCP 服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
