Dapr云原生应用开发系列7:工作流集成
題記:這篇介紹一個很有意思的東西,Dapr和Logic Apps這樣的工作流引擎集成。
Dapr工作流
在1年多前,Dapr的孵化團隊搞了一個很有意思的東西:把Dapr和Logic Apps集成起來,實現(xiàn)Dapr內(nèi)置的工作流引擎。
官方文檔:
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服務(wù),可以認為是一個云端的BPM。官方文檔的介紹如下:
Azure 邏輯應(yīng)用是一個基于云的平臺,用于創(chuàng)建和運行集成應(yīng)用、數(shù)據(jù)、服務(wù)和系統(tǒng)的自動化工作流。借助此平臺,可以快速為企業(yè)和企業(yè)到企業(yè) (B2B) 方案開發(fā)高度可縮放的集成解決方案。作為 Azure Integration Services 的成員,Azure 邏輯應(yīng)用簡化了跨云、本地和混合環(huán)境連接舊式、新式和一流系統(tǒng)的方式。
由于Logic Apps(通過NuGet)提供了獨立的運行時和SDK,所以Dapr可以把其集成進來,獲得如下好處:
在任意環(huán)境運行Logic Apps工作流:本地機器、私有數(shù)據(jù)中心、Kubernetes集群或者公有云。
通過Dapr獲得內(nèi)置的跟蹤、度量和mTLS能力
為你的工作流提供gRPC和HTTP端點
利用Dapr的綁定或發(fā)布訂閱事件來觸發(fā)工作流執(zhí)行
通過調(diào)用Dapr的狀態(tài)存儲、發(fā)布消息等功能來編排復(fù)雜的工作流場景
當然微軟目前主要是通過跨云產(chǎn)品Azure Arc來把Azure上的很多應(yīng)用服務(wù)引入到其他環(huán)境,見:
https://azure.microsoft.com/en-us/blog/build-cloudnative-applications-that-run-anywhere/
實現(xiàn)原理
集成的基本原理其實很簡單,把Logic Apps運行時包裝到一個實現(xiàn)Dapr規(guī)范接口的gRPC Server,并以Dapr應(yīng)用的方式來運行:
然后把Logic Apps的工作流定義json文件加載進去,通過Dapr的服務(wù)調(diào)用、綁定或者發(fā)布訂閱來“觸發(fā)”這些工作流。通過代碼可知,“觸發(fā)”最終還是通過http trigger的方式來啟動工作流實例。
正因為這種巧妙的架構(gòu),加上Dapr強大的能力,我才可以很簡單的就為其實現(xiàn)了發(fā)布訂閱觸發(fā)工作流的能力(一開始的版本僅支持服務(wù)調(diào)用和綁定觸發(fā))。
支持發(fā)布訂閱的版本的代碼見:
https://github.com/heavenwing/dapr-workflows/tree/SupportPubSub
你可以Clone代碼到本地,然后根據(jù)README的說明來嘗試。也可以把這個工作流引擎集成到你的Dapr應(yīng)用程序當中,實現(xiàn)靈活的業(yè)務(wù)流程處理。
更多思考
理論上,我們可以使用這樣的架構(gòu),把任何工作流引擎集成到Dapr當中,只要這個引擎的運行時可以被一個外殼應(yīng)用程序包裝。
另外,大家可能會問,那么我如何得到工作流訂閱json文件呢?如果你對Logic Apps的工作流規(guī)范很熟悉,盡可以純手寫json;但其實最簡單的方式是到Azure Portal里面新建一個Logic Apps,直接利用它的設(shè)計器來獲得工作流定義json文件,我的代碼中的workflow3.json就是這樣得到的。
Logic Apps工作流語言參考文檔在:
https://docs.microsoft.com/zh-cn/azure/logic-apps/logic-apps-workflow-definition-language
總結(jié)
以上是生活随笔為你收集整理的Dapr云原生应用开发系列7:工作流集成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解答网友提问 | 使用VS2022快速生
- 下一篇: 有奖问题征集|向大咖Scott 发问,好