diff --git a/README.md b/README.md index 4911ae945861ebb6e056493861cd7da4b9e94f8f..f4dc9683bd57cab904a3f84d047901662d37493d 100644 --- a/README.md +++ b/README.md @@ -15,18 +15,18 @@ REC(Rule Engine Component)规则引擎组件:提供统一的规则处理 - rec-admin-dal:数据库管理模块 - rec-admin-views:视图模块 - rec-admin-web:对前端接口模块 -- rec-common:基础模型、枚举模块等 +- rec-common:基础模型、枚举模块、DTO模型、规则聚合等 - rec-core:核心独立部署服务 - 加载所有域进行流程处理,提供Facade接口和MQ的方式进行数据处理 + - MQ方式需自行处理,本项目不提供支持(MQ接入非常简单,不再赘言) - rec-engine:规则引擎处理器 - rec-engine-script:规则引擎脚本处理器 - - rec-engine-sdk:规则引擎SDK + - rec-engine-sdk:规则引擎SDK、SpringBootStarter模块(此处可能不太优雅) - rec-engine-sdk-http:规则引擎SDK的SPI实现,加载数据,HTTP实现 - rec-engine-sdk-netty:规则引擎SDK的SPI实现,加载数据,Netty实现 - rec-socket:rec通信管理 - rec-socket-client:rec通信客户端 - rec-socket-server:rec通信服务端 -- rec-spring-boot-starter:SpringBoot启动器 @@ -253,6 +253,12 @@ REC(Rule Engine Component)规则引擎组件:提供统一的规则处理 - 前端开发如果提示有报错,请禁用:ESLint +## REC-SDK +- + +## REC 注册中心 +- + ## TODO - 新建模块实现服务的运行:加载所有域的信息进行处理 rec-support,定义SPI加载接口,SDK和rec-core的实现不一致,取值方式不一致 diff --git a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/WebApiRequest.java b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/WebApiRequest.java index ee286da00456b2a5e112216fef93102b2d2c782a..938cb02b907050d86ca4696c35531f4e00f3526c 100644 --- a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/WebApiRequest.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/WebApiRequest.java @@ -12,6 +12,13 @@ public class WebApiRequest implements Serializable { private Set domainCodes; + public WebApiRequest() { + } + + public WebApiRequest(Set domainCodes) { + this.domainCodes = domainCodes; + } + public Set getDomainCodes() { return domainCodes; } diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/RemoteException.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/RemoteException.java index bd78aef50cd3f5ad94b5f02c1abc0069e372089d..dec82fb1a946bebd65312088bfd49630a5b5d9ba 100644 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/RemoteException.java +++ b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/RemoteException.java @@ -1,12 +1,10 @@ package cn.icanci.rec.engine.script.client; -import java.io.IOException; - /** * @author icanci * @since 1.0 Created in 2022/11/14 22:15 */ -public class RemoteException extends IOException { +public class RemoteException extends RuntimeException { /** 序列化版本 */ private static final long serialVersionUID = -850230685842125442L; diff --git a/rec-engine/rec-engine-sdk-http/pom.xml b/rec-engine/rec-engine-sdk-http/pom.xml index adb0519e08b7ae5081da983262fd90f5eced9de4..c4425e87aba1ac1ef8c88b2804683137c19a1cff 100644 --- a/rec-engine/rec-engine-sdk-http/pom.xml +++ b/rec-engine/rec-engine-sdk-http/pom.xml @@ -22,5 +22,6 @@ rec-engine-sdk ${parent.version} + \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java index a4b72024ada32d58b46899218f76f15dfa1d9994..d1466622fe43dedcfe3db1c308c92ecc4bf5a0a0 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java @@ -1,8 +1,19 @@ package cn.icanci.rec.engine.sdk.http.spi; +import cn.icanci.rec.common.aggregation.WebApiRequest; +import cn.icanci.rec.common.aggregation.WebApiResponse; +import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.common.utils.PropertiesUtil; +import cn.icanci.rec.engine.script.client.Client; +import cn.icanci.rec.engine.script.client.http.HttpMethod; +import cn.icanci.rec.engine.script.client.http.OkHttpClientImpl; +import cn.icanci.rec.engine.script.client.serializer.SerializerEnum; +import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; + +import com.google.common.collect.Maps; /** * TODO 推拉模型,拉取配置时间,以秒为单位 PropertiesUtil 迁移到common测试 @@ -12,15 +23,67 @@ import java.util.Map; */ public abstract class AbstractLoadSPI { - private static final String PROPERTIES_NAME = "rec-http-spi-load.properties"; - - private static final String REQ_HTTP_PATH_PROP = "rec-http-request-url"; + private static final String PROPERTIES_NAME = "rec-http-spi-load.properties"; + private static final String REQ_HTTP_PATH_PROP = "rec-http-request-url"; + /** 服务请求请求路径 */ protected static final String REQ_HTTP_PATH; + /** 域请求路径 */ + protected static String LOAD_DOMAIN_PATH; + private static String LOAD_DOMAIN_PATH_SUFFIX = "/rec/webapi/loadDomains"; + /** 场景请求路径 */ + protected static String LOAD_SCENE_PATH; + private static String LOAD_SCENE_PATH_SUFFIX = "/rec/webapi/loadScenes"; + /** 元数据请求路径 */ + protected static String LOAD_METADATA_PATH; + private static String LOAD_METADATA_PATH_SUFFIX = "/rec/webapi/loadMetadatas"; + /** 基础数据请求路径 */ + protected static String LOAD_BASE_DATA_PATH; + private static String LOAD_BASE_DATA_PATH_SUFFIX = "/rec/webapi/loadBaseDatas"; + /** 数据源请求路径 */ + protected static String LOAD_DATA_SOURCE_PATH; + private static String LOAD_DATA_SOURCE_PATH_SUFFIX = "/rec/webapi/loadDataSources"; + /** 策略请求路径 */ + protected static String LOAD_STRATEGY_PATH; + private static String LOAD_STRATEGY_PATH_SUFFIX = "/rec/webapi/loadStrategies"; + + /** http实例 */ + protected static final Client CLIENT = OkHttpClientImpl.getInstance(); + /** DEFAULT_APPLICATION_JSON_VALUE */ + public static final String DEFAULT_APPLICATION_JSON_VALUE = "application/json"; + /** DEFAULT_TIMEOUT */ + private static final int DEFAULT_TIMEOUT = 3; static { // 加载数据 Map propertyMap = PropertiesUtil.getPropertyMap(Thread.currentThread().getContextClassLoader(), PROPERTIES_NAME); REQ_HTTP_PATH = propertyMap.get(REQ_HTTP_PATH_PROP); + + // 请求路径加载 + LOAD_DOMAIN_PATH = REQ_HTTP_PATH + LOAD_DOMAIN_PATH_SUFFIX; + LOAD_SCENE_PATH = REQ_HTTP_PATH + LOAD_SCENE_PATH_SUFFIX; + LOAD_METADATA_PATH = REQ_HTTP_PATH + LOAD_METADATA_PATH_SUFFIX; + LOAD_BASE_DATA_PATH = REQ_HTTP_PATH + LOAD_BASE_DATA_PATH_SUFFIX; + LOAD_DATA_SOURCE_PATH = REQ_HTTP_PATH + LOAD_DATA_SOURCE_PATH_SUFFIX; + LOAD_STRATEGY_PATH = REQ_HTTP_PATH + LOAD_STRATEGY_PATH_SUFFIX; + } + + /** + * 发送请求 + * + * @param clazz 请求返回类型 + * @param request 请求参数 + * @param reqPath 请求地址 + * @param 泛型 + * @return 返回执行结果 + */ + @SuppressWarnings("all") + public WebApiResponse call(Class clazz, String reqPath, HttpMethod httpMethod, WebApiRequest request) { + + Client.RpcRequest rpcRequest = new Client.RpcRequest(request, DEFAULT_APPLICATION_JSON_VALUE, Maps.newHashMap(), reqPath, httpMethod.name(), false, DEFAULT_TIMEOUT, + TimeUnit.SECONDS, 3, SerializerEnum.FASTJSON, SerializerEnum.FASTJSON); + + List ret = CLIENT.call(rpcRequest, WebApiResponse.class).getRet(); + return new WebApiResponse<>(FastJsonUtils.fromJSON2List(FastJsonUtils.toJSONString(ret), clazz)); } } diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java index db0bc12c576f739d83a7aa608353edbf83e2a205..c386bb22f85086fe202d140684dd16af27628f69 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java @@ -1,11 +1,15 @@ package cn.icanci.rec.engine.sdk.http.spi; +import cn.icanci.rec.common.aggregation.WebApiRequest; import cn.icanci.rec.common.aggregation.model.DomainDTO; +import cn.icanci.rec.engine.script.client.http.HttpMethod; import cn.icanci.rec.engine.sdk.spi.DomainSPI; import java.util.List; import java.util.Set; +import com.google.common.collect.Sets; + /** * @author icanci * @since 1.0 Created in 2022/11/15 21:02 @@ -14,16 +18,21 @@ public class HttpDomainSPI extends AbstractLoadSPI implements DomainSPI { @Override public DomainDTO loadOne(String domain) { - return null; + WebApiRequest request = new WebApiRequest(Sets.newHashSet(domain)); + return call(DomainDTO.class, LOAD_DOMAIN_PATH, HttpMethod.POST, request).getRet().iterator().next(); } @Override public List load(Set domains) { - return null; + WebApiRequest request = new WebApiRequest(domains); + return call(DomainDTO.class, LOAD_DOMAIN_PATH, HttpMethod.POST, request).getRet(); + } @Override public List load(String domain) { - return null; + WebApiRequest request = new WebApiRequest(Sets.newHashSet(domain)); + return call(DomainDTO.class, LOAD_DOMAIN_PATH, HttpMethod.POST, request).getRet(); + } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java index 77c37f0f6983afbe2f5386f40313bc83a58f2d22..7bad7af3c69a7fe489f2453f89bea76027c86788 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java @@ -3,16 +3,9 @@ package cn.icanci.rec.engine.sdk; import cn.icanci.rec.common.utils.FieldUtils; import cn.icanci.rec.engine.script.RecScriptEngine; import cn.icanci.rec.engine.script.RecScriptEngineManager; -import cn.icanci.rec.engine.sdk.actuator.RecRuleEngineActuator; -import cn.icanci.rec.engine.sdk.actuator.impl.RecRuleEngineActuatorImpl; import cn.icanci.rec.engine.sdk.exception.InjectionBeanException; import cn.icanci.rec.engine.sdk.extensions.RecExtensionLoader; import cn.icanci.rec.engine.sdk.extensions.SpringBean; -import cn.icanci.rec.engine.sdk.rule.EngineExecutor; -import cn.icanci.rec.engine.sdk.rule.EngineRepositoryLoader; -import cn.icanci.rec.engine.sdk.rule.impl.EngineRepositoryLoaderImpl; -import cn.icanci.rec.engine.sdk.rule.pool.ScriptExecutorPoolHolder; -import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; import cn.icanci.rec.engine.sdk.spi.*; import java.lang.reflect.Field; @@ -23,6 +16,7 @@ import org.springframework.boot.CommandLineRunner; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import com.google.common.collect.Sets; @@ -33,6 +27,7 @@ import com.google.common.collect.Sets; */ @Configuration +@ComponentScan({ "cn.icanci.rec.engine.sdk" }) //@ConditionalOnClass(RuleAggregationCluster.class) public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandLineRunner { /** @@ -45,26 +40,6 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL context = applicationContext; } - /** - * 执行引擎入口 - * - * @return 返回执行引擎入口 - */ - @Bean("recRuleEngineActuator") - public RecRuleEngineActuator recRuleEngineActuator() { - return new RecRuleEngineActuatorImpl(); - } - - /** - * 执行人 - * - * @return 返回执行人 - */ - @Bean("engineExecutor") - public EngineExecutor engineExecutor() { - return new EngineExecutor(); - } - /** * 执行引擎 * @@ -75,48 +50,8 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL return RecScriptEngineManager.getRecScriptEngine(); } - // /** - // * 执行引擎 暂不使用 - // * - // * @return 返回脚本执行引擎 - // */ - // @Bean("ruleAggregationCluster") - // public RuleAggregationCluster ruleAggregationCluster(AggregationRepositoryHolder aggregationRepositoryHolder, RecScriptEngine engine) { - // return new RuleAggregationClusterImpl(aggregationRepositoryHolder, engine); - // } - // - // /** - // * 执行引擎 暂不使用 - // * - // * @return 返回脚本执行引擎 - // */ - // @Bean("aggregationRepositoryHolder") - // public AggregationRepositoryHolder aggregationRepositoryHolder() { - // return new AggregationRepositoryHolder(); - // } - - /** - * 执行引擎 - * - * @return 返回脚本执行引擎 - */ - @Bean("engineRepositoryHolder") - public EngineRepositoryHolder engineRepositoryHolder() { - return new EngineRepositoryHolder(); - } - // ============================== SPI ============================== - /** - * 仓储加载执行引擎 - * - * @return 返回仓储加载执行引擎 - */ - @Bean("engineRepositoryLoader") - public EngineRepositoryLoader engineRepositoryLoader() { - return new EngineRepositoryLoaderImpl(); - } - /** * domainSPI * @@ -233,16 +168,6 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL } } - /** - * scriptExecutorPoolHolder - * - * @return scriptExecutorPoolHolder - */ - @Bean("scriptExecutorPoolHolder") - public ScriptExecutorPoolHolder scriptExecutorPoolHolder() { - return ScriptExecutorPoolHolder.getInstance(); - } - @Override public void run(String... args) throws Exception { // no op diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java index e025011a5c681e3f9293660963e7ebef40425d6e..96628858013c8baa29dfdcbad692a59a6d080869 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java @@ -7,10 +7,13 @@ import cn.icanci.rec.engine.sdk.rule.EngineExecutor; import javax.annotation.Resource; +import org.springframework.stereotype.Service; + /** * @author icanci * @since 1.0 Created in 2022/11/13 15:21 */ +@Service public class RecRuleEngineActuatorImpl implements RecRuleEngineActuator { @Resource diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java index f769892d90719ccfa7da6a9e43f3594e1c6689ff..304f987b2ba3a98ffb5e8d6e67ba068a58115d6d 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java @@ -27,11 +27,13 @@ import javax.script.SimpleBindings; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; /** * @author icanci * @since 1.0 Created in 2022/11/15 23:17 */ +@Service public final class EngineExecutor { @Resource diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/pool/ScriptExecutorPoolHolder.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/pool/ScriptExecutorPoolHolder.java index ed30f363dee22c5c6d4b520945c5080fa2ead9a2..fe1cae344058f0f5768390f0dfa2f641455a8c88 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/pool/ScriptExecutorPoolHolder.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/pool/ScriptExecutorPoolHolder.java @@ -7,12 +7,15 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import org.springframework.stereotype.Service; + /** * 脚本执行线程池处理器 * * @author icanci * @since 1.0 Created in 2022/11/16 21:06 */ +@Service public class ScriptExecutorPoolHolder { private static final ScriptExecutorPoolHolder instance = new ScriptExecutorPoolHolder(); diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepositoryHolder.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepositoryHolder.java index 31f265d943b9f73f8023c059f71be84ff33145a2..0122b49c2919476291df2d286aaa19bd3fbabf2d 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepositoryHolder.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepositoryHolder.java @@ -18,6 +18,7 @@ import javax.script.CompiledScript; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; import com.google.common.collect.Maps; @@ -25,6 +26,7 @@ import com.google.common.collect.Maps; * @author icanci * @since 1.0 Created in 2022/11/16 08:38 */ +@Service public class EngineRepositoryHolder { Logger logger = LoggerFactory.getLogger(EngineRepositoryHolder.class); @Resource