ice
Committed to solving flexible and complex hard-coded problems
🎯 Visual Rule Orchestration
Innovative tree-based orchestration with web visual configuration interface. Ensures business decoupling and code reuse while providing maximum flexibility for rule configuration.
⚡ Lightweight & High Performance
Pure in-memory computation with millisecond response time. Near-zero performance overhead, perfectly supporting high-concurrency business scenarios.
🐳 Zero-Dependency Architecture
No MySQL, ZooKeeper, or other external dependencies required. Docker one-click deployment in 5 seconds. JSON file storage with version control support.
🚀 Get Started in 3 Steps
Step 1: Deploy Ice Server
docker run -d --name ice-server -p 8121:8121 \
-v ./ice-data:/app/ice-data \
waitmoon/ice-server:latest
# Download from: https://waitmoon.com/downloads/
# Extract and start
tar -xzvf ice-server-*.tar.gz && cd ice-server
sh ice.sh start
Visit http://localhost:8121 to access the visual configuration interface.
Step 2: Integrate Ice Client SDK
Add dependency to your business application:
<dependency>
<groupId>com.waitmoon.ice</groupId>
<artifactId>ice-spring-boot-starter-3x</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.waitmoon.ice</groupId>
<artifactId>ice-spring-boot-starter-2x</artifactId>
<version>2.0.1</version>
</dependency>
go get github.com/zjn-zjn/ice/sdks/go
pip install ice-rules
<dependency>
<groupId>com.waitmoon.ice</groupId>
<artifactId>ice-core</artifactId>
<version>2.0.1</version>
</dependency>
Configure shared storage path (same as Server):
ice:
app: 1
storage:
path: ./ice-data
client, _ := ice.NewClient(1, "./ice-data")
client.Start()
client = ice.FileClient(app=1, storage_path="./ice-data")
client.start()
💡 Key Point: Client must share the same storage directory (
ice-data) with Server
Step 3: Configure Rules and Execute
- Configure business rules in Server's visual interface
- Publish rules, Client auto hot-reloads
- Call rule execution in your business code
IcePack pack = new IcePack();
pack.setIceId(1L); // Rule ID
pack.setRoam(new IceRoam().put("uid", 12345));
Ice.syncProcess(pack);
pack := ice.NewPack().SetIceId(1)
pack.Roam.Put("uid", 12345)
ice.SyncProcess(context.Background(), pack)
pack = ice.Pack(ice_id=1)
pack.roam.put("uid", 12345)
ice.sync_process(pack)
👉 View Complete Getting Started Guide | Go SDK Guide | Python SDK Guide
Use Cases
| Scenario | Description |
|---|---|
| 🎁 Marketing Campaigns | Flexible configuration for coupons, discounts, group buying rules |
| 💰 Risk Control | Credit risk assessment, anti-fraud, real-time decision engine |
| 🔐 Access Control | Dynamic permission management, role configuration |
| 📊 Process Orchestration | Ticket routing, approval workflows, state machine management |
Why Choose Ice?
| Feature | Ice | Traditional Rule Engines |
|---|---|---|
| Learning Curve | 5 minutes to start | Need to learn DSL |
| Deployment | Docker one-click | Database/middleware required |
| Configuration | Web visual UI | Text/code |
| Performance | In-memory, milliseconds | Compilation overhead |
| Rule Changes | Hot-reload, seconds | Restart/redeploy needed |










