.NET 5 开源工作流框架elsa技术研究

今天假期第一天,研究了.NET 5开源工作流框架elsa,现在分享给大家。

一、框架简介

elsa是一个开源的.NET Standard 工作流框架,官方网站://elsa-workflows.github.io/elsa-core/

以下列出了Elsa的一些关键功能:

  • 小巧,简单,快速。该库非常精简易用,同时快速执行并且易于通过自定义活动进行扩展。
  • 调用任意工作流程,就好像它们是我应用程序的功能一样。
  • 触发事件,使相应的工作流程基于该事件自动启动/恢复。
  • 支持长期运行的工作流程。当工作流程执行并遇到需要进行例如用户输入后,工作流将停止,保留并耗尽内存,直到可以恢复为止。这可能是几秒钟后,几分钟,几小时,几天甚至几年的时间。
  • 将工作流与特定于应用程序的数据相关联。这是长时间运行的工作流程的关键要求。
  • 以基于文件的格式存储工作流,因此我可以使其成为源代码管理的一部分。
  • 当我不想让工作流成为源代码管理的一部分时,可以将其存储在数据库中。
  • 基于Web版本的流程设计器。无论是将工作流存储在文件系统还是数据库中,还是将设计器在线托管还是仅在本地计算机上托管,都需要能够在线编辑工作流。
  • 使用表达式配置工作流程活动。通常,工作流处理的信息本质上是动态的,活动需要一种与该信息进行交互的方式。工作流表达式支持这类场景。
  • 可通过特定于应用程序的活动,支持自定义存储和脚本引擎进行扩展。
  • 调用其他工作流程。这允许从各种工作流程中调用可重用的应用程序逻辑。就像从C#调用通用功能一样。
  • 查看和分析执行的工作流程实例。查看工作流采用的路径,运行时状态,发生故障的位置并补偿发生故障的工作流。
  • 支持Web的工作流设计器嵌入我自己的仪表板应用程序中。可以选择创建一个运行所有应用程序逻辑的工作流主机,还可以选择在单个微服务中托管工作流运行时(允许进行编排和编排)。
  • 关注点分离:工作流核心库,运行时和设计器设计上完全分离。即当工作流宿主不应该依赖于基于Web的设计器时。例如,这允许您实施基于桌面的设计器,或者根本不使用设计器,而仅使用YAML文件。最后,主机只需要工作流程定义和对持久性存储的访问。
  • 支持本地或云端管理,因为Elsa只是您从应用程序引用的一组NuGet软件包。

二、产品主要功能

   1. 可视化的工作流编辑器

    Elsa带有一个独立的,可重复使用的HTML5工作流设计器Web组件,您可以将其嵌入自己的HTML网页中。设计器完全在客户端运行,并具有丰富的JavaScript API,该API可让您定义自定义插件以扩展其功能。

    

   2. Dashboard 看板

   Elsa看板使您能够定义工作流程定义并检查执行的工作流程。要设计工作流程,只需右键单击画布,从活动选择器中选择一个活动,对其进行配置,然后拖动多个活动之间的连接以创建从简单的短期运行的工作流程到高级的长期运行的工作流程的流程。

  3. 支持长期和短期的工作流模式

   Elsa提供了短期和长期工作流程。可以理解为简单的和复杂的流程设计

   例如,当您需要实现业务规则引擎时,短时运行的工作流程非常有用,在该流程中,如果工作流程是一个接收输入并返回结果的函数,则可以从应用程序中调用它。

   长时间运行的工作流能够轻松地实现涉及人和机器的复杂过程。长期运行过程的典型示例是文档批准工作流,其中某些文档的审阅过程涉及多方。这样的工作流程可能涉及计时器,电子邮件,提醒,HTTP请求,用户操作等。

 4. 丰富的工作流活动

     基本元语:是低级的技术活动。

  • SetVariable

      控制流:控制流活动提供对过程的控制。例如,Fork活动会将工作流程分为两个或多个执行分支。

  • ForEach
  • Fork
  • IfElse
  • Join
  • Switch
  • While

     工作流活动:活动代表工作流程中的单个步骤。开箱即用的Elsa NuGet套件套件为您提供了一系列不错的活动,主要包含以下工作流活动

     工作流程:工作流类别中的活动与工作流级别的功能相关,例如相关性和信令。

  • Correlate
  • Finish
  • Signaled
  • Start
  • TriggerSignal
  • TriggerWorkflow

      控制台活动:在实施带有工作流的基于控制台的应用程序时,控制台活动非常有用。

  • ReadLine
  • WriteLine

      DropBox活动:Dropbox活动可帮助实现与Dropbox API集成。

  • SaveToDropbox

      电子邮件活动:电子邮件活动允许您使用SMTP发送电子邮件。

  • SendEmail

       HTTP活动:能够实现发送传出HTTP请求并响应传入HTTP请求的工作流,非常适合与基于外部Web的API集成。

  • ReceiveHttpRequest
  • SendHttpRequest
  • WriteHttpResponse

      定时器活动:定时器活动可以基于某些基于时间的事件(例如CRON表达式,常规计时器)或在将来的特定时间触发工作流。

  • CronEvent
  • InstantEvent
  • TimerEvent

       User Task:用户任务事件是用户自定义配置的活动,用户可以执行一系列可能的操作。每个动作对应于活动的结果。用户执行任何这些操作后,工作流将沿适当的路径恢复。这里的想法是您的应用程序将使用选定的操作触发工作流。

          例如,这可以表示为一组简单的按钮。由您的应用程序决定如何呈现这些操作。

    5. 版本控制

      每个工作流程定义都是版本化的。发布工作流程的新版本时,其版本号会增加。现有工作流程实例仍将使用工作流程定义的先前版本,但新工作流程将使用最新版本。   

    6. 持久化支持

  • CosmosDB (DocumentDB)

  • Entity Framework Core:各类关系型数据库,支持SQLServer

  • Memory:Non-persistent, use only for tests and/or short-lived workflows.

  • MongoDB

  • YesSQL

    7. 表达式

             工作流活动可以使用表达式,这些表达式可以炸运行时执行,使用表达式可以引用其他活动产生的值。Elsa支持以下三种类似的表达式:

             文字表达式:

             文字表达式不是一个真正的解释,当你需要设置,无需运行时计算活动属性的值才会被使用。

             JavaScript表达式:

             当你需要计算一些数值或读取工作流程中的过程值时通常使用JavaScript表达式。

             液体表达式(这个名字很奇怪,目前还在研究中)

             当你需要创建一个HTTP请求,HTTP响应的计算通常使用流式表达式,或例如其中主体被标记使用液体发送电子邮件时。

    三、产品扩展能力

