Dapr云原生应用开发系列7:工作流集成
题记:这篇介绍一个很有意思的东西,Dapr和Logic Apps这样的工作流引擎集成。
Dapr工作流
在1年多前,Dapr的孵化团队搞了一个很有意思的东西:把Dapr和Logic Apps集成起来,实现Dapr内置的工作流引擎。
官方文档:
https://docs.dapr.io/developing-applications/integrations/azure/workflows/
官方博客:
https://cloudblogs.microsoft.com/opensource/2020/05/26/announcing-cloud-native-workflows-dapr-logic-apps/
Logic Apps是Azure上的一个PaaS/SaaS服务,可以认为是一个云端的BPM。官方文档的介绍如下:
Azure 逻辑应用是一个基于云的平台,用于创建和运行集成应用、数据、服务和系统的自动化工作流。借助此平台,可以快速为企业和企业到企业 (B2B) 方案开发高度可缩放的集成解决方案。作为 Azure Integration Services 的成员,Azure 逻辑应用简化了跨云、本地和混合环境连接旧式、新式和一流系统的方式。
由于Logic Apps(通过NuGet)提供了独立的运行时和SDK,所以Dapr可以把其集成进来,获得如下好处:
-
在任意环境运行Logic Apps工作流:本地机器、私有数据中心、Kubernetes集群或者公有云。
-
通过Dapr获得内置的跟踪、度量和mTLS能力
-
为你的工作流提供gRPC和HTTP端点
-
利用Dapr的绑定或发布订阅事件来触发工作流执行
-
通过调用Dapr的状态存储、发布消息等功能来编排复杂的工作流场景
当然微软目前主要是通过跨云产品Azure Arc来把Azure上的很多应用服务引入到其他环境,见:
https://azure.microsoft.com/en-us/blog/build-cloudnative-applications-that-run-anywhere/
实现原理
集成的基本原理其实很简单,把Logic Apps运行时包装到一个实现Dapr规范接口的gRPC Server,并以Dapr应用的方式来运行:
然后把Logic Apps的工作流定义json文件加载进去,通过Dapr的服务调用、绑定或者发布订阅来“触发”这些工作流。通过代码可知,“触发”最终还是通过http trigger的方式来启动工作流实例。
正因为这种巧妙的架构,加上Dapr强大的能力,我才可以很简单的就为其实现了发布订阅触发工作流的能力(一开始的版本仅支持服务调用和绑定触发)。
支持发布订阅的版本的代码见:
https://github.com/heavenwing/dapr-workflows/tree/SupportPubSub
你可以Clone代码到本地,然后根据README的说明来尝试。也可以把这个工作流引擎集成到你的Dapr应用程序当中,实现灵活的业务流程处理。
更多思考
理论上,我们可以使用这样的架构,把任何工作流引擎集成到Dapr当中,只要这个引擎的运行时可以被一个外壳应用程序包装。
另外,大家可能会问,那么我如何得到工作流订阅json文件呢?如果你对Logic Apps的工作流规范很熟悉,尽可以纯手写json;但其实最简单的方式是到Azure Portal里面新建一个Logic Apps,直接利用它的设计器来获得工作流定义json文件,我的代码中的workflow3.json就是这样得到的。
Logic Apps工作流语言参考文档在:
https://docs.microsoft.com/zh-cn/azure/logic-apps/logic-apps-workflow-definition-language