liteflow的方便在于其可以适配多种配置文件,依然可以轻松的解析。可以看到作者提供了json解析、xml解析、yml解析。那么我们来看看这三种解析的方式是如何实现的。
一、liteflow解析资源文件
可以看到在执行处理的过程中,会执行初始化动作,这个初始化动作,在实现初始化bean的时候就会执行。除此之外调用执行处理方法的时候,依然会执行判断是否执行一次。
代码语言:javascript复制for (String path : sourceRulePathList) {
// 查找对应的解析器
parser = FlowParserProvider.lookup(path);
parserNameSet.add(parser.getClass().getName());
// 替换掉前缀标识(如:xml:/json:),保留剩下的完整地址
path = ReUtil.replaceAll(path, PREFIX_FORMAT_CONFIG_REGEX, "");
rulePathList.add(path);
// 支持多类型的配置文件,分别解析
if (BooleanUtil.isTrue(liteflowConfig.isSupportMultipleType())) {
// 解析文件
parser.parseMain(ListUtil.toList(path));
}
}
}
可以看到这里判断了一个配置信息,是否支持多种类型,如果支持,则进行解析操作。也即解析的工作主要靠parser.parseMain(ListUtil.toList(path))这个方法路由实现。可以看到它又可以分为:
代码语言:javascript复制JsonFlowELParser
ClassXmlFlowELParser
ClassYmlFlowELParser
除此之外还有三个带Local为前缀的,以上面的类似。
二、三种解析方式
这里以json格式为例进行说明。
JsonFlowELParser可以看到主要解析两个信息:node和chain的信息,并进行build构建。也即
parseNodeJson =>LiteFlowNodeBuilder创建node
代码语言:javascript复制 LiteFlowNodeBuilder.createNode()
.setId(id)
.setName(name)
.setClazz(clazz)
.setType(nodeTypeEnum)
.setScript(script)
.setFile(file)
.setLanguage(language)
.build();
parseChainJson=>FlowBus.addChain(chainName) 构建chain =>从而进一步构建parseOneChain => LiteFlowChainELBuilder创建el表达式
代码语言:javascript复制public static void parseOneChainEl(JsonNode chainNode) {
// 构建chainBuilder
String chainId = Optional.ofNullable(chainNode.get(ID)).orElse(chainNode.get(NAME)).textValue();
String el = chainNode.get(VALUE).textValue();
LiteFlowChainELBuilder.createChain()
.setChainId(chainId)
.setEL(el)
.build();
}
完成解析工作。前面我们知道这个设置el其实做了很多工作,方便后续的chain获取,依据后续的nodeComponent操作。
可以看到这三个解析器中,parseOneChain这个动作其实是一样的。只是前面的两步有一些不一样。不管是解析xml还是解析yml,两者最终的构建都是殊途同归,进行节点构建LiteFlowNodeBuilder创建node。然后parseOneChain => LiteFlowChainELBuilder创建el表达式。
三、解析相关配置存储文件的插件
以此同时,可以看到后续的版本增加了很多存储配置文件的插件。也即liteflow-rule-plugin这个模块。那这个模块究竟是做什么的呢?从模块中,我们可以看到存储规则的如下方式有:
代码语言:javascript复制apollo 对应解析的文件类ApolloXmlELParser
etcd 对应的解析文件类 EtcdXmlELParser
nacos 对应的解析文件类 NacosXmlELParser
redis 对应的解析文件类 RedisXmlELParser
sql 对应的解析文件类 SQLXmlELParser
zk 对应的解析文件类ZkXmlELParser
有了上面的解析类,可以解析我们想要的解析文件。其最终还是解析node和chain。从而实现对相关配置方便管理和读取。从而进行后续业务逻辑编排操作。
四、解析存储配置文件之外
除此之外,liteflow还提供了非常人性化的热部署功能。热部署的功能借助脚本组件来实现。脚本组件的方便在于其能够实现热部署刷新功能。这个方便上线的方便灵活修改配置信息。这个功能在liteflow-script-plugin模块中,通过引入相关依赖,可以实现在生产上热部署的实现业务逻辑编排功能的正常执行。
参考:https://gitee.com/dromara/liteFlow https://liteflow.cc/