news 2026/8/20 16:41:09

Ice 分布式部署实战:Docker Compose + NFS 搭建高可用规则集群

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ice 分布式部署实战:Docker Compose + NFS 搭建高可用规则集群

Ice 分布式部署实战:Docker Compose + NFS 搭建高可用规则集群

【免费下载链接】iceRule engine/process engine, committed to solving flexible and complex hard-coded problems, for complex/flexibly changing business, provide a new abstract orchestration solution that is lightweight, high-performance and provides visual operation pages. Java规则引擎-ice,针对复杂/灵活变动业务,提供一个新的抽象编排解决方案,轻量级,高性能并提供可视化操作页面项目地址: https://gitcode.com/gh_mirrors/ice6/ice

Ice 是一款轻量级、零依赖的可视化规则引擎,采用树形结构编排业务规则,支持 Java、Go、Python 多语言 SDK,配置变更秒级热更新。当业务规模增长、单机部署无法满足可用性要求时,你可以用Docker Compose + NFS快速搭建 Ice 分布式部署的高可用规则集群——多个 Server 共享同一份规则配置,任何一个节点宕机都不影响规则发布与执行。本文将带你从零开始完成这套架构的落地。

一、Ice 分布式架构解析:纯文件存储如何实现高可用

很多同学会好奇:Ice 规则引擎不依赖数据库、消息队列和服务注册中心,靠一个ice-data/文件目录存储规则,它凭什么做分布式高可用?

答案在于它的核心设计:Server 与 Client 完全解耦。Server 负责 Web UI 可视化编排与规则发布,Client(业务应用内嵌 SDK)通过轮询共享目录检测版本变化并加载规则到内存执行。两者之间没有网络协议,只通过共享存储目录交互:

┌──────────────────────────────────────────────────┐ │ NFS 共享存储 (ice-data/) │ │ apps/ bases/ confs/ versions/ clients/ │ └──────────────────────────────────────────────────┘ ▲ 写入(发布规则) ▲ 读取(轮询版本) ┌───────┴────────┐ ┌────────┴─────────┐ │ Ice Server 1 │ │ Ice Client │ │ Ice Server 2 │ │ (业务应用 SDK) │ │ Web UI / 发布 │ │ 内存执行 / 热更新 │ └────────────────┘ └──────────────────┘

这套设计的妙处在于:

  • Server 宕机不影响 Client:Client 已把规则加载到内存,即使所有 Server 都挂掉,业务规则照常执行;
  • 增量更新机制:Client 轮询versions/目录,只应用增量文件,缺文件时自动回退全量加载;
  • 文件级原子写:所有配置写入都采用「临时文件 + 重命名」方式(见server/storage/storage.go),天然适配 NFS 共享盘。

所以,只要把ice-data/放到所有节点都能访问的 NFS 上,多台 Server 就构成了一致的高可用规则集群。

二、部署前准备:NFS 共享存储的搭建方法

高可用规则集群的第一步,是先准备一个所有节点共享的 NFS 存储。以下以两台 CentOS/Ubuntu 主机为例(一台作 NFS 服务端,其余作挂载端)。

Step 1:在存储节点上搭建 NFS 服务端

# 安装 NFS 服务端(Ubuntu 为例) sudo apt install -y nfs-kernel-server # 创建共享目录并赋予权限 sudo mkdir -p /data/ice-data sudo chmod 777 /data/ice-data # 导出共享目录 echo "/data/ice-data *(rw,sync,no_root_squash,no_subtree_check)" | sudo tee -a /etc/exports sudo exportfs -ra

Step 2:在应用节点上挂载 NFS 客户端

sudo apt install -y nfs-common sudo mkdir -p /mnt/ice-data sudo mount -t nfs <NFS服务端IP>:/data/ice-data /mnt/ice-data # 写入 fstab 实现开机自动挂载 echo "<NFS服务端IP>:/data/ice-data /mnt/ice-data nfs defaults,nolock 0 0" | sudo tee -a /etc/fstab

💡 小提示:挂载时建议加上nolock选项。Ice 的 ID 生成器与版本写入均采用文件原子操作,nolock能避免部分 NFS 环境的锁文件兼容问题。

三、Docker Compose 一键编排高可用规则集群

共享存储就绪后,用 Docker Compose 编排两个 Ice Server 实例,端口分别映射到宿主机的 8121 与 8122,二者挂载同一份 NFS 目录。

version: "3.8" services: ice-server-1: image: waitmoon/ice-server:latest container_name: ice-server-1 ports: - "8121:8121" volumes: - /mnt/ice-data:/app/ice-data environment: - ICE_PUBLISH_TARGETS=node2=http://ice-server-2:8121 restart: always ice-server-2: image: waitmoon/ice-server:latest container_name: ice-server-2 ports: - "8122:8121" volumes: - /mnt/ice-data:/app/ice-data environment: - ICE_PUBLISH_TARGETS=node1=http://ice-server-1:8121 restart: always

执行启动命令:

docker compose up -d

容器内ice-server的默认数据目录为/app/ice-data(见server/Dockerfile),通过-storage-path参数指定,我们已用卷挂载覆盖。启动后访问http://节点IP:8121http://节点IP:8122,两个 Web UI 看到的规则完全一致——因为它们读的是同一份 NFS 数据。

如果想用 Docker 原生的 NFS 卷驱动,也可以把volumes段替换为:

