題記:這篇介紹一個很有意思的東西,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