Dapr 相關的文章我已經寫了20多篇了[1] 。 當向其他人推薦Dapr 的時候,需要回答的一個問題就是:
Dapr 似乎並不是特別令人印象深刻。它提供了一組"構建塊",解決了與構建微服務相關的幾個挑戰。這些構建基塊包括服務到服務呼叫、釋出訂閱訊息傳遞、狀態管理、可觀察性、機密管理和Actor 程式設計模型。 但是,我們不是已經有了所有這些的解決方案嗎?
是的 任何構建微服務應用程式的人都已經不得不處理所有這些問題,我們看到這些人 提到的工具和框架對於減輕痛苦有很長的路要走。 我認為Dapr提供了一些獨特的東西。為了說明這一點,我下面將選擇一個最常見的構建塊 - 服務到服務呼叫,以強調Dapr如何在您已經在使用的內容之上提供附加值。
當一個微服務需要呼叫另一個微服務時,需要發生幾件事。
首先,我們需要服務發現 - 找到我們正在與之通訊的服務地址。當然,Kubernetes通過內建的DNS使這變得非常輕鬆。但是,開發人員在其開發計算機上本地執行微服務的情況也很常見。在這種情況下,每個微服務都位於特定埠號上的 localhost,這要求您具有一些替代機制,以便在本地執行時指向正確的服務。使用Dapr,無論您是在"自託管"[2]模式下執行(直接在您的計算機上)還是在Kubernetes上執行,您都可以按名稱對目標服務進行定址,服務發現這項富有挑戰性的工作交給Dapr 的可插拔的服務發現元件來完成。
其次,在微服務之間進行通訊時,如果存在暫時性網路問題請務必重試[3]。當然,這可以通過像Polly[4]這樣的庫來自己實現,但這需要每個人都記得使用它,很有可能你在微服務中發現了一個錯誤,該錯誤是由於忘記實現重試而引起的。那麼我們使用Dapr,這只是一個內建功能。
第三,微服務採用零信任的安全原則,保護微服務之間的通訊非常重要。通常應使用 mTLS 對通訊進行加密,並且應使用身份驗證來驗證呼叫方是否已獲得授權。一個被廣泛認可的最佳實踐是使用相互 TLS,但正確配置可能會很痛苦,並且在開發時本地執行時通常會妨礙您。使用 Dapr,所有服務到服務的通訊都會使用 mTLS 自動加密[5],並且證書會自動迴圈,這為你帶走了一個巨大的心智負擔。
第四,安全性的另一個方面是管理允許哪些微服務相互呼叫。例如,微服務 A 可能被允許與微服務 B 通訊,但反之亦然。推出自己的框架來配置這樣的東西可能會很痛苦,如果你不是安全專家,很容易出錯。服務網格可以為 Kubernetes 叢集提供這種行為。Dapr還可以通過訪問控制列表[6]提供相同的訪問限制,這些列表易於配置,甚至可以在"自託管"模式而不是Kubernetes中執行時工作。
第五,如果您具有分散式跟蹤和指標收集功能,以便您瞭解微服務之間的通訊,這也是非常有價值。在Azure 通過 Application Insights 提供了此功能,但同樣,如果你在本地執行,你就用不了這項服務,而且據我的經驗在所有服務上正確配置它時都遇到各種問題。使用 Dapr,可觀察性[7]是執行時的另一個內建功能。它使用開放的標準,如OpenTelemetry和W3C跟蹤,使它非常容易與現有工具整合,本地開發可以選擇zipkin等相容的解決方案。
最後,我們看到gRPC[8]作為基於HTTP的微服務API的替代品的興起,因為它的效能更高。在微服務環境中從 HTTP 遷移到 gRPC 可能很棘手,因為您需要同時升級客戶端和伺服器,或者提供一個同時公開兩種協議的介面進行遷移的相容。Dapr再次可以幫助我們 - 允許gRPC或HTTP用於服務到服務呼叫[9],甚至允許HTTP呼叫方使用gRPC服務,Dapr的Sidecar和Sidecar 之間的所有通訊都是通過gRPC。
因此,正如您所看到的,服務呼叫的"簡單"任務有很多,Dapr為您提供了開箱即用的非常全面的解決方案。 Dapr 還提供了很多開箱即用的解決方案,看到這裡你相信我了--我們非常需要Dapr 這樣的解決方案。
相關參考:
[1]Dapr 文章: https://www.cnblogs.com/shanyou/category/1931296.html
[2]自託管:https://docs.dapr.io/operations/hosting/self-hosted/
[3]重試模式:https://docs.microsoft.com/zh-cn/azure/architecture/patterns/retry
[4]Polly: https://github.com/App-vNext/Polly
[5]自動加密: https://docs.dapr.io/concepts/security-concept/#sidecar-to-sidecar-communication
[6]訪問控制列表:https://docs.dapr.io/operations/configuration/invoke-allowlist
[7]可觀測性:https://docs.dapr.io/concepts/observability-concept/
[8]gRPC: https://grpc.io/
[9]允許gRPC或HTTP用於服務到服務呼叫: https://docs.dapr.io/developing-applications/building-blocks/service-invocation/howto-invoke-services-grpc/