diff --git a/README.md b/README.md index 6a013a48..d138cfdb 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ flow-eda 项目是一种基于事件驱动的流式低代码编程应用程序,它的主要功能是采用可视化编程,以拖拽节点、连接组合节点的形式来完成流程绘制,达到低代码开发和实现业务编程的目的。 +此分支使用 Feign 替代了 Dubbo+Nacos 的技术方案,方便用户本地调试。使用此分支无需安装 Nacos,本地启动应用仅需要 Mysql 数据库和 RabbitMQ 服务即可,各服务之间采用 Feign 进行 http 调用。 + 欢迎各路大神共同参与开发,项目持续扩展完善中 #### 项目名称 diff --git a/docker-compose.yml b/docker-compose.yml index dfe70361..de8e8a9c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,25 +20,6 @@ services: - "15672:15672" volumes: - /root/app/rabbitmq/data:/var/lib/rabbitmq - nacos: - image: nacos/nacos-server - container_name: nacos - depends_on: - - mysql - ports: - - "8848:8848" - - "9848:9848" - - "9849:9849" - environment: - MODE: standalone - SPRING_DATASOURCE_PLATFORM: mysql - MYSQL_SERVICE_HOST: mysql - MYSQL_SERVICE_USER: root - MYSQL_SERVICE_PASSWORD: 123456 - MYSQL_SERVICE_DB_NAME: nacos_config - JVM_XMS: 256m - JVM_XMX: 256m - JVM_XMN: 256m nginx: image: nginx container_name: nginx diff --git a/docs/version/changelog.md b/docs/version/changelog.md index f9dd10af..33355bf6 100644 --- a/docs/version/changelog.md +++ b/docs/version/changelog.md @@ -26,6 +26,15 @@ - 2022-09-27:实现运行子流程功能 - 2022-09-26:新增子流程节点,可选择其他流程作为子流程 +### v3.0.0 + +- 2022-10-11:更新子流程相关项目文档 +- 2022-10-10:修复条件节点自定义参数被覆盖的问题 +- 2022-09-30:新增子输入/子输出节点,可连接父子流程之间的输入输出参数 +- 2022-09-28:关闭编辑器页面时弹出提醒确认框 +- 2022-09-27:实现运行子流程功能 +- 2022-09-26:新增子流程节点,可选择其他流程作为子流程 + ### v2.2.0 - 2022-08-24:修复切流程图换版本后重复连线问题 diff --git a/flow-eda-common/pom.xml b/flow-eda-common/pom.xml index d8e292d0..5b35612e 100644 --- a/flow-eda-common/pom.xml +++ b/flow-eda-common/pom.xml @@ -33,14 +33,9 @@ 4.5.1 - org.apache.dubbo - dubbo-registry-nacos - 3.0.7 - - - org.apache.dubbo - dubbo-spring-boot-starter - 3.0.7 + org.springframework.cloud + spring-cloud-starter-openfeign + 3.1.1 org.springframework.boot diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowDataService.java b/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowDataService.java deleted file mode 100644 index dd25f5f4..00000000 --- a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowDataService.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.flow.eda.common.dubbo.api; - -import com.flow.eda.common.dubbo.model.FlowData; - -import java.util.List; - -/** 流数据接口 */ -public interface FlowDataService { - /** - * 运行当前流程 - * - * @param data 流数据 - */ - void runFlowData(List data); - - /** - * 停止当前流程 - * - * @param flowId 流程id - */ - void stopFlowData(String flowId); - - /** - * 清理当前流程缓存数据(流程运行结束后调用) - * - * @param flowId 流程id - */ - void clearFlowData(String flowId); -} diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowInfoService.java b/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowInfoService.java deleted file mode 100644 index 3010d824..00000000 --- a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowInfoService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.flow.eda.common.dubbo.api; - -import com.flow.eda.common.dubbo.model.FlowData; - -import java.util.List; - -/** 获取流程信息接口 */ -public interface FlowInfoService { - /** - * 获取流程状态 - * - * @param flowId 流程id - * @return 返回流程当前状态 - */ - String getFlowStatus(String flowId); - - /** - * 获取流程节点数据 - * - * @param flowId 流程id - * @return 返回流程节点数据 - */ - List getFlowData(String flowId); -} diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/LogsService.java b/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/LogsService.java deleted file mode 100644 index 55804ee0..00000000 --- a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/LogsService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.flow.eda.common.dubbo.api; - -import com.flow.eda.common.dubbo.model.Logs; - -import java.util.List; - -/** 日志服务接口 */ -public interface LogsService { - - /** - * 获取日志信息列表 - * - * @param type 日志类型 - * @return 日志信息列表 - */ - List getLogList(Type type); - - /** - * 删除日志文件 - * - * @param path 日志文件路径 - */ - void deleteLogFiles(List path); - - /** 日志类型 */ - enum Type { - /** 操作日志 */ - OPERATION, - /** 运行日志 */ - RUNNING - } -} diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/FlowData.java b/flow-eda-common/src/main/java/com/flow/eda/common/model/FlowData.java similarity index 92% rename from flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/FlowData.java rename to flow-eda-common/src/main/java/com/flow/eda/common/model/FlowData.java index 10d079a5..77096d52 100644 --- a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/FlowData.java +++ b/flow-eda-common/src/main/java/com/flow/eda/common/model/FlowData.java @@ -1,4 +1,4 @@ -package com.flow.eda.common.dubbo.model; +package com.flow.eda.common.model; import lombok.Data; import org.bson.Document; diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/Logs.java b/flow-eda-common/src/main/java/com/flow/eda/common/model/Logs.java similarity index 96% rename from flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/Logs.java rename to flow-eda-common/src/main/java/com/flow/eda/common/model/Logs.java index 2870e691..083a09b4 100644 --- a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/model/Logs.java +++ b/flow-eda-common/src/main/java/com/flow/eda/common/model/Logs.java @@ -1,4 +1,4 @@ -package com.flow.eda.common.dubbo.model; +package com.flow.eda.common.model; import lombok.Getter; diff --git a/flow-eda-common/src/main/java/com/flow/eda/common/resource/FeignOauth2RequestInterceptor.java b/flow-eda-common/src/main/java/com/flow/eda/common/resource/FeignOauth2RequestInterceptor.java new file mode 100644 index 00000000..43a1085b --- /dev/null +++ b/flow-eda-common/src/main/java/com/flow/eda/common/resource/FeignOauth2RequestInterceptor.java @@ -0,0 +1,71 @@ +package com.flow.eda.common.resource; + +import feign.RequestInterceptor; +import feign.RequestTemplate; +import org.bson.Document; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; +import org.springframework.web.client.RestTemplate; + +import java.util.Base64; + +/** 自定义Feign的请求拦截器,用于微服务之间调用时的oauth2认证 */ +@Configuration +public class FeignOauth2RequestInterceptor implements RequestInterceptor { + private static final String TOKEN_URL = + "http://localhost:8086/oauth/token?grant_type=client_credentials"; + private static final String AUTH = "Authorization"; + private static final String BEARER = "Bearer "; + + @Value("${security.oauth2.client-id}") + private String clientId; + + @Value("${security.oauth2.client-secret}") + private String clientSecret; + + @Bean + @ConditionalOnMissingClass + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + @Override + public void apply(RequestTemplate requestTemplate) { + // 获取请求中的token,设置到header中 + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null + && authentication.getDetails() instanceof OAuth2AuthenticationDetails) { + OAuth2AuthenticationDetails details = + (OAuth2AuthenticationDetails) authentication.getDetails(); + requestTemplate.header(AUTH, BEARER + details.getTokenValue()); + } else { + // 若请求中无token,则通过客户端模式向oauth2申请一个token,设置到header中 + String basic = + Base64.getEncoder() + .encodeToString( + String.format("%s:%s", clientId, clientSecret).getBytes()); + HttpHeaders headers = new HttpHeaders(); + headers.set(AUTH, "Basic " + basic); + // 发送请求 + Document response = + restTemplate() + .exchange( + TOKEN_URL, + HttpMethod.POST, + new HttpEntity<>(headers), + Document.class) + .getBody(); + if (response != null) { + requestTemplate.header(AUTH, BEARER + response.getString("access_token")); + } + } + } +} diff --git a/flow-eda-logger/src/main/java/com/flow/eda/logger/FlowEdaLoggerApplication.java b/flow-eda-logger/src/main/java/com/flow/eda/logger/FlowEdaLoggerApplication.java index b723fdd4..77f79b17 100644 --- a/flow-eda-logger/src/main/java/com/flow/eda/logger/FlowEdaLoggerApplication.java +++ b/flow-eda-logger/src/main/java/com/flow/eda/logger/FlowEdaLoggerApplication.java @@ -1,18 +1,18 @@ package com.flow.eda.logger; -import com.flow.eda.logger.logs.LogsServiceImpl; -import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan; -import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.socket.server.standard.ServerEndpointExporter; -@EnableDubbo -@DubboComponentScan(basePackageClasses = LogsServiceImpl.class) @SpringBootApplication -@ComponentScan(basePackages = {"com.flow.eda.logger", "com.flow.eda.common.resource"}) +@ComponentScan( + basePackages = { + "com.flow.eda.logger", + "com.flow.eda.common.config", + "com.flow.eda.common.resource" + }) public class FlowEdaLoggerApplication { public static void main(String[] args) { diff --git a/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsServiceImpl.java b/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsController.java similarity index 69% rename from flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsServiceImpl.java rename to flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsController.java index e86326d0..aa8895c5 100644 --- a/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsServiceImpl.java +++ b/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsController.java @@ -1,32 +1,43 @@ package com.flow.eda.logger.logs; -import com.flow.eda.common.dubbo.api.LogsService; -import com.flow.eda.common.dubbo.model.Logs; +import com.flow.eda.common.http.Result; +import com.flow.eda.common.model.Logs; import lombok.extern.slf4j.Slf4j; -import org.apache.dubbo.config.annotation.DubboService; -import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.*; import java.io.File; import java.util.ArrayList; import java.util.List; +/** 日志服务接口 */ @Slf4j -@Service -@DubboService(interfaceClass = LogsService.class) -public class LogsServiceImpl implements LogsService { +@RestController +@RequestMapping("/api/v1/feign") +public class LogsController { private static final String ROOT = System.getProperty("user.dir"); - @Override - public List getLogList(Type type) { + /** + * 获取日志信息列表 + * + * @param type 日志类型 + * @return 日志信息列表 + */ + @GetMapping("/logs") + public Result> getLogList(@RequestParam Type type) { if (Type.OPERATION == type) { - return getOperationLogs(); + return Result.of(getOperationLogs()); } else { - return getRunningLogs(); + return Result.of(getRunningLogs()); } } - @Override - public void deleteLogFiles(List path) { + /** + * 删除日志文件 + * + * @param path 日志文件路径 + */ + @DeleteMapping("/logs") + public void deleteLogs(@RequestBody List path) { path.forEach(this::deleteLogFile); } @@ -81,4 +92,12 @@ private void deleteLogFile(String path) { } catch (Exception ignored) { } } + + /** 日志类型 */ + enum Type { + /** 操作日志 */ + OPERATION, + /** 运行日志 */ + RUNNING + } } diff --git a/flow-eda-logger/src/main/resources/application.yaml b/flow-eda-logger/src/main/resources/application.yaml index b9f1e974..7b2dc14c 100644 --- a/flow-eda-logger/src/main/resources/application.yaml +++ b/flow-eda-logger/src/main/resources/application.yaml @@ -8,29 +8,9 @@ spring: port: 5672 username: guest password: guest -dubbo: - application: - name: flow-eda-logger - qos-enable: false - qos-accept-foreign-ip: false - registry: - protocol: dubbo - address: nacos://localhost:8848 - username: nacos - password: nacos - protocol: - name: dubbo - port: 20883 - consumer: - check: false - timeout: 5000 - retries: 0 security: oauth2: resource-id: flow-eda client-id: 1df7b0c1-aac0-148a14c7cba8 client-secret: zcUaT32GlwIjz4yBJjYZIIMvzf check-token-url: http://localhost:8086/oauth/check_token -logging: - level: - com.alibaba.nacos.common.remote.client: warn diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/FlowEdaRunnerApplication.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/FlowEdaRunnerApplication.java index 7adb0284..a52f5739 100644 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/FlowEdaRunnerApplication.java +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/FlowEdaRunnerApplication.java @@ -2,22 +2,25 @@ import com.flow.eda.runner.node.http.HttpDispatcherServlet; import com.flow.eda.runner.utils.ApplicationContextUtil; -import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan; -import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.servlet.DispatcherServlet; -@EnableDubbo -@DubboComponentScan(basePackages = "com.flow.eda.runner.data") +@EnableFeignClients @SpringBootApplication(exclude = MongoAutoConfiguration.class) -@ComponentScan(basePackages = {"com.flow.eda.runner", "com.flow.eda.common.resource"}) +@ComponentScan( + basePackages = { + "com.flow.eda.runner", + "com.flow.eda.common.config", + "com.flow.eda.common.resource" + }) public class FlowEdaRunnerApplication { public static void main(String[] args) { diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataController.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataController.java new file mode 100644 index 00000000..a469d820 --- /dev/null +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataController.java @@ -0,0 +1,45 @@ +package com.flow.eda.runner.data; + +import com.flow.eda.common.model.FlowData; +import com.flow.eda.runner.runtime.FlowDataRuntime; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** 流程数据接口 */ +@RestController +@RequestMapping("/api/v1/feign") +public class FlowDataController { + @Autowired private FlowDataRuntime flowDataRuntime; + + /** + * 运行当前流程 + * + * @param data 流数据 + */ + @PostMapping("/flow/run") + public void runFlowData(@RequestBody List data) { + flowDataRuntime.runFlowData(data); + } + + /** + * 停止当前流程 + * + * @param flowId 流程id + */ + @PostMapping("/flow/stop") + public void stopFlowData(@RequestParam String flowId) { + flowDataRuntime.stopFlowData(flowId); + } + + /** + * 清理当前流程缓存数据(流程运行结束后调用) + * + * @param flowId 流程id + */ + @PostMapping("/flow/clear") + public void clearFlowData(@RequestParam String flowId) { + flowDataRuntime.clearFlowData(flowId); + } +} diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataServiceImpl.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataServiceImpl.java deleted file mode 100644 index a7abec60..00000000 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataServiceImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.flow.eda.runner.data; - -import com.flow.eda.common.dubbo.api.FlowDataService; -import com.flow.eda.common.dubbo.model.FlowData; -import com.flow.eda.runner.runtime.FlowDataRuntime; -import org.apache.dubbo.config.annotation.DubboService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@DubboService(interfaceClass = FlowDataService.class) -public class FlowDataServiceImpl implements FlowDataService { - @Autowired private FlowDataRuntime flowDataRuntime; - - @Override - public void runFlowData(List data) { - flowDataRuntime.runFlowData(data); - } - - @Override - public void stopFlowData(String flowId) { - flowDataRuntime.stopFlowData(flowId); - } - - @Override - public void clearFlowData(String flowId) { - flowDataRuntime.clearFlowData(flowId); - } -} diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/AbstractNode.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/AbstractNode.java index 7c42a067..da003db5 100644 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/AbstractNode.java +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/AbstractNode.java @@ -5,16 +5,17 @@ import java.util.Optional; +import static com.flow.eda.runner.utils.PlaceholderUtil.OBJECT_MAPPER; + /** 节点抽象类 */ public abstract class AbstractNode implements Node { - /** 输入参数,由上个节点传递至此 */ - private final Document input; - private final String flowId; private final String nodeId; /** 节点自定义参数,可传递至下个节点 */ private Document payload; + /** 输入参数,由上个节点传递至此 */ + private Document input; /** 节点当前的运行状态 */ private Status status = Status.RUNNING; @@ -27,8 +28,14 @@ public AbstractNode(Document params) { NodeVerify.notNull(params, "params"); this.flowId = params.getString("flowId"); this.nodeId = params.getString("nodeId"); - this.payload = params.get("payload", Document.class); - this.input = params.get("input", Document.class); + Object p = params.get("payload"); + if (p != null) { + this.payload = OBJECT_MAPPER.convertValue(p, Document.class); + } + Object i = params.get("input"); + if (i != null) { + this.input = OBJECT_MAPPER.convertValue(i, Document.class); + } params.remove("flowId"); params.remove("nodeId"); // 解析${}占位符 diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/NodeTypeEnum.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/NodeTypeEnum.java index 682fd4f3..b0cd12d8 100644 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/NodeTypeEnum.java +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/NodeTypeEnum.java @@ -1,7 +1,7 @@ package com.flow.eda.runner.node; -import com.flow.eda.common.dubbo.model.FlowData; import com.flow.eda.common.exception.InternalException; +import com.flow.eda.common.model.FlowData; import com.flow.eda.runner.node.condition.ConditionNode; import com.flow.eda.runner.node.delay.DelayNode; import com.flow.eda.runner.node.email.EmailNode; diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/subflow/SubFlowRuntime.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/subflow/SubFlowRuntime.java index c8df2d14..2762a9a4 100644 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/subflow/SubFlowRuntime.java +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/subflow/SubFlowRuntime.java @@ -1,7 +1,7 @@ package com.flow.eda.runner.node.subflow; -import com.flow.eda.common.dubbo.model.FlowData; import com.flow.eda.common.exception.FlowException; +import com.flow.eda.common.model.FlowData; import com.flow.eda.runner.node.NodeTypeEnum; import com.flow.eda.runner.runtime.FlowDataRuntime; import com.flow.eda.runner.status.FlowStatusService; diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowDataRuntime.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowDataRuntime.java index 5a36e009..213b2c16 100644 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowDataRuntime.java +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowDataRuntime.java @@ -1,6 +1,6 @@ package com.flow.eda.runner.runtime; -import com.flow.eda.common.dubbo.model.FlowData; +import com.flow.eda.common.model.FlowData; import com.flow.eda.common.utils.CollectionUtil; import com.flow.eda.runner.node.Node; import com.flow.eda.runner.node.NodeTypeEnum; diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowExecutor.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowExecutor.java index 3bf32822..da74047e 100644 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowExecutor.java +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowExecutor.java @@ -1,7 +1,7 @@ package com.flow.eda.runner.runtime; -import com.flow.eda.common.dubbo.model.FlowData; import com.flow.eda.common.exception.FlowException; +import com.flow.eda.common.model.FlowData; import com.flow.eda.runner.node.Node; import com.flow.eda.runner.node.NodeTypeEnum; import com.flow.eda.runner.status.FlowNodeWebsocket; diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusClient.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusClient.java new file mode 100644 index 00000000..bef3fdf0 --- /dev/null +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusClient.java @@ -0,0 +1,31 @@ +package com.flow.eda.runner.status; + +import com.flow.eda.common.http.Result; +import com.flow.eda.common.model.FlowData; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** 获取流程状态信息接口 */ +@FeignClient(name = "flowStatus", url = "localhost:8081") +public interface FlowStatusClient { + /** + * 获取流程状态 + * + * @param flowId 流程id + * @return 返回流程当前状态 + */ + @GetMapping("/api/v1/feign/flow/status") + Result getFlowStatus(@RequestParam String flowId); + + /** + * 获取流程节点数据 + * + * @param flowId 流程id + * @return 返回流程节点数据 + */ + @GetMapping("/api/v1/feign/flow/data") + Result> getFlowData(@RequestParam String flowId); +} diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusService.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusService.java index 302a679f..4bea3517 100644 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusService.java +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusService.java @@ -1,17 +1,12 @@ package com.flow.eda.runner.status; -import com.flow.eda.common.dubbo.api.FlowInfoService; -import com.flow.eda.common.dubbo.model.FlowData; +import com.flow.eda.common.model.FlowData; import com.flow.eda.runner.node.Node; -import org.apache.dubbo.common.utils.ConcurrentHashSet; -import org.apache.dubbo.config.annotation.DubboReference; import org.bson.Document; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; @@ -26,10 +21,10 @@ public class FlowStatusService { /** 流程运行结束后会发起通知 */ private final Map> noticeMap = new ConcurrentHashMap<>(); - @DubboReference private FlowInfoService flowInfoService; + @Autowired private FlowStatusClient flowStatusClient; public void startRun(String flowId, List starts, List timer) { - this.runningMap.put(flowId, new ConcurrentHashSet<>()); + this.runningMap.put(flowId, new HashSet<>()); forEach(starts, node -> this.runningMap.get(flowId).add(node.getId())); forEach(timer, node -> this.runningMap.get(flowId).add(node.getId())); } @@ -38,7 +33,7 @@ public void startRun(String flowId, List starts, List timer) public String getFlowStatus(String flowId, Document message) { String nodeId = message.getString("nodeId"); if (nodeId == null) { - return flowInfoService.getFlowStatus(flowId); + return flowStatusClient.getFlowStatus(flowId).getResult(); } String status = message.getString("status"); if (Node.Status.FAILED.name().equals(status)) { @@ -58,7 +53,7 @@ public String getFlowStatus(String flowId, Document message) { /** 判断当前流程状态是否已完成 */ public boolean isFinished(String flowId) { if (!runningMap.containsKey(flowId)) { - String status = flowInfoService.getFlowStatus(flowId); + String status = flowStatusClient.getFlowStatus(flowId).getResult(); return Node.Status.FINISHED.name().equals(status); } return runningMap.get(flowId).isEmpty(); @@ -75,9 +70,7 @@ public List getRunningNodes(String flowId) { /** 添加运行中的节点 */ public void addRunningNode(String flowId, String nodeId) { - if (runningMap.get(flowId) == null) { - runningMap.put(flowId, new ConcurrentHashSet<>()); - } + runningMap.computeIfAbsent(flowId, k -> new HashSet<>()); runningMap.get(flowId).add(nodeId); } @@ -91,7 +84,7 @@ public void removeRunningNode(String flowId, String nodeId) { /** 获取流程节点数据 */ public List getFlowData(String flowId) { - return flowInfoService.getFlowData(flowId); + return flowStatusClient.getFlowData(flowId).getResult(); } /** 清理缓存数据 */ diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/utils/PlaceholderUtil.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/utils/PlaceholderUtil.java index 18188f67..21cf1ee5 100644 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/utils/PlaceholderUtil.java +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/utils/PlaceholderUtil.java @@ -1,5 +1,6 @@ package com.flow.eda.runner.utils; +import com.fasterxml.jackson.databind.ObjectMapper; import com.flow.eda.common.utils.CollectionUtil; import org.bson.Document; import org.springframework.util.StringUtils; @@ -14,6 +15,7 @@ /** 解析占位符${}的工具类 */ public class PlaceholderUtil { + public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static final Pattern REGEX = Pattern.compile("\\$\\{([^}]*)}"); /** diff --git a/flow-eda-runner/src/main/resources/application.yaml b/flow-eda-runner/src/main/resources/application.yaml index a1250001..831e8775 100644 --- a/flow-eda-runner/src/main/resources/application.yaml +++ b/flow-eda-runner/src/main/resources/application.yaml @@ -10,29 +10,9 @@ spring: password: guest log_exchange: flow.log log_routing_key: flow.running.log -dubbo: - application: - name: flow-eda-runner - qos-enable: false - qos-accept-foreign-ip: false - registry: - protocol: dubbo - address: nacos://localhost:8848 - username: nacos - password: nacos - protocol: - name: dubbo - port: 20882 - consumer: - check: false - timeout: 5000 - retries: 0 security: oauth2: resource-id: flow-eda client-id: 1df7b0c1-aac0-148a14c7cba8 client-secret: zcUaT32GlwIjz4yBJjYZIIMvzf check-token-url: http://localhost:8086/oauth/check_token -logging: - level: - com.alibaba.nacos.common.remote.client: warn diff --git a/flow-eda-vue/package.json b/flow-eda-vue/package.json index 74931366..f8e2e4db 100644 --- a/flow-eda-vue/package.json +++ b/flow-eda-vue/package.json @@ -11,23 +11,22 @@ "axios": "0.24.0", "click-outside-vue3": "^4.0.1", "codemirror-editor-vue3": "^2.0.6", - "element-plus": "^2.2.26", - "element-theme-chalk": "^2.15.12", + "element-plus": "1.0.2-beta.52", "jsplumb": "^2.15.6", "less": "4.1.2", "less-loader": "10.2.0", "moment": "^2.29.1", "panzoom": "^9.4.2", "screenfull": "^6.0.1", - "vue": "^3.2.45", + "vue": "^3.1.2", "vue-json-viewer": "^3.0.4", "vue-router": "^4.0.10", "vuex": "^4.0.2" }, "devDependencies": { - "@vitejs/plugin-vue": "^4.0.0", - "@vitejs/plugin-vue-jsx": "^3.0.0", - "vite": "^4.0.3" + "@vitejs/plugin-vue": "^1.2.3", + "@vue/compiler-sfc": "^3.1.2", + "vite": "2.3.7" }, "browserslist": [ "> 1%", diff --git a/flow-eda-vue/src/components/Header.vue b/flow-eda-vue/src/components/Header.vue index fe37fd54..fa819352 100644 --- a/flow-eda-vue/src/components/Header.vue +++ b/flow-eda-vue/src/components/Header.vue @@ -1,8 +1,8 @@