ice规则引擎==启动流程和源码分析
创始人
2024-05-18 21:47:52
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

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...