Ice Client SDK 集成指南

详细了解如何在业务应用中集成 Ice Client SDK

概述

Ice Client 是规则执行引擎,需要集成到您的业务应用中。当前提供 Java SDK,支持两种接入方式:

方式依赖包适用场景
SpringBoot Starterice-spring-boot-starter-3x / ice-spring-boot-starter-2xSpringBoot 项目(推荐)
Core 包ice-core非 SpringBoot 项目

SpringBoot 项目集成

1. 添加依赖

根据您的 SpringBoot 版本选择对应的 Starter:

<dependency>
  <groupId>com.waitmoon.ice</groupId>
  <artifactId>ice-spring-boot-starter-3x</artifactId>
  <version>2.0.0</version>
</dependency>
<dependency>
  <groupId>com.waitmoon.ice</groupId>
  <artifactId>ice-spring-boot-starter-2x</artifactId>
  <version>2.0.0</version>
</dependency>

2. 配置 application.yml

ice:
  # 应用 ID(必填)- 与 Server 配置的 App 对应
  app: 1
  
  # 共享存储路径(必填)- 需与 Server 共享同一目录
  storage:
    path: ./ice-data
  
  # 叶子节点扫描包路径
  # 多个包用逗号分隔,不配置则扫描全部(较慢)
  scan: com.your.package
  
  # 版本轮询间隔(秒),默认 5 秒
  poll-interval: 5
  
  # 心跳更新间隔(秒),默认 10 秒
  heartbeat-interval: 10
  
  # 线程池配置(用于并发关系节点)
  pool:
    parallelism: -1  # 默认 -1,≤0 使用 ForkJoinPool 默认配置

3. 开发叶子节点

在配置的 scan 包路径下创建叶子节点类:

package com.your.package;

import com.ice.core.leaf.roam.BaseLeafRoamResult;
import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(callSuper = true)
public class AmountResult extends BaseLeafRoamResult {

    // 可在 Server 配置的字段
    private String uidKey;
    private double amount;

    @Override
    protected boolean doRoamResult(IceRoam roam) {
        Integer uid = roam.getMulti(uidKey);
        if (uid == null || amount <= 0) {
            return false;
        }
        // 业务逻辑
        return sendService.sendAmount(uid, amount);
    }
}

4. 执行规则

@Service
public class YourService {

    public void processRule(Long userId) {
        IcePack pack = new IcePack();
        pack.setIceId(1L);  // 规则 ID
        
        IceRoam roam = new IceRoam();
        roam.put("uid", userId);
        pack.setRoam(roam);
        
        // 同步执行
        Ice.syncProcess(pack);
        
        // 获取执行结果
        Object result = roam.get("RESULT_KEY");
    }
}

非 SpringBoot 项目集成

1. 添加依赖

<dependency>
  <groupId>com.waitmoon.ice</groupId>
  <artifactId>ice-core</artifactId>
  <version>2.0.0</version>
</dependency>

2. 初始化 Client

import com.ice.core.client.IceFileClient;
import java.util.Set;

public class IceClientInit {

    private static IceFileClient iceFileClient;

    public static void init() {
        // 方式一:简单构造
        iceFileClient = new IceFileClient(
            1,                    // app ID
            "./ice-data",         // 共享存储路径
            "com.your.package"    // 叶子节点扫描包
        );

        // 方式二:完整构造
        iceFileClient = new IceFileClient(
            1,                              // app ID
            "./ice-data",                   // 共享存储路径
            -1,                             // 并行度(≤0 使用默认)
            Set.of("com.your.package"),     // 扫描包集合
            5,                              // 轮询间隔(秒)
            10                              // 心跳间隔(秒)
        );

        // 启动客户端
        iceFileClient.start();
        
        // 等待启动完成
        iceFileClient.waitStarted();
    }

    public static void destroy() {
        if (iceFileClient != null) {
            iceFileClient.destroy();
        }
    }
}

3. 配置 Bean 工厂(可选)

如果叶子节点需要依赖注入:

import com.ice.core.utils.IceBeanUtils;

public class IceBeanFactoryInit {

    public static void init() {
        IceBeanUtils.setIceBeanFactory(new IceBeanFactory() {
            @Override
            public <T> T getBean(Class<T> clazz) {
                // 从您的 IoC 容器获取 Bean
                return YourContainer.getBean(clazz);
            }
        });
    }
}

4. 执行规则

public void processRule(Long userId) {
    IcePack pack = new IcePack();
    pack.setIceId(1L);
    
    IceRoam roam = new IceRoam();
    roam.put("uid", userId);
    pack.setRoam(roam);
    
    Ice.syncProcess(pack);
}

共享存储配置

关键配置

ice.storage.path(或构造函数中的 storagePath)必须与 Server 共享同一目录!

本地开发

# Server 和 Client 配置相同的本地路径
ice:
  storage:
    path: ./ice-data

Docker 环境

# docker-compose.yml
services:
  ice-server:
    volumes:
      - ./ice-data:/app/ice-data

  your-app:
    volumes:
      - ./ice-data:/app/ice-data  # 相同挂载

分布式环境

使用共享存储(NFS、云盘等):

services:
  ice-server:
    volumes:
      - /nfs/ice-data:/app/ice-data

  client-1:
    volumes:
      - /nfs/ice-data:/app/ice-data

  client-2:
    volumes:
      - /nfs/ice-data:/app/ice-data

配置参数说明

参数类型默认值说明
appint-应用 ID,必填
storage.pathstring-共享存储路径,必填
scanstring全部叶子节点扫描包,多个用逗号分隔
poll-intervalint5版本轮询间隔(秒)
heartbeat-intervalint10心跳上报间隔(秒)
pool.parallelismint-1线程池并行度,≤0 使用默认

下一步