规则引擎 ice
liteflow 更适应我们的项目使用了它
drools 感觉复杂度高些
项目介绍
官网地址:http://waitmoon.com/zh
视频地址:https://www.bilibili.com/video/BV1hg411A7jx
业务中是否写了大量的 if-else?是否受够了这些 if-else 还要经常变动? 业务中是否做了大量抽象,发现新的业务场景还是用不上? 是否各种调研规则引擎,发现不是太重就是接入或维护太麻烦,最后发现还是不如硬编码? 接下来给大家介绍一款全新的开源规则引擎——ice,以一个简单的例子,从最底层的编排思想,阐述 ice 与其他规则引擎的不同;讲述 ice 是如何使用全新的设计思想,契合解耦和复用的属性,还你最大的编排自由度。
服务安装
http://waitmoon.com/zh/guide/getting-started.html
创建数据库(MySQL)
https://gitee.com/waitmoon/ice/blob/1.2.0/ice-server/src/main/resources/sql/ice.sql
CREATE DATABASE IF NOT EXISTS ice CHARACTER SET utf8mb4;
USE ice;
-- ----------------------------
-- Table structure for ice_app
-- ----------------------------
CREATE TABLE IF NOT EXISTS `ice_app` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(200) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'application name',
`info` VARCHAR(500) COLLATE utf8mb4_bin DEFAULT '',
`status` TINYINT(1) NOT NULL DEFAULT '1',
`create_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ----------------------------
-- Table structure for ice_base
-- ----------------------------
CREATE TABLE IF NOT EXISTS `ice_base` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(200) COLLATE utf8mb4_bin DEFAULT NULL,
`app` INT(11) NOT NULL COMMENT 'remote application id',
`scenes` VARCHAR(1000) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'scenes(mutli scene split with ,)',
`status` TINYINT(11) NOT NULL DEFAULT '1' COMMENT '1 online 0 offline',
`conf_id` BIGINT(20) DEFAULT NULL,
`time_type` TINYINT(11) DEFAULT '1' COMMENT 'see TimeTypeEnum',
`start` DATETIME(3) DEFAULT NULL,
`end` DATETIME(3) DEFAULT NULL,
`debug` TINYINT(4) NOT NULL DEFAULT '1',
`priority` BIGINT(20) DEFAULT '1',
`create_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_at` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`),
KEY `update_index` (`update_at`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ----------------------------
-- Table structure for ice_conf
-- ----------------------------
CREATE TABLE IF NOT EXISTS `ice_conf` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`app` INT(11) NOT NULL COMMENT 'remote application id',
`name` VARCHAR(50) COLLATE utf8mb4_bin DEFAULT NULL,
`son_ids` VARCHAR(1000) COLLATE utf8mb4_bin DEFAULT NULL,
`type` TINYINT(4) NOT NULL DEFAULT '6' COMMENT 'see NodeTypeEnum',
`status` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '1 online 0 offline',
`inverse` TINYINT(4) NOT NULL DEFAULT '0' COMMENT 'make true->false false->true',
`conf_name` VARCHAR(1000) COLLATE utf8mb4_bin DEFAULT '' COMMENT 'leaf node class name',
`conf_field` VARCHAR(5000) COLLATE utf8mb4_bin DEFAULT '' COMMENT 'leaf node json config',
`forward_id` BIGINT(20) DEFAULT NULL,
`time_type` TINYINT(11) NOT NULL DEFAULT '1' COMMENT 'see TimeTypeEnum',
`start` DATETIME(3) DEFAULT NULL,
`end` DATETIME(3) DEFAULT NULL,
`debug` TINYINT(4) NOT NULL DEFAULT '1',
`error_state` TINYINT(4) DEFAULT NULL COMMENT 'NULL/3-SHUTDOWN, 0-CONTINUE_FALSE, 1-CONTINUE_TRUE, 2-CONTINUE_NONE',
`create_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_at` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`),
KEY `update_index` (`update_at`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ----------------------------
-- Table structure for ice_conf_update
-- ----------------------------
CREATE TABLE IF NOT EXISTS `ice_conf_update` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`app` INT(11) NOT NULL COMMENT 'remote application id',
`ice_id` BIGINT(20) NOT NULL,
`conf_id` BIGINT(20) NOT NULL,
`name` VARCHAR(50) COLLATE utf8mb4_bin DEFAULT NULL,
`son_ids` VARCHAR(1000) COLLATE utf8mb4_bin DEFAULT NULL,
`type` TINYINT(4) NOT NULL DEFAULT '6' COMMENT 'see NodeTypeEnum',
`status` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '1 online 0 offline',
`inverse` TINYINT(4) NOT NULL DEFAULT '0' COMMENT 'make true->false false->true',
`conf_name` VARCHAR(1000) COLLATE utf8mb4_bin DEFAULT '' COMMENT 'leaf node class name',
`conf_field` VARCHAR(5000) COLLATE utf8mb4_bin DEFAULT '' COMMENT 'leaf node json config',
`forward_id` BIGINT(20) DEFAULT NULL,
`time_type` TINYINT(11) NOT NULL DEFAULT '1' COMMENT 'see TimeTypeEnum',
`start` DATETIME(3) DEFAULT NULL,
`end` DATETIME(3) DEFAULT NULL,
`debug` TINYINT(4) NOT NULL DEFAULT '1',
`error_state` TINYINT(4) DEFAULT NULL COMMENT 'NULL/3-SHUTDOWN, 0-CONTINUE_FALSE, 1-CONTINUE_TRUE, 2-CONTINUE_NONE',
`create_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_at` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`),
KEY `update_index` (`update_at`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ----------------------------
-- Table structure for ice_push_history
-- ----------------------------
CREATE TABLE IF NOT EXISTS `ice_push_history` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`app` INT(11) NOT NULL,
`ice_id` BIGINT(20) DEFAULT NULL,
`reason` VARCHAR(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`push_data` LONGTEXT COLLATE utf8mb4_unicode_ci,
`operator` VARCHAR(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`create_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ----------------------------
-- v1.2.0
-- table ice_conf add column error_state if not exist
-- ----------------------------
SET @preparedStatement = (SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE
table_name = 'ice_conf'
AND table_schema = DATABASE()
AND column_name = "error_state"
) > 0,
"SELECT 1",
"ALTER TABLE ice_conf ADD error_state tinyint(4) DEFAULT NULL COMMENT 'NULL/3-SHUTDOWN, 0-CONTINUE_FALSE, 1-CONTINUE_TRUE, 2-CONTINUE_NONE';"
));
PREPARE iceConfAlterIfNotExists FROM @preparedStatement;
EXECUTE iceConfAlterIfNotExists;
DEALLOCATE PREPARE iceConfAlterIfNotExists;
-- ----------------------------
-- v1.2.0
-- table ice_conf_update add column error_state if not exist
-- ----------------------------
SET @preparedStatement = (SELECT IF(
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE
table_name = 'ice_conf_update'
AND table_schema = DATABASE()
AND column_name = "error_state"
) > 0,
"SELECT 1",
"ALTER TABLE ice_conf_update ADD error_state tinyint(4) DEFAULT NULL COMMENT 'NULL/3-SHUTDOWN, 0-CONTINUE_FALSE, 1-CONTINUE_TRUE, 2-CONTINUE_NONE';"
));
PREPARE iceConfUpdateAlterIfNotExists FROM @preparedStatement;
EXECUTE iceConfUpdateAlterIfNotExists;
DEALLOCATE PREPARE iceConfUpdateAlterIfNotExists;
下载安装
http://waitmoon.com/downloads/
[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir ice
# 创建目录
[root@localhost opt]# cd ice
# 下载安装包
[root@localhost ice]# wget http://waitmoon.com/downloads/ice-server-1.2.0.tar.gz
# 解压
[root@localhost ice]# tar -xzvf ice-server-*.tar.gz
ice-server-1.2.0/
ice-server-1.2.0/ice-server.jar
ice-server-1.2.0/logs/
ice-server-1.2.0/logs/ice-server.log
ice-server-1.2.0/application-prod.yml
ice-server-1.2.0/ice.sh
# 编辑配置文件,修改数据库配置
[root@localhost ice]# vi ice-server-1.2.0/application-prod.yml
修改配置(application-prod.yml)
server:
port: 8121 #端口
spring:
datasource: #数据库配置
url: jdbc:mysql://127.0.0.1:3306/ice?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&useSSL=false
username: username
password: password
initialization-mode: always
ice:
port: 18121 #与客户端通信端口
# ha: #高可用配置,当前默认支持zookeeper
# address: localhost:2181,localhost:2182,localhost:2183
pool: #线程池配置(用于更新client)
core-size: 4
max-size: 4
keep-alive-seconds: 60
queue-capacity: 60000
服务(启动、停止、重启)
启动 sh ice.sh start
停止 sh ice.sh stop
重启 sh ice.sh restart
打开后台
Client接入(Spring Boot)
POM
<dependency>
<groupId>com.waitmoon.ice</groupId>
<artifactId>ice-client-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!--高可用模式-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.2.1</version>
</dependency>
示例
添加配置

application.yml
server:
port: 8082
ice: #ice client配置
app: 1 #与后台配置app对应
# server: zookeeper:localhost:2181,localhost:2182,localhost:2183 #server高可用配置
server: 172.16.3.64:18121 #server 地址(serverHost:serverPort) 服务中配置的端口
scan: com.ice.test #用于扫描叶子节点,多个包用','分隔(默认扫描全部,扫描全部会拖慢应用启动速度)
pool: #线程池配置(用于并发关系节点)
parallelism: -1 #默认-1,≤0表示采用默认配置

新增 ICE
当 recharge 发生的时候触发




文档:http://waitmoon.com/zh/guide/#举例
视频:https://www.bilibili.com/video/BV1Q34y1R7KF
规则引擎 ice的更多相关文章
- 开源规则引擎——ice:致力于解决灵活繁复的硬编码问题
背景介绍 业务中是否写了大量的 if-else?是否受够了这些 if-else 还要经常变动? 业务中是否做了大量抽象,发现新的业务场景还是用不上? 是否各种调研规则引擎,发现不是太重就是接入或维护太 ...
- Scala化规则引擎
1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
- Asp.net 面向接口可扩展框架之业务规则引擎扩展组件
随着面向接口可扩展框架的继续开发,有些功能开发出现了"瓶颈",有太多的东西要写死才好做.但写死的代码扩展性是非常的不好,迷茫中寻找出入... 进而想到我以前开发的好几个项目,都已有 ...
- Atitit.工作流 与 规则引擎
Atitit.工作流 与 规则引擎 1.1. 应用来说,通常分为三部分:界面.业务逻辑和存储1 1.2. 自定义操作系列1 1.3. 自定义按钮系列2 1.1. 应用来说,通常分为三部分:界面.业务逻 ...
- 【java规则引擎】之Drools之Rete算法
一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...
- 规则引擎集成接口(七)规则引擎调用Java类
规则引擎调用Java类 通过myEclipse编写一个简单工程,其中方法是两数相加等到结果,既结果1=输入值1+输入值2.实现规则调用外部接口的方法有三种. 1:接口实例:在myEclipse中制作一 ...
- node(规则引擎)
本文主要记录node的下的一个开源规则引擎nools,给出简单的实例,github地址为: https://github.com/C2FO/nools 定义规则引擎(test.nools) defin ...
- 基于NXBRE规则引擎实现的柔性折扣策略
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规则做出业务决策.应用背景 ...
- BizTalk动手实验(九)业务规则引擎使用
1 课程简介 通过本课程熟悉业务规则引擎(BRE)的使用(本环境为Windows 2008 32位操作系统环境 + Visual Studio 2010 + BizTalk 210) 2 准备工作 1 ...
- 使用规则引擎Drools计算圆周率PI
实际上是使用规则引擎能够更新工作内存区重新匹配规则实现迭代功能. 使用了策略模式实现. <规则引擎与RETE算法介绍> PPT : http://files.cnblogs.com/lov ...
随机推荐
- day60:Linux压缩与打包&用户管理&用户提权sudo&grep,sed,awk,sort,uniq
目录 1.文件管理-压缩与打包 2.用户管理 用户怎么查 如何创建用户 创建的用户信息都存储在哪? 用户存储密码的文件 如何为用户设定密码? 3.用户组 4.用户提权相关 5.Extra:额外补充 文 ...
- Springboot+Mysql 图书管理系统【源码+sql】
java项目 学生图书管理系统 (源码+数据库文件)技术框架:java+springboot+mysql后端框架: Spring Boot.Spring MVC.MyBatis Plus前端界面: T ...
- create-react-app 构建的项目使用代理 proxy 解决跨域请求
1. 正常运行 npm run eject 暴露项目的配置文件 (前三个步骤可省略,最好的是按照第四步操作) 在config/webpackDevServer.config文件下,大概在104行 1 ...
- [Pytorch框架] 1.2、Pytorch环境搭建
文章目录 1.2 Pytorch环境搭建 1.2.1 安装Pytorch 1.2.2 配置 Jupyter Notebook 1.2.3 测试 1.2.4 问题解决 问题1:启动python提示编码错 ...
- JavaFx 生成二维码工具类封装
原文地址: JavaFx 生成二维码工具类封装 - Stars-One的杂货小窝 之前星之音乐下载器有需要生成二维码功能,当时用的是一个开源库来实现的,但是没过多久,发现那个库依赖太多,有个http- ...
- 【C#】图片上传并根据长宽大小进行正方形、长方形及等比缩放。
#region 正方型裁剪并缩放 /// <summary> /// 正方型裁剪 /// 以图片中心为轴心,截取正方型,然后等比缩放 /// 用于头像处理 /// </summary ...
- S5PV210 | 裸机汇编LED流水灯实验
S5PV210 | 裸机汇编LED流水灯实验 目录 S5PV210 | 裸机汇编LED流水灯实验 开发板: 1.原理图 2.Datasheet相关 3.代码 3-1.代码实现(流水灯,仅作演示) 3- ...
- 2023-01-09:以下go语言代码输出什么?A:+Inf; B:zero; C:something else; D:doesn‘t compile。 package main import (
2023-01-09:以下go语言代码输出什么?A:+Inf: B:zero: C:something else: D:doesn't compile. package main import ( & ...
- 2022-06-01:给定一个数组arr,可能有正、有负、有0,无序。 只能挑选两个数字,想尽量让两个数字加起来的绝对值尽量小。 返回可能的最小的值。
2022-06-01:给定一个数组arr,可能有正.有负.有0,无序. 只能挑选两个数字,想尽量让两个数字加起来的绝对值尽量小. 返回可能的最小的值. 答案2022-06-01: 排序,双指针. 代码 ...
- 2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K并且是长度最大的。返回其长度。
2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K并且是长度最大的.返回其长度. 福大大 答案2021-03-23: 双指 ...
