ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Spring Boot Admin 基于 Hazelcast 的高可用集群部署实战指南

Spring Boot Admin 基于 Hazelcast 的高可用集群部署实战指南 Spring Boot Admin 基于 Hazelcast 的高可用集群部署实战指南【免费下载链接】spring-boot-adminAdmin UI for administration of spring boot applications项目地址: https://gitcode.com/gh_mirrors/sp/spring-boot-adminSpring Boot Admin Server 默认将实例事件、通知状态等保存在单机内存中多实例部署时各自为政。本文以仓库中完整的 Hazelcast 示例工程spring-boot-admin-sample-hazelcast为骨架系统讲解如何用 Hazelcast 分布式事件存储将多个 Admin Server 实例组成高可用集群包括多实例启动、分布式事件同步与通知去重原理、生产环境网络发现方案以及监控运维手段。读完本文你将能独立搭建一个无单点故障、支持水平扩展的 Spring Boot Admin 集群。示例工程一览示例代码位于仓库的spring-boot-admin-samples/spring-boot-admin-sample-hazelcast/目录其核心功能包括基于 Hazelcast 的分布式事件存储Distributed event store多实例集群部署Multi-instance clustering跨实例共享的通知去重状态Shared notification state高可用High availabilityTCP/IP 集群成员发现TCP/IP cluster discovery启用 JMX 监控JMX monitoring enabled从示例的 pom.xml 可以看到它同时依赖了 Admin Serverspring-boot-admin-starter-server与 Admin Clientspring-boot-admin-starter-client并额外引入com.hazelcast:hazelcast作为分布式基础设施还带有spring-boot-starter-webmvc与spring-boot-starter-security说明这是一个自带注册客户端与安全配置的完整可运行样例。前置条件Java 17、Maven 3.6。多实例启动三分钟拉起一个集群示例工程没有使用 Docker Compose而是通过三个终端分别以不同端口启动同一份应用利用 Hazelcast 的成员发现自动成团。Terminal 1端口 8080cd spring-boot-admin-samples/spring-boot-admin-sample-hazelcast mvn spring-boot:runTerminal 2端口 8081SERVER_PORT8081 mvn spring-boot:runTerminal 3端口 8082SERVER_PORT8082 mvn spring-boot:run三个实例启动后会自动组成一个 Hazelcast 集群并共享以下状态Instance events实例事件应用注册、状态变化等事件记录Notification state通知状态哪些事件已经发送过通知Application registry应用注册表被监控应用的注册信息主入口类 SpringBootAdminHazelcastApplication.java 使用SpringBootApplication与EnableAdminServer注解启动 Admin Server并在其中定义了两个安全 Profileinsecure与secure方便本地演示与生产启用认证两种场景切换。依赖清单把以下依赖加入pom.xml即可复刻该示例dependency groupIdde.codecentric/groupId artifactIdspring-boot-admin-starter-server/artifactId /dependency dependency groupIdde.codecentric/groupId artifactIdspring-boot-admin-starter-client/artifactId /dependency dependency groupIdcom.hazelcast/groupId artifactIdhazelcast/artifactId /dependency其中spring-boot-admin-starter-server提供 Admin Server 核心能力spring-boot-admin-starter-client让该应用自身注册为被监控实例方便在示例中看到效果hazelcast则提供分布式数据结构的运行时。深入 Hazelcast 配置示例的核心配置是一个名为hazelcastConfig()的ConfigBean完整代码见 SpringBootAdminHazelcastApplication.javaBean public Config hazelcastConfig() { // Event store map - holds all instance events MapConfig eventStoreMap new MapConfig(DEFAULT_NAME_EVENT_STORE_MAP) .setInMemoryFormat(InMemoryFormat.OBJECT) .setBackupCount(1) // 1 backup copy .setMergePolicyConfig( new MergePolicyConfig(PutIfAbsentMergePolicy.class.getName(), 100) ); // Notification map - deduplicates notifications MapConfig sentNotificationsMap new MapConfig(DEFAULT_NAME_SENT_NOTIFICATIONS_MAP) .setInMemoryFormat(InMemoryFormat.OBJECT) .setBackupCount(1) .setEvictionConfig( new EvictionConfig() .setEvictionPolicy(EvictionPolicy.LRU) .setMaxSizePolicy(MaxSizePolicy.PER_NODE) ); Config config new Config(); config.addMapConfig(eventStoreMap); config.addMapConfig(sentNotificationsMap); config.setProperty(hazelcast.jmx, true); // TCP/IP cluster discovery (local) config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false); TcpIpConfig tcpIpConfig config.getNetworkConfig() .getJoin() .getTcpIpConfig(); tcpIpConfig.setEnabled(true); tcpIpConfig.setMembers(singletonList(127.0.0.1)); return config; }配置要点逐项拆解Event Store事件存储 Map事件存储 Map 用于保存所有实例事件。示例对其配置了InMemoryFormat.OBJECT以对象形式存储而非二进制序列化、setBackupCount(1)每个分片保留 1 份备份副本并设置了PutIfAbsentMergePolicy合并策略批处理大小 100用于集群脑裂恢复时的事件合并。源码注释特别强调该 Map 必须可靠地承载全部数据Spring Boot Admin 会在事件过多时自动进行事件压缩因此没有为其配置任何淘汰策略。Sent Notifications通知去重 Map该 Map 用于通知去重。与事件存储不同即使这里的数据丢失也不是大问题——最坏情况只是多个实例重复发送同一条通知因此示例为其配置了LRU淘汰策略与PER_NODE容量上限策略防止内存无限增长。集群发现示例注释明确警告WARNING: This setups a local cluster, you change it to fit your needs.这是一个本地集群配置请按需修改。它关闭了多播发现改用 TCP/IP 发现并将成员列表设置为127.0.0.1这正是三终端本地演示能成团的原因——三个进程通过 5701、5702、5703 等自动递增端口在本地互联。JMXconfig.setProperty(hazelcast.jmx, true)开启 Hazelcast 的 JMX 暴露便于用 JConsole 等工具监控集群内部状态。关键常量与自动装配原理示例中DEFAULT_NAME_EVENT_STORE_MAP与DEFAULT_NAME_SENT_NOTIFICATIONS_MAP两个常量直接 import 自服务端核心模块的 AdminServerHazelcastAutoConfiguration.java其值分别为spring-boot-admin-event-store与spring-boot-admin-sent-notifications。也就是说示例自定义的hazelcastConfig()配置的正是 Admin Server 自动装配所使用的那两张 Map二者通过常量名称严格对齐。从该自动配置类还可以看到两个重要的可配置属性均有默认值可覆盖 Map 名称spring.boot.admin.hazelcast.event-store事件存储 Map 名称默认spring-boot-admin-event-storespring.boot.admin.hazelcast.sent-notifications通知去重 Map 名称默认spring-boot-admin-sent-notifications此外AdminServerHazelcastAutoConfiguration上的条件注解揭示了它何时生效ConditionalOnSingleCandidate(HazelcastInstance.class)容器中恰好存在一个 Hazelcast 实例 Bean即依赖了 Hazelcast 并声明了实例ConditionalOnProperty(prefix spring.boot.admin.hazelcast, name enabled, matchIfMissing true)可通过spring.boot.admin.hazelcast.enabledfalse显式关闭当上述条件满足时它会自动装配两类关键组件HazelcastEventStore实现InstanceEventStore以 Hazelcast Map 为后端的事件存储。查看 HazelcastEventStore.java 源码可知它在构造时向 Map 注册了EntryAdapter条目监听器一旦 Map 中的事件列表被其他节点更新就通过entryUpdated回调解析出新版本的事件e.getVersion() lastKnownVersion并发布到本地事件流——这是一个实例写入事件、其他实例立刻感知的底层机制。HazelcastNotificationTrigger以 Hazelcast Map 记录已发送通知实现跨实例通知去重详见下文。集群工作原理解析事件同步流程实例 A 收到某个被监控应用的状态变更事件事件被写入 Hazelcast 分布式 Mapspring-boot-admin-event-store实例 B、C 通过 Map 条目监听器立即感知到更新所有实例据此更新各自的本地状态。由于事件存储本身位于 Hazelcast 集群中任何节点写入的数据对所有成员可见UI 上看到的应用状态因此保持一致。通知去重流程实例 A 触发并发送了一条通知发送记录写入 Hazelcast 的 sent-notifications Map实例 B 同样观察到该事件先查询 sent-notifications MapB 发现该事件已由 A 发送过跳过发送用户不会收到重复通知。值得注意的是若该 Map 数据丢失例如节点故障时备份未同步最坏情况仅是通知被重复发送不会造成数据不一致这也是示例允许为其配置 LRU 淘汰策略的原因。负载均衡与统一视图用户可连接到任意一个实例——因为三者共享同一份状态看到的数据完全一致。验证集群是否真正工作验证集群成形启动三个实例后在日志中应能看到类似如下的成员列表输出成员 UUID 因环境而异Members {size:3, ver:3} [ Member [127.0.0.1]:5701 - e1f2g3h4 Member [127.0.0.1]:5702 - a5b6c7d8 Member [127.0.0.1]:5703 - i9j0k1l2 ]Members {size:3}说明三个 Admin Server 节点已成功组成一个大小为 3 的 Hazelcast 集群。测试事件共享在 8080 实例上注册一个应用打开 8081 实例的页面——该应用应立即可见停止 8080 实例应用在 8081 上依然可见。测试高可用启动 3 个实例停止 8080 实例8081 与 8082 继续正常工作由于事件 Map 配置了 1 份备份数据不会因单节点宕机而丢失。示例自带一个冒烟测试 SpringBootAdminHazelcastApplicationTest.java通过SpringBootTest验证 Hazelcast 相关上下文能正常加载可作为集成回归的基础。生产环境集群配置示例中的本地 TCP/IP 配置仅用于开发演示。生产环境应根据网络条件选择以下成员发现方式。多播发现Multicast适合同一网段、允许 UDP 多播的内部网络config.getNetworkConfig() .getJoin() .getMulticastConfig() .setEnabled(true) .setMulticastGroup(224.2.2.3) .setMulticastPort(54327);TCP/IP 指定多主机云环境或跨网段部署时多播常被禁用此时应显式列出所有成员主机名tcpIpConfig.setMembers(Arrays.asList( admin-1.company.com, admin-2.company.com, admin-3.company.com ));Kubernetes 发现在 Kubernetes 中部署时可借助hazelcast-kubernetes插件按 Service 自动发现 Podconfig.getNetworkConfig() .getJoin() .getKubernetesConfig() .setEnabled(true) .setProperty(namespace, default) .setProperty(service-name, spring-boot-admin);更完整的网络配置含 YAML 形式、Kubernetes 依赖坐标、脑裂合并、备份调优、nginx 负载均衡与 Spring Session 粘性会话方案可进一步阅读仓库中的 Hazelcast 集群集成指南。监控 Hazelcast 集群通过 JMX 监控配置中已通过config.setProperty(hazelcast.jmx, true)开启 JMX。使用 JConsole 连接本机进程即可查看jconsole在 MBean 树中查找com.hazelcast命名空间下的 MBeans可观察成员数量、Map 大小、分区数据等运行时指标。Hazelcast Management Center如需可视化监控面板可用 Docker 快速启动 Management Centerdocker run -p 8080:8080 hazelcast/management-center启动后访问http://localhost:8080连接对应集群地址即可查看集群拓扑、Map 数据分布与告警。关键要点回顾✅高可用High Availability事件与通知状态全部存储在 Hazelcast 分布式 Map 中任一 Admin Server 节点故障都不会导致单点失效✅水平扩展Horizontal Scaling新实例启动后自动加入集群动态扩缩容无需停机✅状态共享Shared State所有实例通过 Hazelcast 同步事件存储、通知去重与注册表UI 数据保持一致✅企业级特性Enterprise Features备份副本、LRU 淘汰、脑裂合并策略PutIfAbsentMergePolicy等能力开箱即用。延伸阅读Hazelcast 集群集成指南网络发现、事件存储容量限制、高可用与排障的完整配置说明Servlet 示例单实例 Admin Server 的基础用法自定义 UI 示例在 Admin Server 之上定制前端视图服务端配置参考Admin Server 全部配置项总览【免费下载链接】spring-boot-adminAdmin UI for administration of spring boot applications项目地址: https://gitcode.com/gh_mirrors/sp/spring-boot-admin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表