From 7a2887ac03614482132968837de2afebefc8b9a9 Mon Sep 17 00:00:00 2001 From: zhanghua <964552300@qq.com> Date: Sun, 4 Dec 2022 01:41:15 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=94=AF=E6=8C=81apollo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liteflow-rule-apollo/pom.xml | 45 ++++++++++ .../parser/apollo/ApolloXmlELParser.java | 65 ++++++++++++++ .../apollo/exception/ApolloException.java | 21 +++++ .../parser/apollo/util/ApolloParseHelper.java | 87 +++++++++++++++++++ .../apollo/vo/ApolloParserConfigVO.java | 34 ++++++++ .../spi/apollo/ApolloParserClassNameSpi.java | 17 ++++ ...hub.liteflow.parser.spi.ParserClassNameSpi | 1 + .../pom.xml | 38 ++++++++ pom.xml | 9 ++ 9 files changed, 317 insertions(+) create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/pom.xml create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/ApolloXmlELParser.java create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/exception/ApolloException.java create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/util/ApolloParseHelper.java create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/vo/ApolloParserConfigVO.java create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/spi/apollo/ApolloParserClassNameSpi.java create mode 100644 liteflow-rule-plugin/liteflow-rule-apollo/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi create mode 100644 liteflow-testcase-el/liteflow-testcase-el-apollo-springboot/pom.xml diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/pom.xml b/liteflow-rule-plugin/liteflow-rule-apollo/pom.xml new file mode 100644 index 000000000..f69b5075f --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-apollo/pom.xml @@ -0,0 +1,45 @@ + + + + liteflow-rule-plugin + com.yomahub + ${revision} + ../pom.xml + + 4.0.0 + + liteflow-rule-apollo + + + 8 + 8 + + + + + com.yomahub + liteflow-core + ${revision} + true + provided + + + + com.alibaba.nacos + nacos-client + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + com.ctrip.framework.apollo + apollo-client + + + + + \ No newline at end of file diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/ApolloXmlELParser.java b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/ApolloXmlELParser.java new file mode 100644 index 000000000..9401af7c9 --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/ApolloXmlELParser.java @@ -0,0 +1,65 @@ +package com.yomahub.liteflow.parser.apollo; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.parser.apollo.exception.ApolloException; +import com.yomahub.liteflow.parser.apollo.util.ApolloParseHelper; +import com.yomahub.liteflow.parser.apollo.vo.ApolloParserConfigVO; +import com.yomahub.liteflow.parser.el.ClassXmlFlowELParser; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; +import com.yomahub.liteflow.util.JsonUtil; + +import java.util.Objects; +import java.util.function.Consumer; + +/** + * @Description: + * @Author: zhanghua + * @Date: 2022/12/3 13:38 + */ +public class ApolloXmlELParser extends ClassXmlFlowELParser { + + private final ApolloParseHelper apolloParseHelper; + + public ApolloXmlELParser() { + LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); + try { + ApolloParserConfigVO apolloParserConfigVO = null; + if (MapUtil.isNotEmpty((liteflowConfig.getRuleSourceExtDataMap()))) { + apolloParserConfigVO = BeanUtil.toBean(liteflowConfig.getRuleSourceExtDataMap(), ApolloParserConfigVO.class, CopyOptions.create()); + } else if (StrUtil.isNotBlank(liteflowConfig.getRuleSourceExtData())) { + apolloParserConfigVO = JsonUtil.parseObject(liteflowConfig.getRuleSourceExtData(), ApolloParserConfigVO.class); + } + if (Objects.isNull(apolloParserConfigVO)) { + throw new ApolloException("ruleSourceExtData or map is empty"); + } + + apolloParseHelper = new ApolloParseHelper(apolloParserConfigVO); + } catch (Exception e) { + throw new ApolloException(e.getMessage()); + } + } + + @Override + public String parseCustom() { + Consumer parseConsumer = t -> { + try { + parse(t); + } catch (Exception e) { + throw new ApolloException(e.getMessage()); + } + }; + try { + String content = apolloParseHelper.getContent(); + apolloParseHelper.checkContent(content); + apolloParseHelper.listen(parseConsumer); + return content; + + } catch (Exception e) { + throw new ApolloException(e.getMessage()); + } + } +} diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/exception/ApolloException.java b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/exception/ApolloException.java new file mode 100644 index 000000000..f8aa53ec9 --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/exception/ApolloException.java @@ -0,0 +1,21 @@ +package com.yomahub.liteflow.parser.apollo.exception; + +/** + * @Description: + * @Author: zhanghua + * @Date: 2022/12/3 13:45 + */ +public class ApolloException extends RuntimeException { + + private String message; + + public ApolloException(String message) { + super(); + this.message = message; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/util/ApolloParseHelper.java b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/util/ApolloParseHelper.java new file mode 100644 index 000000000..a275e80ef --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/util/ApolloParseHelper.java @@ -0,0 +1,87 @@ +package com.yomahub.liteflow.parser.apollo.util; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.nacos.api.PropertyKeyConst; +import com.alibaba.nacos.client.config.NacosConfigService; +import com.ctrip.framework.apollo.Config; +import com.ctrip.framework.apollo.ConfigFile; +import com.ctrip.framework.apollo.ConfigFileChangeListener; +import com.ctrip.framework.apollo.ConfigService; +import com.ctrip.framework.apollo.core.dto.ApolloConfig; +import com.ctrip.framework.apollo.core.enums.ConfigFileFormat; +import com.ctrip.framework.apollo.model.ConfigFileChangeEvent; +import com.yomahub.liteflow.exception.ParseException; +import com.yomahub.liteflow.parser.apollo.exception.ApolloException; +import com.yomahub.liteflow.parser.apollo.vo.ApolloParserConfigVO; +import com.yomahub.liteflow.spi.holder.ContextAwareHolder; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Objects; +import java.util.Properties; +import java.util.function.Consumer; + +/** + * @Description: + * @Author: zhanghua + * @Date: 2022/12/3 13:47 + */ +public class ApolloParseHelper { + + + private static final Logger LOG = LoggerFactory.getLogger(ApolloParseHelper.class); + + private final ApolloParserConfigVO apolloParserConfigVO; + + private ConfigFile liteflowConfigFile; + + public ApolloParseHelper(ApolloParserConfigVO apolloParserConfigVO) { + this.apolloParserConfigVO = apolloParserConfigVO; + try { + liteflowConfigFile = ConfigService.getConfigFile(apolloParserConfigVO.getNamespace(), ConfigFileFormat.XML); + } catch (Exception e) { + LOG.error("[ApolloParseHelper] liteflowConfigFile get init error, apolloParserConfigVO:{}", apolloParserConfigVO); + throw new ApolloException(e.getMessage()); + } + } + + public String getContent() { + try { + ConfigFile configFile = ConfigService.getConfigFile(apolloParserConfigVO.getNamespace(), ConfigFileFormat.XML); + String content; + if (Objects.isNull(configFile) || StrUtil.isBlank(content = configFile.getContent())) { + throw new ApolloException(String.format("not find config file, namespace:%s", apolloParserConfigVO.getNamespace())); + } + return content; + } catch (Exception e) { + throw new ApolloException(e.getMessage()); + } + } + + /** + * 检查 content 是否合法 + */ + public void checkContent(String content) { + if (StrUtil.isBlank(content)) { + String error = StrUtil.format("the node[{}] value is empty", apolloParserConfigVO.toString()); + throw new ParseException(error); + } + } + + /** + * 监听 apollo 数据变化 + */ + public void listen(Consumer parseConsumer) { + try { + liteflowConfigFile.addChangeListener(configFileChangeEvent -> { + String newContext = configFileChangeEvent.getNewValue(); + parseConsumer.accept(newContext); + }); + } catch (Exception e) { + throw new ApolloException(e.getMessage()); + } + } + + +} diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/vo/ApolloParserConfigVO.java b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/vo/ApolloParserConfigVO.java new file mode 100644 index 000000000..ed79f75e2 --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/apollo/vo/ApolloParserConfigVO.java @@ -0,0 +1,34 @@ +package com.yomahub.liteflow.parser.apollo.vo; + +/** + * @Description: + * @Author: zhanghua + * @Date: 2022/12/3 13:45 + */ +public class ApolloParserConfigVO { + + private String namespace; + + + public ApolloParserConfigVO() { + } + + public ApolloParserConfigVO(String namespace) { + this.namespace = namespace; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + @Override + public String toString() { + return "ApolloParserConfigVO{" + + "namespace='" + namespace + '\'' + + '}'; + } +} diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/spi/apollo/ApolloParserClassNameSpi.java b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/spi/apollo/ApolloParserClassNameSpi.java new file mode 100644 index 000000000..d83a7eca1 --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/java/com/yomahub/liteflow/parser/spi/apollo/ApolloParserClassNameSpi.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.parser.spi.apollo; + +import com.yomahub.liteflow.parser.apollo.ApolloXmlELParser; +import com.yomahub.liteflow.parser.spi.ParserClassNameSpi; + +/** + * @Description: + * @Author: zhanghua + * @Date: 2022/12/3 13:40 + */ +public class ApolloParserClassNameSpi implements ParserClassNameSpi { + + @Override + public String getSpiClassName() { + return ApolloXmlELParser.class.getName(); + } +} diff --git a/liteflow-rule-plugin/liteflow-rule-apollo/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi new file mode 100644 index 000000000..b5c5af6bd --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-apollo/src/main/resources/META-INF/services/com.yomahub.liteflow.parser.spi.ParserClassNameSpi @@ -0,0 +1 @@ +com.yomahub.liteflow.parser.spi.apollo.ApolloParserClassNameSpi \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-apollo-springboot/pom.xml b/liteflow-testcase-el/liteflow-testcase-el-apollo-springboot/pom.xml new file mode 100644 index 000000000..c7cc3c43d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-apollo-springboot/pom.xml @@ -0,0 +1,38 @@ + + + + liteflow + com.yomahub + 2.9.4 + + 4.0.0 + + liteflow-testcase-el-apollo-springboot + + + 8 + 8 + + + + + com.yomahub + liteflow-spring-boot-starter + ${revision} + + + + org.springframework.boot + spring-boot-starter-test + + + + com.yomahub + liteflow-rule-apollo + ${revision} + test + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9ece2bb5f..36d2115cc 100644 --- a/pom.xml +++ b/pom.xml @@ -68,6 +68,7 @@ 31.1-jre 4.5.13 1.9.4 + 1.7.0 @@ -259,6 +260,12 @@ provided true + + com.ctrip.framework.apollo + apollo-client + ${apollo.version} + + @@ -370,6 +377,8 @@ liteflow-spring-boot-starter liteflow-spring liteflow-testcase-el + liteflow-rule-apollo + liteflow-testcase-el-apollo-springboot