From 1ce81831da220853c01eefdd788ea30d71fb7b2d Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 14:26:31 +0800 Subject: [PATCH 01/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0pom=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=EF=BC=8C=E5=8E=BB=E9=99=A4dubbo+nacos=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0openfeign?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flow-eda-common/pom.xml | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/flow-eda-common/pom.xml b/flow-eda-common/pom.xml index df5a25eb..a4061aac 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 From 6c89ddc689aa61d679d3acaa4517bc515737b4d0 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 14:28:15 +0800 Subject: [PATCH 02/28] =?UTF-8?q?=E5=8E=BB=E9=99=A4dubbo=E5=92=8Cnacos?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flow/eda/logger/FlowEdaLoggerApplication.java | 5 ----- flow-eda-logger/src/main/resources/application.yaml | 13 ------------- 2 files changed, 18 deletions(-) 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 80684f96..7419af46 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,15 +1,10 @@ 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.web.socket.server.standard.ServerEndpointExporter; -@EnableDubbo -@DubboComponentScan(basePackageClasses = LogsServiceImpl.class) @SpringBootApplication public class FlowEdaLoggerApplication { diff --git a/flow-eda-logger/src/main/resources/application.yaml b/flow-eda-logger/src/main/resources/application.yaml index 83c60be8..a604aad6 100644 --- a/flow-eda-logger/src/main/resources/application.yaml +++ b/flow-eda-logger/src/main/resources/application.yaml @@ -8,19 +8,6 @@ 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 logging: level: com.alibaba.nacos.common.remote.client: warn From 14d49d12831c95e3da124abc5e5b8658b5ba4d8b Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 14:29:08 +0800 Subject: [PATCH 03/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...gsServiceImpl.java => LogsController.java} | 44 ++++++++++++++----- 1 file changed, 32 insertions(+), 12 deletions(-) rename flow-eda-logger/src/main/java/com/flow/eda/logger/logs/{LogsServiceImpl.java => LogsController.java} (70%) 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 70% 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..08bb7eef 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,33 +1,45 @@ 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 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 Result deleteLogs(@RequestBody List path) { path.forEach(this::deleteLogFile); + return Result.ok(); } /** 获取操作日志信息列表 */ @@ -81,4 +93,12 @@ private void deleteLogFile(String path) { } catch (Exception ignored) { } } + + /** 日志类型 */ + enum Type { + /** 操作日志 */ + OPERATION, + /** 运行日志 */ + RUNNING + } } From 0b44412b718d4a990ccef7f9a3c9862dee617ec3 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 14:29:25 +0800 Subject: [PATCH 04/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fe44fd45..57e0beb0 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# flow-eda ### 介绍 一个由Java语言开发的基于事件驱动的流式低代码编程应用程序,您可以在编辑器中采用拖拽的形式来实现业务编程工作,一键运行和停止,让开发工作变得更简单高效。 欢迎各路大神共同参与开发,项目持续开发中 **项目名称介绍:** - flow: 流式编程 - eda: 事件驱动应用程序(Event Driven Application) **在线DEMO** 作者本人自费租了云服务器,搭建了在线DEMO,开源不易,请珍惜服务器资源,感谢! Vue3版本[在线demo](http://36.138.228.74:90/) React版本[在线demo](http://36.138.228.74:90/react/) **项目展示:** ![image](./flow-eda-common/gif/flows1.gif) ![image](./flow-eda-common/gif/flows2.gif) ![image](./flow-eda-common/gif/logs.gif) **Vue3版本界面:** ![image](./flow-eda-common/img/vue3.png) **React版本界面:** ![image](./flow-eda-common/img/react.png) **编辑器界面:** ![image](./flow-eda-common/img/editor.png) 期待您的参与,项目持续开发中... ### 项目模块说明 1. flow-eda-common 公共工具模块 2. flow-eda-runner 流运行引擎模块 3. flow-eda-web 后台管理web模块 4. flow-eda-logger 日志管理模块 5. flow-eda-vue 前端vue模块 6. flow-eda-react 前端react模块 ### 后端技术栈 - 部署:docker,版本20.10.14 - 部署:docker-compose,版本2.5.0 - 数据库:mysql,版本8.0.28 - 微服务框架:springboot,版本2.6.4 - 持久化框架:mybatis,版本2.2.2 - 代码插件:lombok,版本1.18.22 - 服务注册中心:nacos,版本2.0.4 - 服务远程调用:dubbo,版本3.0.7 - 数据推送:websocket,版本2.6.4 - 消息队列:rabbitmq,版本3.9.15 ### 支持的功能节点 **基础** - [x] start节点,是触发流程执行的起始节点 - [x] timer节点,定时器,定时触发流程,支持周期触发和cron表达式触发,可指定执行次数,可输出指定格式的时间戳 - [x] output节点,输出节点,用于输出上游节点传递下来的输出参数 - [x] delay节点,延时器,用于延迟指定时间后再执行其下游节点 **解析** - [x] json解析器,用于解析上游节点的输出参数,获取用户需要的参数信息 - [ ] xml解析器,用于解析xml格式的数据,获取指定xml标签内的内容 - [ ] html解析器,用于解析html网页内容,获取指定内容数据 **网络** - [x] HTTP请求节点,可发送HTTP请求,支持herder、token等请求头,支持url带参数,支持由上游节点输入的变量 - [ ] HTTP响应节点,可自定义http服务,指定http参数和响应内容,可动态响应数据 - [ ] websocket客户端,可用于连接websocket服务,发送和接收数据 - [ ] websocket服务端,创建一个websocket服务,可响应客户端的连接和数据的接收/发送 - [ ] TCP请求节点,可发送TCP请求,并接收响应数据 - [ ] TCP响应节点,创建一个TCP服务,可用于响应TCP客户端的请求 - [ ] MQTT请求节点,可向指定topic中发送MQTT请求 - [ ] MQTT响应节点,创建一个MQTT服务,可用于响应客户端的请求 **数据库** - [ ] mysql节点,可连接mysql数据库,执行自定义sql语句,输出查询结果 - [ ] mysql结果解析器,用于解析mysql数据库的查询结果,输出指定内容 - [ ] mongodb节点,可连接mongodb数据库,执行自定义查询语句,输出查询结果 持续开发中... ### 主要功能点 - 支持绘制任意的流程图,没有繁琐的约束,仅针对不同节点的参数做了校验 - 各节点地位平等,不分头尾,可任意连接绘制,连接数量无上限,仅对节点的功能做了区分 - 节点支持自定义参数,支持使用占位符${}获取参数值,由上至下可无限传递,可在任意位置取值 - 绘制流程图支持常用快捷键,可使用快捷键对节点进行操作 - 支持查看实时运行状态变化,可在页面上实时看到流程运行至哪一步,以及各节点当前的状态、错误信息等 - 查看实时运行日志功能,可在流程运行时查看日志,内含各个节点的输入输出参数 - 流程运行时,支持停止运行功能,可立即停止当前流程的运行 - 流程采用并行运行的方式,会自动从流程中找出所有起始节点开始并行运行,数据隔离,互不干扰 - 日志管理功能,采集了所有的运行日志和操作日志,用户可在页面上查看日志内容 更多功能,等着你发现! ### 项目部署 #### Docker 部署 部署mysql ```shell script docker run --privileged=true -d -v /root/app/mysql/data/:/var/lib/mysql -v /root/app/mysql/conf.d:/etc/mysql/conf.d -v /root/app/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql ``` 部署rabbitmq ```shell script docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq -v /root/app/rabbitmq/data:/var/lib/rabbitmq --restart=always rabbitmq # 开启后台管理页面的插件(可选) docker exec -it rabbitmq bash rabbitmq-plugins enable rabbitmq_management exit ``` 部署nacos ```shell script docker run -d -e MODE=standalone -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=10.0.4.17 -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -e MYSQL_SERVICE_DB_NAME=nacos_config -e JVM_XMS=256m -e JVM_XMX=256m -e JVM_XMN=256m -p 8848:8848 -p 9848:9848 -p 9849:9849 --privileged=true --name nacos --restart=always nacos/nacos-server ``` 部署springboot应用 ```shell script # 打包镜像 sh build.sh # 启动应用 sh start.sh ``` #### docker-compose 部署 ```shell script # 打包镜像 sh build.sh # 创建容器,在`docker-compose.yml`文件路径下执行 docker-compose up -d ``` ### 待开发项 - [ ] 功能节点待补充,目前暂时想不出来还需要哪些可能用到的功能节点,欢迎任何有想法的朋友提issue,我尽可能地扩展功能节点 - [ ] 由于流程是并行运行,而且非阻塞节点运行速度很快,这就导致使用websocket在同一个session下推送消息会报错,目前采用的是加锁的形式避免问题,后期考虑使用EMQX替代websocket进行消息推送 - [ ] 新增oauth模块,用于鉴权认证,整个项目需要实现鉴权和数据隔离 - [ ] 考虑到广大开发者朋友们的本地调试便捷性,后期可能会使用Feign代替Dubbo和Mq,去除注册中心nacos,减少部署占用,方便本地运行和调试 - [ ] 由于部署在线demo云服务器的资源限制(穷!),本项目全部线上部署目前占用总内存4G左右,导致很多中间件引入进来后服务器资源不够部署,后期考虑等服务器资源足够后,引入redis做分布式缓存,将mysql进行读写分离,引入Prometheus+Grafana实现项目监控,采用k8s部署等一系列优化(等买的起新的服务器再说-.-) \ No newline at end of file +# flow-eda ### 介绍 此分支使用Feign替代了dubbo+nacos的技术方案,方便用户本地调试。 使用此分支无需安装nacos,本地启动应用仅需要mysql数据库和rabbitmq服务即可,各服务之间采用Feign进行http调用。 **说明:** 本分支与master的区别仅仅是使用Feign替代了dubbo+nacos的服务调用方案,其他代码完全一致。 **项目名称介绍:** - flow: 流式编程 - eda: 事件驱动应用程序(Event Driven Application) **在线DEMO** 作者本人自费租了云服务器,搭建了在线DEMO,开源不易,请珍惜服务器资源,感谢! Vue3版本[在线demo](http://36.138.228.74:90/) React版本[在线demo](http://36.138.228.74:90/react/) **项目展示:** ![image](./flow-eda-common/gif/flows1.gif) ![image](./flow-eda-common/gif/flows2.gif) ![image](./flow-eda-common/gif/logs.gif) **Vue3版本界面:** ![image](./flow-eda-common/img/vue3.png) **React版本界面:** ![image](./flow-eda-common/img/react.png) **编辑器界面:** ![image](./flow-eda-common/img/editor.png) 期待您的参与,项目持续开发中... ### 项目模块说明 1. flow-eda-common 公共工具模块 2. flow-eda-runner 流运行引擎模块 3. flow-eda-web 后台管理web模块 4. flow-eda-logger 日志管理模块 5. flow-eda-vue 前端vue模块 6. flow-eda-react 前端react模块 ### 后端技术栈 - 部署:docker,版本20.10.14 - 部署:docker-compose,版本2.5.0 - 数据库:mysql,版本8.0.28 - 微服务框架:springboot,版本2.6.4 - 持久化框架:mybatis,版本2.2.2 - 代码插件:lombok,版本1.18.22 - 服务注册中心:nacos,版本2.0.4 - 服务远程调用:dubbo,版本3.0.7 - 数据推送:websocket,版本2.6.4 - 消息队列:rabbitmq,版本3.9.15 ### 支持的功能节点 **基础** - [x] start节点,是触发流程执行的起始节点 - [x] timer节点,定时器,定时触发流程,支持周期触发和cron表达式触发,可指定执行次数,可输出指定格式的时间戳 - [x] output节点,输出节点,用于输出上游节点传递下来的输出参数 - [x] delay节点,延时器,用于延迟指定时间后再执行其下游节点 **解析** - [x] json解析器,用于解析上游节点的输出参数,获取用户需要的参数信息 - [ ] xml解析器,用于解析xml格式的数据,获取指定xml标签内的内容 - [ ] html解析器,用于解析html网页内容,获取指定内容数据 **网络** - [x] HTTP请求节点,可发送HTTP请求,支持herder、token等请求头,支持url带参数,支持由上游节点输入的变量 - [ ] HTTP响应节点,可自定义http服务,指定http参数和响应内容,可动态响应数据 - [ ] websocket客户端,可用于连接websocket服务,发送和接收数据 - [ ] websocket服务端,创建一个websocket服务,可响应客户端的连接和数据的接收/发送 - [ ] TCP请求节点,可发送TCP请求,并接收响应数据 - [ ] TCP响应节点,创建一个TCP服务,可用于响应TCP客户端的请求 - [ ] MQTT请求节点,可向指定topic中发送MQTT请求 - [ ] MQTT响应节点,创建一个MQTT服务,可用于响应客户端的请求 **数据库** - [ ] mysql节点,可连接mysql数据库,执行自定义sql语句,输出查询结果 - [ ] mysql结果解析器,用于解析mysql数据库的查询结果,输出指定内容 - [ ] mongodb节点,可连接mongodb数据库,执行自定义查询语句,输出查询结果 持续开发中... ### 主要功能点 - 支持绘制任意的流程图,没有繁琐的约束,仅针对不同节点的参数做了校验 - 各节点地位平等,不分头尾,可任意连接绘制,连接数量无上限,仅对节点的功能做了区分 - 节点支持自定义参数,支持使用占位符${}获取参数值,由上至下可无限传递,可在任意位置取值 - 绘制流程图支持常用快捷键,可使用快捷键对节点进行操作 - 支持查看实时运行状态变化,可在页面上实时看到流程运行至哪一步,以及各节点当前的状态、错误信息等 - 查看实时运行日志功能,可在流程运行时查看日志,内含各个节点的输入输出参数 - 流程运行时,支持停止运行功能,可立即停止当前流程的运行 - 流程采用并行运行的方式,会自动从流程中找出所有起始节点开始并行运行,数据隔离,互不干扰 - 日志管理功能,采集了所有的运行日志和操作日志,用户可在页面上查看日志内容 更多功能,等着你发现! ### 项目部署 #### Docker 部署 部署mysql ```shell script docker run --privileged=true -d -v /root/app/mysql/data/:/var/lib/mysql -v /root/app/mysql/conf.d:/etc/mysql/conf.d -v /root/app/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql ``` 部署rabbitmq ```shell script docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq -v /root/app/rabbitmq/data:/var/lib/rabbitmq --restart=always rabbitmq # 开启后台管理页面的插件(可选) docker exec -it rabbitmq bash rabbitmq-plugins enable rabbitmq_management exit ``` 部署nacos ```shell script docker run -d -e MODE=standalone -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=10.0.4.17 -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -e MYSQL_SERVICE_DB_NAME=nacos_config -e JVM_XMS=256m -e JVM_XMX=256m -e JVM_XMN=256m -p 8848:8848 -p 9848:9848 -p 9849:9849 --privileged=true --name nacos --restart=always nacos/nacos-server ``` 部署springboot应用 ```shell script # 打包镜像 sh build.sh # 启动应用 sh start.sh ``` #### docker-compose 部署 ```shell script # 打包镜像 sh build.sh # 创建容器,在`docker-compose.yml`文件路径下执行 docker-compose up -d ``` ### 待开发项 - [ ] 功能节点待补充,目前暂时想不出来还需要哪些可能用到的功能节点,欢迎任何有想法的朋友提issue,我尽可能地扩展功能节点 - [ ] 由于流程是并行运行,而且非阻塞节点运行速度很快,这就导致使用websocket在同一个session下推送消息会报错,目前采用的是加锁的形式避免问题,后期考虑使用EMQX替代websocket进行消息推送 - [ ] 新增oauth模块,用于鉴权认证,整个项目需要实现鉴权和数据隔离 - [ ] 考虑到广大开发者朋友们的本地调试便捷性,后期可能会使用Feign代替Dubbo和Mq,去除注册中心nacos,减少部署占用,方便本地运行和调试 - [ ] 由于部署在线demo云服务器的资源限制(穷!),本项目全部线上部署目前占用总内存4G左右,导致很多中间件引入进来后服务器资源不够部署,后期考虑等服务器资源足够后,引入redis做分布式缓存,将mysql进行读写分离,引入Prometheus+Grafana实现项目监控,采用k8s部署等一系列优化(等买的起新的服务器再说-.-) \ No newline at end of file From 947eb00a29025d63064970bfe8c5c612c25e8d46 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 14:55:15 +0800 Subject: [PATCH 05/28] =?UTF-8?q?=E7=A7=BB=E9=99=A4dubbo-api=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eda/common/dubbo/api/FlowDataService.java | 29 ----------------- .../eda/common/dubbo/api/FlowInfoService.java | 12 ------- .../eda/common/dubbo/api/LogsService.java | 32 ------------------- .../common/{dubbo => }/model/FlowData.java | 2 +- .../eda/common/{dubbo => }/model/Logs.java | 2 +- 5 files changed, 2 insertions(+), 75 deletions(-) delete mode 100644 flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowDataService.java delete mode 100644 flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowInfoService.java delete mode 100644 flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/LogsService.java rename flow-eda-common/src/main/java/com/flow/eda/common/{dubbo => }/model/FlowData.java (91%) rename flow-eda-common/src/main/java/com/flow/eda/common/{dubbo => }/model/Logs.java (96%) 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 f6cc6859..00000000 --- a/flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowInfoService.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.flow.eda.common.dubbo.api; - -/** 获取流程信息接口 */ -public interface FlowInfoService { - /** - * 获取流程状态 - * - * @param flowId 流程id - * @return 返回流程当前状态 - */ - String getFlowStatus(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 91% 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 b5e48df3..58df500f 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; From 1b15af5221f2e9e1b9b8e2ee275c9d281a66ad9a Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 15:00:46 +0800 Subject: [PATCH 06/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/flow/eda/logger/logs/LogsController.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsController.java b/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsController.java index 08bb7eef..aa8895c5 100644 --- a/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsController.java +++ b/flow-eda-logger/src/main/java/com/flow/eda/logger/logs/LogsController.java @@ -1,7 +1,7 @@ package com.flow.eda.logger.logs; -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.springframework.web.bind.annotation.*; @@ -37,9 +37,8 @@ public Result> getLogList(@RequestParam Type type) { * @param path 日志文件路径 */ @DeleteMapping("/logs") - public Result deleteLogs(@RequestBody List path) { + public void deleteLogs(@RequestBody List path) { path.forEach(this::deleteLogFile); - return Result.ok(); } /** 获取操作日志信息列表 */ From c60b77aa066c111607f731cd05ef9c8a7f1b0d7f Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 15:01:43 +0800 Subject: [PATCH 07/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0Feign=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E6=B3=A8=E5=85=A5=E5=85=A8=E5=B1=80=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/flow/eda/logger/FlowEdaLoggerApplication.java | 4 ++++ flow-eda-logger/src/main/resources/application.yaml | 3 --- 2 files changed, 4 insertions(+), 3 deletions(-) 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 7419af46..7fc5b7af 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 @@ -2,10 +2,14 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.web.socket.server.standard.ServerEndpointExporter; +@EnableFeignClients @SpringBootApplication +@ComponentScan(basePackages = {"com.flow.eda.logger", "com.flow.eda.common.config"}) public class FlowEdaLoggerApplication { public static void main(String[] args) { diff --git a/flow-eda-logger/src/main/resources/application.yaml b/flow-eda-logger/src/main/resources/application.yaml index a604aad6..89ad4d8a 100644 --- a/flow-eda-logger/src/main/resources/application.yaml +++ b/flow-eda-logger/src/main/resources/application.yaml @@ -8,6 +8,3 @@ spring: port: 5672 username: guest password: guest -logging: - level: - com.alibaba.nacos.common.remote.client: warn From 07cb10a98455511ba2e971f206c5510d0628e6d2 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 15:35:06 +0800 Subject: [PATCH 08/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0Feign=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/flow/eda/logger/FlowEdaLoggerApplication.java | 2 -- 1 file changed, 2 deletions(-) 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 7fc5b7af..310e2c86 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 @@ -2,12 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.socket.server.standard.ServerEndpointExporter; -@EnableFeignClients @SpringBootApplication @ComponentScan(basePackages = {"com.flow.eda.logger", "com.flow.eda.common.config"}) public class FlowEdaLoggerApplication { From 7520d600b1b8205a777120b24d6f76a43bd07b97 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 15:38:21 +0800 Subject: [PATCH 09/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eda/runner/data/FlowDataController.java | 45 +++++++++++++++++++ .../eda/runner/data/FlowDataServiceImpl.java | 31 ------------- 2 files changed, 45 insertions(+), 31 deletions(-) create mode 100644 flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataController.java delete mode 100644 flow-eda-runner/src/main/java/com/flow/eda/runner/data/FlowDataServiceImpl.java 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); - } -} From 940992b18f854e65c226122050c193e49b129903 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 15:38:38 +0800 Subject: [PATCH 10/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=8A=B6=E6=80=81=E4=BF=A1=E6=81=AF=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eda/runner/status/FlowStatusClient.java | 19 +++++++++++++++++++ .../eda/runner/status/FlowStatusService.java | 9 ++++----- 2 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusClient.java 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..bdf27656 --- /dev/null +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusClient.java @@ -0,0 +1,19 @@ +package com.flow.eda.runner.status; + +import com.flow.eda.common.http.Result; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** 获取流程状态信息接口 */ +@FeignClient(name = "flowStatus", url = "localhost:8081") +public interface FlowStatusClient { + /** + * 获取流程状态 + * + * @param flowId 流程id + * @return 返回流程当前状态 + */ + @GetMapping("/api/v1/feign/flow/status") + Result getFlowStatus(@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 f671c168..faa68c1d 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,10 +1,9 @@ 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.config.annotation.DubboReference; import org.bson.Document; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -21,7 +20,7 @@ public class FlowStatusService { /** 临时存储流数据 */ private final Map> dataMap = new HashMap<>(); - @DubboReference private FlowInfoService flowInfoService; + @Autowired private FlowStatusClient flowStatusClient; public void startRun( String flowId, List data, List starts, List timer) { @@ -41,7 +40,7 @@ public void startRun( public String getFlowStatus(String flowId, Document message) { String nodeId = message.getString("nodeId"); if (!nodeMap.containsKey(flowId) || nodeId == null) { - return flowInfoService.getFlowStatus(flowId); + return flowStatusClient.getFlowStatus(flowId).getResult(); } String status = message.getString("status"); if (Node.Status.FAILED.name().equals(status)) { From cc5fa3e7648f3ffaef6410694abf7c2e1a9ece65 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 15:39:21 +0800 Subject: [PATCH 11/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0Feign=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eda/runner/FlowEdaRunnerApplication.java | 8 ++++---- .../com/flow/eda/runner/node/NodeTypeEnum.java | 2 +- .../flow/eda/runner/runtime/FlowDataRuntime.java | 2 +- .../flow/eda/runner/runtime/FlowExecutor.java | 2 +- .../src/main/resources/application.yaml | 16 ---------------- 5 files changed, 7 insertions(+), 23 deletions(-) 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 0af5e337..39c0d197 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 @@ -1,15 +1,15 @@ package com.flow.eda.runner; import com.flow.eda.runner.status.FlowNodeWebsocket; -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.cloud.openfeign.EnableFeignClients; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.ComponentScan; -@EnableDubbo -@DubboComponentScan(basePackages = "com.flow.eda.runner.data") +@EnableFeignClients @SpringBootApplication +@ComponentScan(basePackages = {"com.flow.eda.runner", "com.flow.eda.common.config"}) public class FlowEdaRunnerApplication { public static void main(String[] args) { 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 b837536b..f25da0c9 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.delay.DelayNode; import com.flow.eda.runner.node.http.HttpNode; import com.flow.eda.runner.node.output.OutputNode; 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 845e0393..31f78f74 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.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/runtime/FlowExecutor.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/runtime/FlowExecutor.java index d246fad0..11cb4c52 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/resources/application.yaml b/flow-eda-runner/src/main/resources/application.yaml index 94362381..85f0c8ae 100644 --- a/flow-eda-runner/src/main/resources/application.yaml +++ b/flow-eda-runner/src/main/resources/application.yaml @@ -10,19 +10,3 @@ 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 -logging: - level: - com.alibaba.nacos.common.remote.client: warn From 1fd4118d5767379a5d5cc3bf9536e4dfd94c0c07 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 15:40:14 +0800 Subject: [PATCH 12/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BD=BF=E7=94=A8?= =?UTF-8?q?FeignClient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/flow/node/data/FlowDataClient.java | 37 +++++++++++++++++++ .../web/flow/node/data/NodeDataService.java | 10 ++--- 2 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/FlowDataClient.java diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/FlowDataClient.java b/flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/FlowDataClient.java new file mode 100644 index 00000000..c80cdac3 --- /dev/null +++ b/flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/FlowDataClient.java @@ -0,0 +1,37 @@ +package com.flow.eda.web.flow.node.data; + +import com.flow.eda.common.model.FlowData; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** 流程数据接口 */ +@FeignClient(name = "flowData", url = "localhost:8088") +public interface FlowDataClient { + /** + * 运行当前流程 + * + * @param data 流数据 + */ + @PostMapping("/api/v1/feign/flow/run") + void runFlowData(@RequestBody List data); + + /** + * 停止当前流程 + * + * @param flowId 流程id + */ + @PostMapping("/api/v1/feign/flow/stop") + void stopFlowData(@RequestParam String flowId); + + /** + * 清理当前流程缓存数据(流程运行结束后调用) + * + * @param flowId 流程id + */ + @PostMapping("/api/v1/feign/flow/clear") + void clearFlowData(@RequestParam String flowId); +} diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/NodeDataService.java b/flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/NodeDataService.java index 668f2b43..04adeda4 100644 --- a/flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/NodeDataService.java +++ b/flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/NodeDataService.java @@ -1,13 +1,11 @@ package com.flow.eda.web.flow.node.data; -import com.flow.eda.common.dubbo.api.FlowDataService; -import com.flow.eda.common.dubbo.model.FlowData; import com.flow.eda.common.exception.InvalidStateException; +import com.flow.eda.common.model.FlowData; import com.flow.eda.common.utils.MergeBuilder; import com.flow.eda.web.flow.FlowService; import com.flow.eda.web.flow.node.type.NodeType; import com.flow.eda.web.flow.node.type.NodeTypeService; -import org.apache.dubbo.config.annotation.DubboReference; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,7 +18,7 @@ @Service public class NodeDataService { - @DubboReference private FlowDataService flowDataService; + @Autowired private FlowDataClient flowDataClient; @Autowired private NodeDataMapper nodeDataMapper; @Autowired private NodeTypeService nodeTypeService; @Autowired private FlowService flowService; @@ -51,14 +49,14 @@ public void runNodeData(String flowId) { // 调用远程接口,运行当前流数据 List data = new ArrayList<>(); list.forEach(n -> data.add(convert(n))); - flowDataService.runFlowData(data); + flowDataClient.runFlowData(data); } /** 停止运行当前流程 */ public void stopNodeData(String flowId) { flowService.findById(flowId); // 调用远程接口,停止运行当前流程 - flowDataService.stopFlowData(flowId); + flowDataClient.stopFlowData(flowId); } private FlowData convert(NodeData nodeData) { From 33a33703fc9f3c3d72b1354e4c862108c8fe4ee8 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 15:40:43 +0800 Subject: [PATCH 13/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=8A=B6=E6=80=81=E4=BF=A1=E6=81=AF=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/flow/status/FlowInfoServiceImpl.java | 18 ------------- .../web/flow/status/FlowStatusController.java | 27 +++++++++++++++++++ .../web/flow/status/FlowStatusService.java | 7 +++-- 3 files changed, 30 insertions(+), 22 deletions(-) delete mode 100644 flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowInfoServiceImpl.java create mode 100644 flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusController.java diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowInfoServiceImpl.java b/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowInfoServiceImpl.java deleted file mode 100644 index 3b1051b3..00000000 --- a/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowInfoServiceImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.flow.eda.web.flow.status; - -import com.flow.eda.common.dubbo.api.FlowInfoService; -import com.flow.eda.web.flow.FlowService; -import org.apache.dubbo.config.annotation.DubboService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -@DubboService(interfaceClass = FlowInfoService.class) -public class FlowInfoServiceImpl implements FlowInfoService { - @Autowired private FlowService flowService; - - @Override - public String getFlowStatus(String flowId) { - return flowService.findById(flowId).getStatus().name(); - } -} diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusController.java b/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusController.java new file mode 100644 index 00000000..44150522 --- /dev/null +++ b/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusController.java @@ -0,0 +1,27 @@ +package com.flow.eda.web.flow.status; + +import com.flow.eda.common.http.Result; +import com.flow.eda.web.flow.FlowService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** 获取流程状态信息接口 */ +@RestController +@RequestMapping("/api/v1/feign") +public class FlowStatusController { + @Autowired private FlowService flowService; + + /** + * 获取流程状态 + * + * @param flowId 流程id + * @return 返回流程当前状态 + */ + @GetMapping("/flow/status") + public Result getFlowStatus(@RequestParam String flowId) { + return Result.of(flowService.findById(flowId).getStatus().name()); + } +} diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusService.java b/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusService.java index 07aa0a99..ace174db 100644 --- a/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusService.java +++ b/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusService.java @@ -1,9 +1,8 @@ package com.flow.eda.web.flow.status; -import com.flow.eda.common.dubbo.api.FlowDataService; import com.flow.eda.web.flow.Flow; import com.flow.eda.web.flow.FlowMapper; -import org.apache.dubbo.config.annotation.DubboReference; +import com.flow.eda.web.flow.node.data.FlowDataClient; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -14,7 +13,7 @@ @Service public class FlowStatusService { private final Map statusMap = new HashMap<>(); - @DubboReference private FlowDataService flowDataService; + @Autowired private FlowDataClient flowDataClient; @Autowired private FlowMapper flowMapper; /** 刷新缓存中的流程状态 */ @@ -41,7 +40,7 @@ private void updateStatus(String flowId) { // 如果流程已执行完毕,则需要清理缓存数据 if (!Flow.Status.RUNNING.name().equals(status)) { statusMap.remove(flowId); - flowDataService.clearFlowData(flowId); + flowDataClient.clearFlowData(flowId); } } } From 55ae3722f137dcb195866d8c103f7f80836503a3 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 15:41:19 +0800 Subject: [PATCH 14/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/flow/eda/web/log/LogClient.java | 32 +++++++++++++++++++ .../com/flow/eda/web/log/LogController.java | 2 +- .../java/com/flow/eda/web/log/LogRequest.java | 11 +++++-- .../java/com/flow/eda/web/log/LogService.java | 10 +++--- 4 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 flow-eda-web/src/main/java/com/flow/eda/web/log/LogClient.java diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/log/LogClient.java b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogClient.java new file mode 100644 index 00000000..5bc8b075 --- /dev/null +++ b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogClient.java @@ -0,0 +1,32 @@ +package com.flow.eda.web.log; + +import com.flow.eda.common.http.Result; +import com.flow.eda.common.model.Logs; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** 日志服务接口 */ +@FeignClient(name = "log", url = "localhost:8082") +public interface LogClient { + /** + * 获取日志信息列表 + * + * @param type 日志类型 + * @return 日志信息列表 + */ + @GetMapping("/api/v1/feign/logs") + Result> getLogList(@RequestParam String type); + + /** + * 删除日志文件 + * + * @param path 日志文件路径 + */ + @DeleteMapping("/api/v1/feign/logs") + void deleteLogFiles(@RequestBody List path); +} diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/log/LogController.java b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogController.java index e4cb4d71..54c4fa90 100644 --- a/flow-eda-web/src/main/java/com/flow/eda/web/log/LogController.java +++ b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogController.java @@ -1,8 +1,8 @@ package com.flow.eda.web.log; -import com.flow.eda.common.dubbo.model.Logs; import com.flow.eda.common.exception.MissingRequestParameterException; import com.flow.eda.common.http.Result; +import com.flow.eda.common.model.Logs; import com.flow.eda.common.utils.CollectionUtil; import com.flow.eda.web.http.PageResult; import org.springframework.beans.factory.annotation.Autowired; diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/log/LogRequest.java b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogRequest.java index 43d52619..8d84496f 100644 --- a/flow-eda-web/src/main/java/com/flow/eda/web/log/LogRequest.java +++ b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogRequest.java @@ -1,6 +1,5 @@ package com.flow.eda.web.log; -import com.flow.eda.common.dubbo.api.LogsService; import com.flow.eda.web.http.PageRequest; import lombok.Getter; import lombok.Setter; @@ -8,5 +7,13 @@ @Getter @Setter public class LogRequest extends PageRequest { - private LogsService.Type type; + private Type type; + + /** 日志类型 */ + enum Type { + /** 操作日志 */ + OPERATION, + /** 运行日志 */ + RUNNING + } } diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/log/LogService.java b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogService.java index 40fe51cf..33b7c563 100644 --- a/flow-eda-web/src/main/java/com/flow/eda/web/log/LogService.java +++ b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogService.java @@ -1,12 +1,10 @@ package com.flow.eda.web.log; -import com.flow.eda.common.dubbo.api.LogsService; -import com.flow.eda.common.dubbo.model.Logs; +import com.flow.eda.common.model.Logs; import com.flow.eda.common.utils.CollectionUtil; import com.flow.eda.common.utils.MergeBuilder; import com.flow.eda.web.flow.Flow; import com.flow.eda.web.flow.FlowMapper; -import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -16,12 +14,12 @@ @Service public class LogService { - @DubboReference private LogsService logsService; + @Autowired private LogClient logClient; @Autowired private FlowMapper flowMapper; /** 获取日志文件信息列表 */ public List getLogList(LogRequest request) { - List list = logsService.getLogList(request.getType()); + List list = logClient.getLogList(request.getType().name()).getResult(); List ids = filterMap(list, l -> l.getFlow() != null, Logs::getFlow); if (CollectionUtil.isNotEmpty(ids)) { // 聚合流程名称 @@ -38,7 +36,7 @@ public List getLogList(LogRequest request) { /** 删除日志文件 */ public void deleteLogs(List path) { - logsService.deleteLogFiles(path); + logClient.deleteLogFiles(path); } private int comparingDate(String date1, String date2) { From ed5d7d7fa0819f7867321e86d6f52007ff667fa9 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 15:41:42 +0800 Subject: [PATCH 15/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0Feign=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flow/eda/web/FlowEdaWebApplication.java | 7 ++----- .../src/main/resources/application.yaml | 19 ------------------- 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/FlowEdaWebApplication.java b/flow-eda-web/src/main/java/com/flow/eda/web/FlowEdaWebApplication.java index a2930177..dbff9daa 100644 --- a/flow-eda-web/src/main/java/com/flow/eda/web/FlowEdaWebApplication.java +++ b/flow-eda-web/src/main/java/com/flow/eda/web/FlowEdaWebApplication.java @@ -1,17 +1,14 @@ package com.flow.eda.web; -import com.flow.eda.web.flow.status.FlowInfoServiceImpl; -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.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; -@EnableDubbo +@EnableFeignClients @SpringBootApplication @EnableTransactionManagement -@DubboComponentScan(basePackageClasses = FlowInfoServiceImpl.class) @ComponentScan(basePackages = {"com.flow.eda.web", "com.flow.eda.common.config"}) public class FlowEdaWebApplication { diff --git a/flow-eda-web/src/main/resources/application.yaml b/flow-eda-web/src/main/resources/application.yaml index 6ea53971..9d71ee3a 100644 --- a/flow-eda-web/src/main/resources/application.yaml +++ b/flow-eda-web/src/main/resources/application.yaml @@ -25,22 +25,3 @@ mybatis: type-handlers-package: com.flow.eda.web.mybatis configuration: map-underscore-to-camel-case: true -dubbo: - application: - name: flow-eda-web - qos-enable: false - qos-accept-foreign-ip: false - registry: - protocol: dubbo - address: nacos://localhost:8848 - username: nacos - password: nacos - protocol: - name: dubbo - port: 20881 - consumer: - check: false - timeout: 5000 -logging: - level: - com.alibaba.nacos.common.remote.client: warn From 89bf75fbaaebc694b915985cac43a6013c2a8cc8 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 15:42:32 +0800 Subject: [PATCH 16/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0docker-compose.yaml?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2114366c..c1b44722 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,26 +22,6 @@ services: - 15672:15672 volumes: - /root/app/rabbitmq/data:/var/lib/rabbitmq - nacos: - image: nacos/nacos-server - container_name: nacos - depends_on: - - mysql - restart: always - 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 From ba7203e9a754ba863927e65f9fb537252fb2008b Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 24 May 2022 16:45:09 +0800 Subject: [PATCH 17/28] =?UTF-8?q?=E8=A7=A3=E5=86=B3Feign=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E7=B1=BB=E5=9E=8B=E8=87=AA=E5=8A=A8=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=B8=BALinkedHahMap=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/flow/eda/runner/node/AbstractNode.java | 12 ++++++++++-- .../com/flow/eda/runner/utils/PlaceholderUtil.java | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) 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 83bbdb4e..14ac25e5 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,6 +5,8 @@ import java.util.Optional; +import static com.flow.eda.runner.utils.PlaceholderUtil.OBJECT_MAPPER; + /** 节点抽象类 */ public abstract class AbstractNode implements Node { /** 节点自定义参数,可传递至下个节点 */ @@ -21,8 +23,14 @@ public abstract class AbstractNode implements Node { */ public AbstractNode(Document params) { if (params != null) { - 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 = this.parsePlaceholder(params); 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 9c1acf89..d63219d6 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("\\$\\{([^}]*)}"); /** From 9221c85e75a50ca8e5970db2c9dde01f7fdc4290 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Sat, 2 Jul 2022 11:30:15 +0800 Subject: [PATCH 18/28] Merge --- .../eda/logger/FlowEdaLoggerApplication.java | 7 ++++++- .../eda/runner/FlowEdaRunnerApplication.java | 13 +++++++++---- .../node/http/request/HttpRequestNode.java | 18 +++++++++--------- .../eda/runner/status/FlowStatusService.java | 13 +++++-------- .../com/flow/eda/web/log/LogController.java | 3 +-- .../java/com/flow/eda/web/log/LogService.java | 7 ++----- 6 files changed, 32 insertions(+), 29 deletions(-) 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 0380fcdf..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 @@ -7,7 +7,12 @@ import org.springframework.web.socket.server.standard.ServerEndpointExporter; @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-runner/src/main/java/com/flow/eda/runner/FlowEdaRunnerApplication.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/FlowEdaRunnerApplication.java index dc4023cf..be0419e7 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 @@ -1,21 +1,26 @@ package com.flow.eda.runner; import com.flow.eda.runner.node.http.response.HttpResponseServlet; -import com.flow.eda.runner.status.FlowNodeWebsocket; +import com.flow.eda.runner.utils.ApplicationContextUtil; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.openfeign.EnableFeignClients; 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.web.servlet.DispatcherServlet; import org.springframework.context.annotation.ComponentScan; +import org.springframework.web.servlet.DispatcherServlet; @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/node/http/request/HttpRequestNode.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/http/request/HttpRequestNode.java index bcfc7e7b..3d5a3c73 100644 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/http/request/HttpRequestNode.java +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/http/request/HttpRequestNode.java @@ -29,6 +29,15 @@ public HttpRequestNode(Document params) { super(params); } + public static String verifyMethod(Document params) { + String method = params.getString("method"); + NodeVerify.notBlank(method, "method"); + List list = + Arrays.asList("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "TRACE", "PATCH"); + NodeVerify.isTrue(list.contains(method), "method"); + return method; + } + @Override public void run(NodeFunction function) { try { @@ -106,13 +115,4 @@ private Document executeHttpRequest() throws Exception { } throw new InternalException("The http request has no response."); } - - public static String verifyMethod(Document params) { - String method = params.getString("method"); - NodeVerify.notBlank(method, "method"); - List list = - Arrays.asList("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "TRACE", "PATCH"); - NodeVerify.isTrue(list.contains(method), "method"); - return method; - } } 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 0e1e6892..3bf453ed 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 @@ -7,10 +7,7 @@ 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 static com.flow.eda.common.utils.CollectionUtil.*; @@ -27,8 +24,8 @@ public class FlowStatusService { public void startRun( String flowId, List data, List starts, List timer) { - this.nodeMap.put(flowId, new ConcurrentHashSet<>()); - this.runMap.put(flowId, new ConcurrentHashSet<>()); + this.nodeMap.put(flowId, new HashSet<>()); + this.runMap.put(flowId, new HashSet<>()); if (isNotEmpty(starts)) { this.parseAllNodes(flowId, data, starts); } @@ -63,7 +60,7 @@ public String getFlowStatus(String flowId, Document message) { /** 判断当前流程状态是否已完成 */ public boolean isFinished(String flowId) { if (!nodeMap.containsKey(flowId)) { - String status = flowInfoService.getFlowStatus(flowId); + String status = flowStatusClient.getFlowStatus(flowId).getResult(); return Node.Status.FINISHED.name().equals(status); } return nodeMap.get(flowId).isEmpty(); @@ -110,7 +107,7 @@ private void parseNextNode(List data, FlowData currentNode, Set data, FlowData currentNode) { - Set nodeSet = new ConcurrentHashSet<>(); + Set nodeSet = new HashSet<>(); nodeSet.add(currentNode.getId()); this.parseNextNode(data, currentNode, nodeSet); this.nodeMap.get(currentNode.getFlowId()).removeAll(nodeSet); diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/log/LogController.java b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogController.java index c12e4ce1..b27c0ee0 100644 --- a/flow-eda-web/src/main/java/com/flow/eda/web/log/LogController.java +++ b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogController.java @@ -25,8 +25,7 @@ public PageResult logList(LogRequest request, Principal principal) { throw new MissingRequestParameterException("type"); } // 仅管理员用户可查看操作日志 - if (LogsService.Type.OPERATION.equals(request.getType()) - && !ADMIN.equals(principal.getName())) { + if ("OPERATION".equals(request.getType().name()) && !ADMIN.equals(principal.getName())) { throw new InvalidVerifyTokenException("Insufficient permissions"); } String username = ADMIN.equals(principal.getName()) ? null : principal.getName(); diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/log/LogService.java b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogService.java index 09fc9ffe..90f355bd 100644 --- a/flow-eda-web/src/main/java/com/flow/eda/web/log/LogService.java +++ b/flow-eda-web/src/main/java/com/flow/eda/web/log/LogService.java @@ -18,11 +18,8 @@ public class LogService { @Autowired private FlowMapper flowMapper; /** 获取日志文件信息列表 */ - public List getLogList(LogRequest request) { - List list = logClient.getLogList(request.getType().name()).getResult(); - List ids = filterMap(list, l -> l.getFlow() != null, Logs::getFlow); public List getLogList(LogRequest request, String username) { - List list = logsService.getLogList(request.getType()); + List list = logClient.getLogList(request.getType().name()).getResult(); List ids; if (username != null) { // 根据用户进行过滤 @@ -43,7 +40,7 @@ public List getLogList(LogRequest request, String username) { MergeBuilder.source(list, Logs::getFlow) .target(flows, Flow::getId) .mergeS((log, flow) -> log.setFlowName(flow.getName())); - } else if (LogsService.Type.RUNNING.equals(request.getType())) { + } else if ("RUNNING".equals(request.getType().name())) { list.clear(); } // 根据日志的日期排序,降序 From 75662827885f85d8528b6cc0d3812c2ac6b5c113 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Sat, 2 Jul 2022 15:21:04 +0800 Subject: [PATCH 19/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E5=8E=BB=E9=99=A4dubbo=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flow-eda-logger/src/main/resources/application.yaml | 3 --- flow-eda-runner/src/main/resources/application.yaml | 3 --- 2 files changed, 6 deletions(-) diff --git a/flow-eda-logger/src/main/resources/application.yaml b/flow-eda-logger/src/main/resources/application.yaml index c6f361b7..7b2dc14c 100644 --- a/flow-eda-logger/src/main/resources/application.yaml +++ b/flow-eda-logger/src/main/resources/application.yaml @@ -14,6 +14,3 @@ security: 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/resources/application.yaml b/flow-eda-runner/src/main/resources/application.yaml index f1eee6cb..831e8775 100644 --- a/flow-eda-runner/src/main/resources/application.yaml +++ b/flow-eda-runner/src/main/resources/application.yaml @@ -16,6 +16,3 @@ security: 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 From bdfd8405d20f4505f6b8a261d3f1306898495bce Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Sat, 2 Jul 2022 16:27:37 +0800 Subject: [PATCH 20/28] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89Feign=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=8B=A6=E6=88=AA=E5=99=A8=EF=BC=8C=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=97=B6=E8=AE=A4=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FeignOauth2RequestInterceptor.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 flow-eda-common/src/main/java/com/flow/eda/common/resource/FeignOauth2RequestInterceptor.java 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")); + } + } + } +} From aeeeb7a3830483ad0465072849aa1f3434443d26 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Sat, 2 Jul 2022 16:28:21 +0800 Subject: [PATCH 21/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0oauth2=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flow-eda-web/src/main/resources/application.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/flow-eda-web/src/main/resources/application.yaml b/flow-eda-web/src/main/resources/application.yaml index 5cd61e94..2e5201ad 100644 --- a/flow-eda-web/src/main/resources/application.yaml +++ b/flow-eda-web/src/main/resources/application.yaml @@ -25,3 +25,9 @@ mybatis: type-handlers-package: com.flow.eda.web.mybatis configuration: map-underscore-to-camel-case: true +security: + oauth2: + resource-id: flow-eda + client-id: 1df7b0c1-aac0-148a14c7cba8 + client-secret: zcUaT32GlwIjz4yBJjYZIIMvzf + check-token-url: http://localhost:8086/oauth/check_token From 7ca3493b7339a0ea835477a5dc937314cbef8386 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Sun, 3 Jul 2022 10:28:22 +0800 Subject: [PATCH 22/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0HTTP=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E8=8A=82=E7=82=B9=EF=BC=8C=E8=8E=B7=E5=8F=96=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=90=91=E4=B8=8B=E6=B8=B8=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flow/eda/runner/node/http/response/HttpResponseNode.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/http/response/HttpResponseNode.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/http/response/HttpResponseNode.java index ea6e865d..c877bb54 100644 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/http/response/HttpResponseNode.java +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/http/response/HttpResponseNode.java @@ -17,7 +17,6 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; -import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -65,9 +64,7 @@ public void handle(HttpServletRequest request, HttpServletResponse response) { } // 获取请求参数,向下游输出 try { - Document data = - Document.parse( - IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8)); + Document data = Document.parse(IOUtils.toString(request.getInputStream(), "UTF-8")); Document output = output(); output.putAll(data); callback.callback(output); From 0877e4e746b8ba53bb7d26f58753064a8a6d79e6 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Mon, 4 Jul 2022 20:34:32 +0800 Subject: [PATCH 23/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0master=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=87=B3=E6=9C=AC=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eda/runner/node/http/request/HttpRequestNode.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/http/request/HttpRequestNode.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/http/request/HttpRequestNode.java index 887e47f5..150a948d 100644 --- a/flow-eda-runner/src/main/java/com/flow/eda/runner/node/http/request/HttpRequestNode.java +++ b/flow-eda-runner/src/main/java/com/flow/eda/runner/node/http/request/HttpRequestNode.java @@ -28,15 +28,6 @@ public HttpRequestNode(Document params) { super(params); } - public static String verifyMethod(Document params) { - String method = params.getString("method"); - NodeVerify.notBlank(method, "method"); - List list = - Arrays.asList("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "TRACE", "PATCH"); - NodeVerify.isTrue(list.contains(method), "method"); - return method; - } - @Override public void run(NodeFunction function) { try { From b9cdab9e8d96f5998ae33c7ec2be04d451f211be Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Sat, 23 Jul 2022 14:35:24 +0800 Subject: [PATCH 24/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 178 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d7e2153..faf604e1 100644 --- a/README.md +++ b/README.md @@ -1 +1,178 @@ -# flow-eda ### 项目简介 flow-eda 项目是一种基于事件驱动的流式低代码编程应用程序,它的主要功能是采用可视化编程,以拖拽节点、连接组合节点的形式来完成流程绘制,达到低代码开发和实现业务编程的目的。 更多详细内容请查看[项目文档](https://linxfeng.github.io/flow-eda) 欢迎各路大神共同参与开发,项目持续扩展完善中 #### 项目名称 - **flow**: 流程图、流式编程 - **eda**: 事件驱动应用程序 (Event Driven Application) - **flow-eda**: 一种基于事件驱动的流式低代码编程应用程序 ### 项目特点 - 整个流程运行引擎全都在后端实现,前端非常轻量,所有的数据、参数、包括输入框等数据全由后端配置提供,前端仅负责根据数据展示。后期开发仅扩展后端功能即可,前端无需更改,自动兼容。 - 流程运行引擎做到模块化、配置化。后期在进行功能扩展和开发时,仅需要针对新增的功能,新增配置和新增模块功能代码即可,运行引擎自动适配。 - 后端设计采用微服务架构,各个模块之间按业务功能相互解耦。便于后期二次开发和功能扩展。 - 代码风格严格按照规范执行,后端代码遵循 Alibaba 规范,代码格式使用 google-java-format 格式化,前端代码使用 Prettier 格式化,消除代码中的标黄警告等,做到编码规范化。 ### 在线演示 作者本人自费租了云服务器,搭建了在线演示 DEMO,开源不易,请珍惜服务器资源,感谢! Vue3 版本[在线 demo](http://120.48.9.40:80) React 版本[在线 demo](http://120.48.9.40:90) 喜欢请点点 star,谢谢^.^ ### 代码仓库 - [GitHub](https://github.com/Linxfeng/flow-eda) - [Gitee](https://gitee.com/Linxff/flow-eda) ### 项目展示 ![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/flows.gif) ![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/logs.gif) **Vue3 版本界面:** ![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/vue3.png) **React 版本界面:** ![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/react.png) **编辑器界面:** ![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/editor.png) 期待您的参与,项目持续扩展完善中... ### 项目模块 - **flow-eda-common** 公共工具模块 - **flow-eda-runner** 流程运行引擎模块 - **flow-eda-web** 后台管理 web 模块 - **flow-eda-logger** 日志管理模块 - **flow-eda-oauth2** 认证鉴权模块 - **flow-eda-vue** 前端 vue 模块 - **flow-eda-react** 前端 react 模块 ### 主要功能 - 支持用户登录和注册,接口鉴权、数据隔离 - 流程管理、日志管理。菜单简洁,便于用户使用 - 支持绘制任意的流程图,没有繁琐的条件约束,仅针对某些节点的必填参数做了校验 - 各功能节点地位平等,不分头尾,可任意连接绘制,连接数量无上限 - 支持用户自定义参数,使用占位符${}即可获取参数值,由上至下可无限传递,可在任意位置取值 - 支持在绘制流程图时使用常用快捷键对节点进行操作 - 流程图支持导入/导出功能,可以快速的导入绘好的流程并进行修改 - 可实时查看流程运行状态变化,便于用户了解流程运行至哪一步,以及各节点当前的状态、错误信息等 - 支持查看流程实时运行日志功能,可查看实时运行日志和历史运行日志,内含各个节点的输入输出参数 - 支持并发,流程采用并行运行的方式,会自动从流程中找出所有起始节点同时开始运行,数据隔离,互不干扰 - 提供了大量的流程图示例可供参考,每个功能节点都有对应的流程图示例 更多功能,等着你发现! ### 系统架构图 ![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/architecture.png) ### 后端技术栈 | 技术 | 版本 | 说明 | | --------------- | -------- | -------------------- | | Docker | 20.10.14 | 应用容器引擎 | | Docker Compose | 2.5.0 | 应用容器部署工具 | | Spring Boot | 2.6.4 | 微服务框架 | | Mybatis | 3.5.9 | ORM 框架 | | Mysql | 8.0.28 | 数据库 | | Maven | 3.6.3 | 项目构建管理工具 | | PageHelper | 5.3.0 | MyBatis 物理分页插件 | | Lombok | 1.18.22 | 代码插件 | | Nacos | 2.0.4 | 服务注册中心 | | Dubbo | 3.0.7 | 服务远程调用 | | WebSocket | 9.0.58 | 数据推送 | | RabbitMQ | 3.9.15 | 消息队列 | | Spring Security | 5.6.2 | 认证和授权框架 | | Security Oauth2 | 2.3.6 | 认证和授权框架 | ### 项目部署 #### Docker 部署 部署 mysql ```shell script docker run --privileged=true -d -v /root/app/mysql/data/:/var/lib/mysql -v /root/app/mysql/conf.d:/etc/mysql/conf.d -v /root/app/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql ``` 部署 rabbitmq ```shell script docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq -v /root/app/rabbitmq/data:/var/lib/rabbitmq rabbitmq # 开启后台管理页面的插件(可选) docker exec -it rabbitmq bash rabbitmq-plugins enable rabbitmq_management exit ``` 部署 nacos ```shell script docker run -d -e MODE=standalone -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=host.docker.internal -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -e MYSQL_SERVICE_DB_NAME=nacos_config -e JVM_XMS=256m -e JVM_XMX=256m -e JVM_XMN=256m -p 8848:8848 -p 9848:9848 -p 9849:9849 --privileged=true --name nacos nacos/nacos-server ``` 部署 springboot 应用 ```shell script # 打包镜像 sh build.sh # 启动应用 sh start.sh ``` #### docker-compose 部署 ```shell script # 打包镜像 sh build.sh # 创建容器,在`docker-compose.yml`文件路径下执行 docker-compose up -d ``` #### 无注册中心部署 ```shell script # 切换分支 git checkout feign-replace-dubbo # 打包镜像 sh build.sh # 创建容器,在`docker-compose.yml`文件路径下执行 docker-compose up -d ``` ### 待开发项 - [ ] 由于流程是并行运行,而且非阻塞节点运行速度很快,这就导致使用 websocket 在同一个 session 下推送消息会报错,目前采用的是加锁的形式避免问题,后期考虑使用 EMQX 替代 websocket 进行消息推送 - [x] 新增 oauth 模块,用于鉴权认证,整个项目需要实现鉴权和数据隔离 - [x] 考虑到广大开发者朋友们的本地调试便捷性,使用了 Feign 代替 Dubbo,去除注册中心 nacos,减少部署占用,方便本地运行和调试,切换到分支 feign-replace-dubbo 即可 - [ ] 由于部署在线 demo 云服务器的资源限制(穷!),本项目全部线上部署目前占用总内存 4G 左右,导致很多中间件引入进来后服务器资源不够部署,后期考虑等服务器资源足够后,引入 redis 做分布式缓存,将 mysql 进行读写分离,引入 Prometheus+Grafana 实现项目监控,采用 k8s 部署等一系列优化(等买的起新的服务器再说-.-) PS:由于现有的服务器资源已经无法支撑后续开发的项目部署,如果你觉得此项目对您有帮助,可以进行 [捐赠](https://gitee.com/Linxff/flow-eda#%E4%BA%A4%E6%B5%81%E7%BE%A4) ,捐赠所得会全部用于项目开发,感谢! ### 交流群 若需要技术支持或者想进行技术交流,可以扫码添加本人微信或者微信群,也可以进群提开发要求,我会尽可能进行扩展开发。欢迎加群进行技术交流! ![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/weixin.jpg) ![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/group.jpg) \ No newline at end of file +# flow-eda + +### 项目简介 + +flow-eda 项目是一种基于事件驱动的流式低代码编程应用程序,它的主要功能是采用可视化编程,以拖拽节点、连接组合节点的形式来完成流程绘制,达到低代码开发和实现业务编程的目的。 +更多详细内容请查看[项目文档](https://linxfeng.github.io/flow-eda) + +此分支使用 Feign 替代了 Dubbo+Nacos 的技术方案,方便用户本地调试。使用此分支无需安装 Nacos,本地启动应用仅需要 Mysql 数据库和 RabbitMQ 服务即可,各服务之间采用 Feign 进行 http 调用。 + +欢迎各路大神共同参与开发,项目持续扩展完善中 + +#### 项目名称 + +- **flow**: 流程图、流式编程 +- **eda**: 事件驱动应用程序 (Event Driven Application) +- **flow-eda**: 一种基于事件驱动的流式低代码编程应用程序 + +### 项目特点 + +- 整个流程运行引擎全都在后端实现,前端非常轻量,所有的数据、参数、包括输入框等数据全由后端配置提供,前端仅负责根据数据展示。后期开发仅扩展后端功能即可,前端无需更改,自动兼容。 +- 流程运行引擎做到模块化、配置化。后期在进行功能扩展和开发时,仅需要针对新增的功能,新增配置和新增模块功能代码即可,运行引擎自动适配。 +- 后端设计采用微服务架构,各个模块之间按业务功能相互解耦。便于后期二次开发和功能扩展。 +- 代码风格严格按照规范执行,后端代码遵循 Alibaba 规范,代码格式使用 google-java-format 格式化,前端代码使用 Prettier 格式化,消除代码中的标黄警告等,做到编码规范化。 + +### 在线演示 + +作者本人自费租了云服务器,搭建了在线演示 DEMO,开源不易,请珍惜服务器资源,感谢! + +Vue3 版本[在线 demo](http://120.48.9.40:80) + +React 版本[在线 demo](http://120.48.9.40:90) + +喜欢请点点 star,谢谢^.^ + +### 代码仓库 + +- [GitHub](https://github.com/Linxfeng/flow-eda) +- [Gitee](https://gitee.com/Linxff/flow-eda) + +### 项目展示 + +![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/flows.gif) + +![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/logs.gif) + +**Vue3 版本界面:** + +![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/vue3.png) + +**React 版本界面:** + +![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/react.png) + +**编辑器界面:** + +![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/editor.png) + +期待您的参与,项目持续扩展完善中... + +### 项目模块 + +- **flow-eda-common** 公共工具模块 +- **flow-eda-runner** 流程运行引擎模块 +- **flow-eda-web** 后台管理 web 模块 +- **flow-eda-logger** 日志管理模块 +- **flow-eda-oauth2** 认证鉴权模块 +- **flow-eda-vue** 前端 vue 模块 +- **flow-eda-react** 前端 react 模块 + +### 主要功能 + +- 支持用户登录和注册,接口鉴权、数据隔离 +- 流程管理、日志管理。菜单简洁,便于用户使用 +- 支持绘制任意的流程图,没有繁琐的条件约束,仅针对某些节点的必填参数做了校验 +- 各功能节点地位平等,不分头尾,可任意连接绘制,连接数量无上限 +- 支持用户自定义参数,使用占位符${}即可获取参数值,由上至下可无限传递,可在任意位置取值 +- 支持在绘制流程图时使用常用快捷键对节点进行操作 +- 流程图支持导入/导出功能,可以快速的导入绘好的流程并进行修改 +- 可实时查看流程运行状态变化,便于用户了解流程运行至哪一步,以及各节点当前的状态、错误信息等 +- 支持查看流程实时运行日志功能,可查看实时运行日志和历史运行日志,内含各个节点的输入输出参数 +- 支持并发,流程采用并行运行的方式,会自动从流程中找出所有起始节点同时开始运行,数据隔离,互不干扰 +- 提供了大量的流程图示例可供参考,每个功能节点都有对应的流程图示例 + +更多功能,等着你发现! + +### 系统架构图 + +![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/architecture.png) + +### 后端技术栈 + +| 技术 | 版本 | 说明 | +| --------------- | -------- | -------------------- | +| Docker | 20.10.14 | 应用容器引擎 | +| Docker Compose | 2.5.0 | 应用容器部署工具 | +| Spring Boot | 2.6.4 | 微服务框架 | +| Mybatis | 3.5.9 | ORM 框架 | +| Mysql | 8.0.28 | 数据库 | +| Maven | 3.6.3 | 项目构建管理工具 | +| PageHelper | 5.3.0 | MyBatis 物理分页插件 | +| Lombok | 1.18.22 | 代码插件 | +| Nacos | 2.0.4 | 服务注册中心 | +| Dubbo | 3.0.7 | 服务远程调用 | +| WebSocket | 9.0.58 | 数据推送 | +| RabbitMQ | 3.9.15 | 消息队列 | +| Spring Security | 5.6.2 | 认证和授权框架 | +| Security Oauth2 | 2.3.6 | 认证和授权框架 | + +### 项目部署 + +#### Docker 部署 + +部署 mysql + +```shell script +docker run --privileged=true -d -v /root/app/mysql/data/:/var/lib/mysql -v /root/app/mysql/conf.d:/etc/mysql/conf.d -v /root/app/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql +``` + +部署 rabbitmq + +```shell script +docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq -v /root/app/rabbitmq/data:/var/lib/rabbitmq rabbitmq +# 开启后台管理页面的插件(可选) +docker exec -it rabbitmq bash +rabbitmq-plugins enable rabbitmq_management +exit +``` + +部署 nacos + +```shell script +docker run -d -e MODE=standalone -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=host.docker.internal -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -e MYSQL_SERVICE_DB_NAME=nacos_config -e JVM_XMS=256m -e JVM_XMX=256m -e JVM_XMN=256m -p 8848:8848 -p 9848:9848 -p 9849:9849 --privileged=true --name nacos nacos/nacos-server +``` + +部署 springboot 应用 + +```shell script +# 打包镜像 +sh build.sh +# 启动应用 +sh start.sh +``` + +#### docker-compose 部署 + +```shell script +# 打包镜像 +sh build.sh +# 创建容器,在`docker-compose.yml`文件路径下执行 +docker-compose up -d +``` + +#### 无注册中心部署 + +```shell script +# 切换分支 +git checkout feign-replace-dubbo +# 打包镜像 +sh build.sh +# 创建容器,在`docker-compose.yml`文件路径下执行 +docker-compose up -d +``` + +### 待开发项 + +- [ ] 由于流程是并行运行,而且非阻塞节点运行速度很快,这就导致使用 websocket 在同一个 session 下推送消息会报错,目前采用的是加锁的形式避免问题,后期考虑使用 EMQX 替代 websocket 进行消息推送 +- [x] 新增 oauth 模块,用于鉴权认证,整个项目需要实现鉴权和数据隔离 +- [x] 考虑到广大开发者朋友们的本地调试便捷性,使用了 Feign 代替 Dubbo,去除注册中心 nacos,减少部署占用,方便本地运行和调试,切换到分支 feign-replace-dubbo 即可 +- [ ] 由于部署在线 demo 云服务器的资源限制(穷!),本项目全部线上部署目前占用总内存 4G 左右,导致很多中间件引入进来后服务器资源不够部署,后期考虑等服务器资源足够后,引入 redis 做分布式缓存,将 mysql 进行读写分离,引入 Prometheus+Grafana 实现项目监控,采用 k8s 部署等一系列优化(等买的起新的服务器再说-.-) + +PS:由于现有的服务器资源已经无法支撑后续开发的项目部署,如果你觉得此项目对您有帮助,可以进行 [捐赠](https://gitee.com/Linxff/flow-eda#%E4%BA%A4%E6%B5%81%E7%BE%A4) ,捐赠所得会全部用于项目开发,感谢! + +### 交流群 + +若需要技术支持或者想进行技术交流,可以扫码添加本人微信或者微信群,也可以进群提开发要求,我会尽可能进行扩展开发。欢迎加群进行技术交流! + +![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/weixin.jpg) +![image](https://gitee.com/Linxff/flow-eda/raw/master/docs/img/group.jpg) From 4f0beda3fb79416337024d4b22f65b5dd9495ec9 Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Mon, 29 Aug 2022 15:11:34 +0800 Subject: [PATCH 25/28] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=88=86=E6=94=AF?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/flow/eda/web/flow/status/FlowStatusService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusService.java b/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusService.java index 2b3aeee2..da427f43 100644 --- a/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusService.java +++ b/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusService.java @@ -3,8 +3,8 @@ import com.flow.eda.common.utils.CollectionUtil; import com.flow.eda.web.flow.Flow; import com.flow.eda.web.flow.FlowMapper; -import com.flow.eda.web.flow.node.data.FlowDataClient; import com.flow.eda.web.flow.FlowRequest; +import com.flow.eda.web.flow.node.data.FlowDataClient; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; @@ -56,6 +56,6 @@ public void stopRunningFlow() { request.setStatus(Flow.Status.RUNNING); request.setUsername("test"); List flowList = flowMapper.findByRequest(request); - CollectionUtil.forEach(flowList, flow -> flowDataService.stopFlowData(flow.getId())); + CollectionUtil.forEach(flowList, flow -> flowDataClient.stopFlowData(flow.getId())); } } From fff266399926f909311d934aeabbfb475568661d Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 11 Oct 2022 16:05:26 +0800 Subject: [PATCH 26/28] Merge master into current --- docs/version/changelog.md | 9 +++++++++ .../eda/common/dubbo/api/FlowInfoService.java | 0 .../runner/node/subflow/SubFlowRuntime.java | 2 +- .../eda/runner/status/FlowStatusClient.java | 12 ++++++++++++ .../eda/runner/status/FlowStatusService.java | 2 +- .../web/flow/node/data/NodeDataService.java | 8 +++----- .../web/flow/status/FlowInfoServiceImpl.java | 18 ------------------ .../web/flow/status/FlowStatusController.java | 16 ++++++++++++++++ 8 files changed, 42 insertions(+), 25 deletions(-) delete mode 100644 flow-eda-common/src/main/java/com/flow/eda/common/dubbo/api/FlowInfoService.java delete mode 100644 flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowInfoServiceImpl.java diff --git a/docs/version/changelog.md b/docs/version/changelog.md index 569342f6..62733147 100644 --- a/docs/version/changelog.md +++ b/docs/version/changelog.md @@ -8,6 +8,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/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 e69de29b..00000000 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/status/FlowStatusClient.java b/flow-eda-runner/src/main/java/com/flow/eda/runner/status/FlowStatusClient.java index bdf27656..bef3fdf0 100644 --- 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 @@ -1,10 +1,13 @@ 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 { @@ -16,4 +19,13 @@ public interface FlowStatusClient { */ @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 7c760483..653ad7ac 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 @@ -80,7 +80,7 @@ public List getRunningNodes(String flowId) { /** 获取流程节点数据 */ public List getFlowData(String flowId) { - return flowInfoService.getFlowData(flowId); + return flowStatusClient.getFlowData(flowId).getResult(); } /** 清理缓存数据 */ diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/NodeDataService.java b/flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/NodeDataService.java index 363607d9..c8174f01 100644 --- a/flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/NodeDataService.java +++ b/flow-eda-web/src/main/java/com/flow/eda/web/flow/node/data/NodeDataService.java @@ -1,13 +1,11 @@ package com.flow.eda.web.flow.node.data; -import com.flow.eda.common.dubbo.api.FlowDataService; -import com.flow.eda.common.dubbo.model.FlowData; import com.flow.eda.common.exception.InvalidStateException; +import com.flow.eda.common.model.FlowData; import com.flow.eda.common.utils.MergeBuilder; import com.flow.eda.web.flow.FlowService; import com.flow.eda.web.flow.node.type.NodeType; import com.flow.eda.web.flow.node.type.NodeTypeService; -import org.apache.dubbo.config.annotation.DubboReference; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.lang.Nullable; @@ -21,7 +19,7 @@ @Service public class NodeDataService { - @DubboReference private FlowDataService flowDataService; + @Autowired private FlowDataClient flowDataClient; @Autowired private NodeDataMapper nodeDataMapper; @Autowired private NodeTypeService nodeTypeService; @Autowired private FlowService flowService; @@ -53,7 +51,7 @@ public void saveNodeData(List data) { } public void runNodeData(String flowId) { - flowDataService.runFlowData(this.queryNodeData(flowId)); + flowDataClient.runFlowData(this.queryNodeData(flowId)); } public List queryNodeData(String flowId) { diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowInfoServiceImpl.java b/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowInfoServiceImpl.java deleted file mode 100644 index 3b1051b3..00000000 --- a/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowInfoServiceImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.flow.eda.web.flow.status; - -import com.flow.eda.common.dubbo.api.FlowInfoService; -import com.flow.eda.web.flow.FlowService; -import org.apache.dubbo.config.annotation.DubboService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -@DubboService(interfaceClass = FlowInfoService.class) -public class FlowInfoServiceImpl implements FlowInfoService { - @Autowired private FlowService flowService; - - @Override - public String getFlowStatus(String flowId) { - return flowService.findById(flowId).getStatus().name(); - } -} diff --git a/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusController.java b/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusController.java index 44150522..238df4a3 100644 --- a/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusController.java +++ b/flow-eda-web/src/main/java/com/flow/eda/web/flow/status/FlowStatusController.java @@ -1,18 +1,23 @@ package com.flow.eda.web.flow.status; import com.flow.eda.common.http.Result; +import com.flow.eda.common.model.FlowData; import com.flow.eda.web.flow.FlowService; +import com.flow.eda.web.flow.node.data.NodeDataService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + /** 获取流程状态信息接口 */ @RestController @RequestMapping("/api/v1/feign") public class FlowStatusController { @Autowired private FlowService flowService; + @Autowired private NodeDataService nodeDataService; /** * 获取流程状态 @@ -24,4 +29,15 @@ public class FlowStatusController { public Result getFlowStatus(@RequestParam String flowId) { return Result.of(flowService.findById(flowId).getStatus().name()); } + + /** + * 获取流程状态 + * + * @param flowId 流程id + * @return 返回流程当前状态 + */ + @GetMapping("/flow/data") + public Result> getFlowData(@RequestParam String flowId) { + return Result.of(nodeDataService.queryNodeData(flowId)); + } } From bbb96e128754b4af665ad8154d30a540dbf8be4d Mon Sep 17 00:00:00 2001 From: Linxfeng <1538063845@qq.com> Date: Tue, 4 Apr 2023 14:46:19 +0800 Subject: [PATCH 27/28] =?UTF-8?q?feat:=20=E5=9B=9E=E9=80=80=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8D=87=E7=BA=A7=E5=B8=A6=E6=9D=A5=E7=9A=84=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flow-eda-vue/package.json | 11 +++--- flow-eda-vue/src/components/Header.vue | 6 +-- flow-eda-vue/src/components/Tags.vue | 5 ++- .../src/components/editor/NodeDetail.vue | 1 - .../src/components/editor/Toolbar.vue | 2 +- flow-eda-vue/src/main.js | 10 ++--- flow-eda-vue/src/views/Flows.vue | 39 +++++++------------ flow-eda-vue/src/views/Logs.vue | 14 ++----- flow-eda-vue/vite.config.js | 8 ++-- 9 files changed, 36 insertions(+), 60 deletions(-) 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 @@