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 -raStep 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:8121和http://节点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:
- Java:
sdks/java/ice-core,使用IceFileClient(app, storagePath, scanPackage)初始化; - Go:
sdks/go,使用ice.NewClient(app, storagePath)初始化; - Python:
sdks/python,使用ice.FileClient(app, storage_path)初始化。
以 Go 为例,接入集群的客户端只需要指向 NFS 挂载路径:
client, _ := ice.NewClient(1, "/mnt/ice-data") client.Start() defer client.Destroy()验证热更新的最快方法:在 Web UI 上修改规则树某个节点的阈值并发布,观察业务应用日志——默认 2 秒轮询间隔内即可看到新版本生效,全程无需重启应用。
六、高可用效果验证与常见问题排查
集群部署完成后,强烈建议做一次故障演练:
- 在 Web UI 发布一条规则,确认两台 Server 都同步成功;
docker stop ice-server-1,再访问:8122的 Web UI——规则依旧可编辑、可发布;- 重启业务应用,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),仅供参考