最近一直在學習微服務相關的技術。微服務架構已成為構建雲原生應用程序的標准,並且可以預見,到2022年,將有90%的新應用程序采用微服務架構。微服務架構提供了令人信服的好處,包括可伸縮性,松散的服務耦合和獨立部署,但是這種方法的成本很高,需要了解和熟練掌握分布式系統。學習過程中發現了一個開源的分布式應用運行時:Dapr (https://dapr.io/)
構建事件驅動,無狀態和有狀態應用程序
比如,當架構一個由多個服務組成的電子商務系統時,你可能會想到用一個有狀態的Actor來表示購物車服務,並在支付與物流服務調用無狀態函數。開發此系統可能需要使用多種語言、不同的開發框架和不同的平台,以及和第三方服務集成。理解與管理如此復雜的技術棧,開發人員可能無法為企業創造更多的價值。
為了使用所有開發人員能夠使用任何語言和任何框架輕松地構建便攜式微服務應用程序,無論是開發新項目還是遷移現有代碼,我非常高興的給大家分享並介紹這個分布式應用程序運行時 Dapr。
Dapr 介紹
Github: https://github.com/dapr/dapr
Dapr是一種可移植的,事件驅動的,無服務器運行時,用於構建跨雲和邊緣的分布式應用程序。
Dapr - Any language, any framework, anywhere
不過需要注意的是Dapr目前正處於Alpha階段。在v1.0穩定版本發布之前,建議不要用於生產環境。
Dapr提供了最常用的構建塊(官方名詞:building blocks):
- 服務調用 - 彈性的服務到服務調用使方法調用(包括重試)可以在支持的托管環境中運行的任何遠程服務上進行。
- 狀態管理 - 通過對鍵/值對的狀態管理,可以輕松地編寫長期運行,高可用的有狀態服務以及同一應用程序中的無狀態服務。狀態存儲是可插拔的,並且可以包括Azure Cosmos或Redis,以及組件路線圖上的其他內容(例如AWS DynamoDB)。
- 在服務之間發布和訂閱消息傳遞 - 采用事件驅動的體系結構解決服務之間發布事件和訂閱主題,以簡化水平可伸縮性並使它們能夠應對故障。
- 事件驅動的資源綁定 - 資源綁定和觸發器通過在事件驅動的體系結構上進一步構建規模,從而通過從任何外部資源(例如數據庫,隊列,文件系統,blob存儲,webhooks等)接收事件或向其發送事件來實現規模和彈性。例如,可以觸發代碼通過Azure EventHub服務上的消息,然后將數據寫入Azure CosmosDB。
- 虛擬atcor - 種無狀態和有狀態對象的模式,通過方法和狀態封裝使並發變得簡單。 Dapr在其虛擬actor運行時中提供了許多功能,包括並發,狀態,用於actor激活/停用的生命周期管理以及計時器和提醒以喚醒actor。
- 服務間的分布式追蹤 - 使用W3C Trace Context標准輕松診斷和觀察生產中的服務間調用,並將事件推送到跟蹤和監視系統。
用於可移植性和可擴展性的標准API
那么,您如何使用這些Dapr構建塊?
例如,假設您正在已部署到Kubernetes群集中的微服務應用程序中使用Azure Functions,並且您希望利用 pub / sub 模式在服務之間發送消息。目前,Azure Functions 尚未內置此功能,但是通過在http上使用Dapr pub / sub 構建塊,可以輕松添加此新功能。
此外,Dapr pub / sub 構建塊具有可插入的組件模型,這意味着您可以動態選擇不同的實現方式來發送消息,而無需更改任何代碼。例如,您可以根據自己的喜好選擇Redis,Kafka或Azure Service Bus發布/訂閱Dapr組件。而且在兩種情況下,代碼都保持不變,包括使用標准API在不同支持的基礎架構之間可移植。
為了同時實現可移植性和與現有代碼的輕松集成,Dapr通過http或gRPC提供了標准API。與pub / sub示例保持一致,下面的節點代碼顯示如何使用“ http//<myappaddress>/dapr/ subscribe”端點訂閱名為“A”和“B”的主題,然后在何時通知您的應用程序消息將發布到這些主題。
為了進行比較,這是使用從ASP.NET Core CreateWebHostBuilder()調用的UseStartup()處理程序,以C#編寫的相同代碼。
向訂閱了這些主題的服務發布事件就像使用主題名稱和有效負載調用Dapr本地http publish API一樣簡單。下面的示例節點代碼顯示了如何使用Dapr發布API(在本地端口3500上),也可以使用curl命令來完成此操作:
如這些示例所示,在您的服務中使用Dapr不需要獲取編譯時間依賴性,僅需簡單地使用消息主體編寫URL即可。
Sidecar架構和支持的基礎架構
Dapr將其API作為Sidecar體系結構(容器或進程)公開,不需要應用程序代碼包含任何Dapr運行時代碼。這使得與Dapr的集成易於與其他運行時集成,並提供了應用邏輯的分離,從而提高了可支持性。
在Kubernetes這樣的容器托管環境中,Dapr可以作為邊車容器運行,而應用程序容器位於同一容器中:
Dapr的CLI可以使入門變得容易,並包括支持在開發機器,任何Kubernetes集群(包括minikube)以及其他基礎設施平台(如IoT Edge)和路線圖上的Service Fabric上本地運行。開始使用Dapr,如下:
dapr init (for local deployment) dapr init --kubernetes (for Kubernetes deployment)
開發人員語言SDK和框架
為了使Dapr對於不同的語言更加方便,它還包括針對Go,Java,JavaScript,.NET和Python的語言特定的SDK。
這些SDK通過類型化的語言API(而不是調用http / gRPC API)公開了Dapr構建塊中的功能,例如保存狀態,發布事件或創建actor。這使開發人員可以使用他們選擇的語言編寫無狀態和有狀態功能以及參與者的組合。並且由於這些SDK共享Dapr運行時,您甚至可以獲得跨語言的actor和功能支持!
此外,Dapr還可以與任何開發人員框架集成。例如,在Dapr .NET SDK中,您將找到ASP.NET Core集成,該集成帶來了可響應其他服務的發布/訂閱事件的狀態路由控制器,從而使ASP.NET Core成為構建微服務Web應用程序的更好框架。
Dapr 相關資源
- Samples (Dapr 使用示例) https://github.com/dapr/samples
- Docs (Dapr文檔) https://github.com/dapr/docs
- Dotnet-sdk (Dapr SDK for .NetCore) https://github.com/dapr/dotnet-sdk
- Java-sdk (Dapr SDK for Java) https://github.com/dapr/java-sdk
- Go-sdk (Dapr SDK for Go) https://github.com/dapr/go-sdk
- Python-sdk (Dapr SDK for Python) https://github.com/dapr/python-sdk
- JS-sdk (Dapr SDK for JavaScript) https://github.com/dapr/js-sdk