ice规则引擎==启动流程和源码分析
创始人
2024-05-18 16:51:22
0

启动

git clone代码

创建数据库ice,执行ice server里的sql,修改ice server的配置文件中的数据库信息

 启动ice server 和ice test

访问ice server     localhost:8121

新增一个app,默认给了个id为1,这个1可以看到在ice test的配置文件中指定了。

进入app ,新增一条校验链(实际是一串规则),指定它使用的 场景为recharge

点击查看详情

点击1-NODE,添加子节点

选择relation,AND

然后再点击AND添加子节点

 编写内容

{"score":100,"key":"cost"}

然后再次点击AND再添加一个子节点,confName写AmountResult

编写内容

{"value":888,"key":"uuid"}

点击发布

到ice test的ScoreFlow  和AmountResult 打个断点

发两个请求,scene为之前在页面上创建的recharge,cost=10000和cost=10,一个大于100,一个小于100,可以发现大于100的多了个返回的字段说明触发了这条规则

{"scene": "recharge","roam": {"cost": 10000,"uuid":123}
}

 

 

============================

所以可以发现,AND后面跟着的两个子节点,第一个是用来判断的规则,第二个是结果,如果第一个满足了,就会触发第二个。 怎么看满不满足,条件的阈值是在页面上JSON设置的,阈值怎么用是在ScoreFlow代码里设置的。 所以如果要自己添加功能,需要先在ice test中新建flow和result,然后再去页面上使用新的flow和result新建节点。

================================================

在修改根目录下的pom.xml文件,将远程仓库,证书,签名等都给注释掉,然后mvn install,这样就能将所有模块打包到本地仓库中。然后用IDEA分别打开ice-test和ice-server,启动,测试访问,成功。

源码分析

可以发现是基于netty的,分为server端和client端,那么client端启动的时候肯定会做些事情,所以看client端端代码。

clien端

icetest引入了ice-client-spring-boot-starter依赖,starter里引入了ice-client-spring-boot-autoconfigure,发现熟悉的spring.factories,同时ice-client-spring-boot-autoconfigure引入了ice-client依赖,ice-client又引入了ice-core依赖。ice-core中引入了netty和ice-common。

 

 

spring.factories引入了IceClientAutoConfiguration,这里面就只有个去扫描com.ice.client包底下的所有bean

 

@Configuration
@ComponentScan("com.ice.client")
public class IceClientAutoConfiguration {}

因为ice-server也引用了ice-core,所以clien端的初始化相关的功能是在ice-client中。

IceClientProperties读取了ice-test的配置文件中的配置项,

IceNioClientInit:

com.ice.client.config.IceNioClientInit#afterPropertiesSet

com.ice.core.client.IceNioClient#start创建与server的连接,并将连接注册到server端。

bootstrap.connect(host, port).sync();

server端接受到来自client端的连接请求并处理,

com.ice.server.nio.IceNioServerHandler#channelRead0

连接创建后会自动调用到client端的channelActive将该client端可以使用的叶子节点类路径发送到server端,server端页面上建规则的时候会使用

com.ice.core.client.IceNioClientHandler#channelActive 将该client端可以使用的叶子节点类路径发送到server端,请求到达server端

com.ice.server.nio.IceNioClientManager#register(int, io.netty.channel.Channel, java.lang.String, java.util.List)  server端将这个client拥有的场景和对应的规则发往client端

client收到来自server端的响应

com.ice.core.client.IceNioClientHandler#channelRead0 收到这个client拥有的场景和对应的规则

com.ice.core.client.IceNioClient#initDataReady

com.ice.core.client.IceUpdate#update

com.ice.core.cache.IceConfCache#insertOrUpdate 将这个client拥有的场景和对应的规则放入一个map   confMap中当做缓存

com.ice.core.cache.IceHandlerCache#insertOrUpdate根据刚才的confMap,生成这个client拥有的场景的handler,并将handler放入一个sceneHandlersMap当做缓存

com.ice.core.cache.IceHandlerCache#onlineOrUpdateHandler

==================================

其他的就一样了,当更新规则等,server端也会调channelRead0告知client端刷新缓存

com.ice.core.client.IceNioClientHandler#channelRead0

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...