ice规则引擎==启动流程和源码分析

news/2024/11/16 7:45:45/

启动

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<com.ice.common.model.LeafNodeInfo>)  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


http://www.ppmy.cn/news/19697.html

相关文章

gdb使用

gdb是一款UNIX及UNIX-like下的调试工具 gdb可用于调试用gcc编译的可执行文件&#xff0c;用gdb调试时gcc编译需要使用参数-g 本文是对于gdb在Linux下使用的基本命令的总结gdb调试视频演示&#xff0c;gdb调试基础指令&#xff0c;gdb调试其他命令&#xff0c;gdb常见错误说明 目…

JUC面试(十一)——LockSupport

可重入锁 可重入锁又名递归锁 是指在同一个线程在外层方法获取锁的时候&#xff0c;再进入该线程的内层方法会自动获取锁(前提&#xff0c;锁对象得是同一个对象)&#xff0c;不会因为之前已经获取过的锁还没释放而阻塞。 Java中ReentrantLock和synchronized都是可重入锁&am…

【23】C语言 | 初阶结构体

目录 1、结构的基础知识 2、结构成员的类型 3、结构体初始化 4、结构体的访问 5、结构体传参 1、结构的基础知识 结构是这些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量 数组&#xff1a;一组相同类型的元素的集合 结构体&#xff1a;也是…

统计学习方法 学习笔记(5)决策树

决策树5.1.决策树模型与学习5.2.特征选择5.3.决策树的生成5.4.决策树的剪枝5.5.CART算法决策树基本概述&#xff1a; 算法类别&#xff1a;一种基本的分类和回归方法&#xff1b;基本结构&#xff1a;呈现树形结构&#xff0c;在分类问题中表示基于特征对实例进行分类的过程。…

从源码解析代理模式

大纲代理模式&#xff08;结构型设计模式&#xff09;通过代理类去访问实现类中的方法&#xff0c;使用场景比如&#xff1a;已有接口和实现类的情况下&#xff0c;想要在已实现的方法基础上扩展更多的功能的场景。代理模式里的主要类&#xff1a;接口实现类&#xff0c;需实现…

c++函数(2)

这里写自定义目录标题默认参数函数重载递归函数变量周期默认参数 可为形参指定默认值&#xff0c;如果在函数调用时&#xff0c;没有指定与形参对应的实参时&#xff0c;就自动使用默认值。 默认参数可简化复杂函数的调用。 默认参数在函数名第一次出现在程序中指定&#xff0…

kubernetes资源对象应用类(二)

kubernetes资源对象应用类&#xff08;二&#xff09; Service 的 ClusterIP 地址 既然每个 Pod 都会被分配一个单独的 IP 地址&#xff0c;而且每个 Pod 都提供了一个独立的 Endpoint&#xff08;Pod IP containerPort&#xff09;以被客户端访问&#xff0c;那么现在多个 P…

蓝桥杯刷题014——求阶乘(二分法)

求阶乘 蓝桥杯2022省赛题目 问题描述 满足 N ! 的末尾恰好有 K 个 0 的最小的 N 是多少? 如果这样的 N 不存在输出 −1 。 输入格式 一个整数 K 。 输出格式 一个整数代表答案。 样例输入 2样例输出 10评测用例规模与约定 对于 30% 的数据, 1≤K≤10^6. 对于 100% 的数据, 1…