启动
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