volumes: nfs-data: driver: local driver_opts: type: nfs o: addr=<NFS服务端IP>,rw,nolock,soft device: ":/data/ice-data"

四、多实例发布配置:规则一键同步到所有节点

集群里两台 Server 都连了同一份存储,那在 Web UI 上发布规则时会发生什么?

这里要引入 Ice 的publish-targets(发布目标)机制。发布接口会携带完整的规则 JSON,请求会转发到配置的远端 Server 的/ice-server/base/import接口(见server/handler/publish.go),实现跨节点同步。

上面的 Compose 配置中,我们已经给每个节点设置了对端地址:

  • ice-server-1配置ICE_PUBLISH_TARGETS=node2=http://ice-server-2:8121
  • ice-server-2配置ICE_PUBLISH_TARGETS=node1=http://ice-server-1:8121

在任意一台 Server 的 Web UI 上点击「应用/发布」时,选择发布目标即可把规则推送到对端,配合共享存储,所有 Client 都能在数秒内热更新生效。

除了环境变量,server/config/config.go也支持命令行参数-publish-targets,格式同为name1=url1,name2=url2。此外,server/ice.sh脚本展示了完整的启动参数示例,包括-port-client-timeout-version-retention和定时清理配置-recycle-cron,均可按需调整。

五、客户端接入与热更新验证

规则集群搭好后,业务应用通过 SDK 接入即可。Ice 提供了功能完全对等的三套 SDK:

  • Javasdks/java/ice-core,使用IceFileClient(app, storagePath, scanPackage)初始化;
  • Gosdks/go,使用ice.NewClient(app, storagePath)初始化;
  • Pythonsdks/python,使用ice.FileClient(app, storage_path)初始化。

以 Go 为例,接入集群的客户端只需要指向 NFS 挂载路径:

client, _ := ice.NewClient(1, "/mnt/ice-data") client.Start() defer client.Destroy()

验证热更新的最快方法:在 Web UI 上修改规则树某个节点的阈值并发布,观察业务应用日志——默认 2 秒轮询间隔内即可看到新版本生效,全程无需重启应用。

六、高可用效果验证与常见问题排查

集群部署完成后,强烈建议做一次故障演练:

  1. 在 Web UI 发布一条规则,确认两台 Server 都同步成功;
  2. docker stop ice-server-1,再访问:8122的 Web UI——规则依旧可编辑、可发布;
  3. 重启业务应用,Client 从 NFS 重新加载规则,正常运行。

📌 常见问题速查:

现象排查方向
两个 Server 看到的数据不一致检查 NFS 挂载是否成功、fstab是否配置开机挂载
发布规则时提示 unknown publish target检查ICE_PUBLISH_TARGETS格式与容器间网络互通(用服务名而非 localhost)
客户端迟迟不生效确认 Client 的storagePath指向共享目录;调整pollInterval(默认 2s)
集群节点显示离线检查ICE_CLIENT_TIMEOUT(默认 30s)与客户端心跳间隔是否匹配

七、总结:从单机到高可用规则集群只需三步

Ice 规则引擎的分布式部署并不复杂:准备 NFS 共享盘 → Docker Compose 编排多实例 → 配置发布目标。借助「Server/Client 解耦 + 纯文件存储」的架构优势,你无需引入任何中间件,就能获得秒级热更新、节点故障自愈的高可用规则集群,非常适合营销活动、风控、动态定价等对规则变更频率和稳定性要求高的业务场景。

【免费下载链接】iceRule engine/process engine, committed to solving flexible and complex hard-coded problems, for complex/flexibly changing business, provide a new abstract orchestration solution that is lightweight, high-performance and provides visual operation pages. Java规则引擎-ice,针对复杂/灵活变动业务,提供一个新的抽象编排解决方案,轻量级,高性能并提供可视化操作页面项目地址: https://gitcode.com/gh_mirrors/ice6/ice

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/20 16:27:42

AI 旋转相架智能功率 MOSFET 核心选型方案

随着 AI 技术在智能相架&#xff08;如人脸追踪、多角度展示、静音旋转&#xff09;中的广泛应用&#xff0c;对驱动电机的功率 MOSFET 提出了更高要求&#xff1a;高精度、低功耗、小尺寸。微碧半导体&#xff08;VBsemi&#xff09;基于先进的 Trench 工艺&#xff0c;为您提…

作者头像 李华
网站建设 2026/8/20 16:22:53

零代码绘制惊艳地图:prettymaps Web界面全攻略

零代码绘制惊艳地图&#xff1a;prettymaps Web界面全攻略 【免费下载链接】prettymaps Draw pretty maps from OpenStreetMap data! Built with osmnx matplotlib shapely 项目地址: https://gitcode.com/GitHub_Trending/pr/prettymaps 你是否曾想制作一张精美的城市…

作者头像 李华
网站建设 2026/8/20 16:20:01

猫抓Cat-Catch网页资源嗅探扩展:3分钟上手视频音频下载全攻略

猫抓Cat-Catch网页资源嗅探扩展&#xff1a;3分钟上手视频音频下载全攻略 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 晚上十一点&#xff0c;剧…

作者头像 李华
网站建设 2026/8/20 16:18:00

基于springboot+vue影视推荐系统的设计与实现源码+文档+讲解视频

温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台…

作者头像 李华