Elsa的最重要和最强大的功能之一就是其可扩展性。

1. 工作流活动
许多过程是特定业务领域的,并且能够使用代表业务领域的特定语言的一组活动来创建工作流是一项强大的功能。

用特定领域的活动扩展Elsa非常简单。只需实现一个继承自C#的C#类,Activity并在服务容器中注册它,就可以使用了。活动将在工作流设计器中自动变为可用,并且默认情况下其所有公共属性都是可编辑的。

2. 持久化扩展
Elsa附带了许多持久性提供程序,例如内存,EF Core,MongoDB,YesSQL和CosmosDB。尽管这些提供程序应满足最常见的需求,但当然不限于这些。实现IWorkflowDefinitionStore为工作流定义提供定制存储,并实现IWorkflowInstanceStore为工作流实例提供定制存储。请注意,用户可以混合和匹配,这意味着您可以例如将EntityFrameworkCoreWorkflowDefinitionStorefor用于工作流定义“。

3. JavaScript函数
JavaScript表达式附带了一些您可能经常使用的有用的JavaScript函数。例如,它允许您从工作流程中读取变量并引用活动输出值。但是,如果您发现自己需要其他功能,则可以很容易地从您自己的应用程序中扩展功能集。

4. 液体表达式
Liquid表达式还附带了一些可能经常使用的有用过滤器。例如,它允许您从工作流程中读取变量并引用活动输出值。但是,如果您发现自己需要其他功能,可以很容易地从您自己的应用程序中扩展过滤器集。

5. 表达式解析执行
也许JavaScript和Liquid还不够好,可以使用用C#,VBScript或Python编写表达式。只需实现您自己的版本IExpressionEvaluator,即可在服务容器中注册它,即可在任何活动中使用自定义评估程序语法。

  四、与Windows Workflow Foundation对比
    目前,微软已经停止更新发展 Windows Workflow Foundation,同时技术社区也在努力做WF to .NET Standard, 但是elsa有以下2点优势:

  • Elsa intrinsically supports triggering events that starts new workflows and resumes halted workflow instances in an easy to use manner. E.g. workflowHost.TriggerWorkflowAsync(“HttpRequestTrigger”);”will start and resume all workflows that either start with or are halted on the HttpRequestTrigger.Elsa has a web-based workflow designer. I once worked on a project for a customer that was building a huge SaaS platform.
  • One of the requirements was to provide a workflow engine and a web-based editor.Although there are commercial workflow libraries and editors out there, the business model required open-source software. We used WF and the re-hosted Workflow Designer. It worked, but it wasn’t great.

  五、源代码编译构建

        项目源代码地址://github.com/elsa-workflows/elsa-core

        通过VS2019,使用克隆的方式,将代码克隆到本地编译构建。

        

       

   项目使用了Angular,在调试运行前,本地需要完成NPM包安装和JS 编译,所以本地需要先安装NodeJS

   切换到XX\src\dashboard\Elsa.Dashboard\Theme\argon-dashboard, 执行NPM Install       

   安装过程中,涉及到Python相关的组件和环境变量配置,所以可能会安装失败,出现异常:

         checking for Python executable “python2” in the PATH Can’t find Python executable “python2.7”, you can set the PYTHON env variable.

         此时,先删除delete node_modules文件夹, 然后执行: npm install --global windows-build-tools

         python组件安装完成后,执行以下命令:

npm config set python C:\Users\zhougq\.windows-build-tools\python27\python.exe
 
npm install

  

     NPM Install成功后,在目录src\dashboard\Elsa.Dashboard\Theme\argon-dashboard下执行以下指令:gulp build

     

       此时elsa Dashboard前端项目全部编译通过。

接下来可以通过:

VS:Elsa.Dashboard.Web 项目工程调式

也可以在Elsa.Dashboard.Web文件件下运行dotnet run

浏览器中直接访问://localhost:port/elsa/home,就可以使用了elsa了。

 

以上是对elsa的初步研究,分享给大家。

 

周国庆

2021/1/1