什么是Dapr

Dapr 是一個可移植的、事件驅動的運行時,可運行在云平臺或邊緣計算中,支持多種編程語言和開發框架,
上面是官方對Dapr的介紹,有點難以理解,大白話可以理解為:Dapr是一個運行時,支持在云平臺中運行多種語言的應用程式,運行時我們都理解,是應用程式運行依賴的環境,像Java運行時,Python運行時,.NET運行時等,為應用程式的運行提供了環境:垃圾回收,執行緒管理等,Dapr同樣是一個運行時,那他為我們解決了什么呢?我們先來談下現在軟體開發的一些難點,
1.為了承載大并發我們需要用很多中間件,比如rabbitmq,kafka
2.服務間呼叫會用HTTP或者RPC等不同通信方式
3.保存一些狀態資料可能用Redis或者資料庫等不同存盤
4.保存一些密鑰資訊可能用Azure Keyvault或者K8S Secrets等不同密鑰存盤
...
為了解決這些問題,很多開發人員無法專注業務,必須了解很多架構方面的東西,往往很多開發人員希望專注業務,希望平臺提供好這些基礎設施,不需要花費大量的時間在部署中間件,學習中間件上,并且為了解決這些問題代碼中需要集成很多中間件,對代碼有很強的侵入性,這就是Dapr所要解決的, Dapr 將構建微服務應用的 最佳實踐 設計成開放、獨立和模塊化的方式,讓你能夠使用任意的開發語言和框架構建可移植的應用程式, 每個構建塊都是完全獨立的,您可以采用其中一個、多個或全部來構建你的應用,為了解決這些問題,Dapr引入了Sidecar架構,
Sidecar架構
Dapr中,每個服務,每個運行的服務都會運行一個Sidecar,而Dapr的服務間通信,服務與各中間件的通信都通過Sidecar來通信,而我們的代碼里只需要呼叫Dapr提供訪問Sidecar的API,即可完成服務間通信,狀態存盤,服務監控等功能,完美地解決了傳統架構中的代碼侵入性問題,

作業原理
Dapr提供了七大核心組件來支撐應用程式的無侵入式分布式開發,
1.服務呼叫
通過服務呼叫,應用程式可以使用 gRPC 或 HTTP 這樣的標準協議來發現并可靠地與其他應用程式通信,
Dapr 采用邊車(Sidecar)、去中心化的架構, 要使用 Dapr 來呼叫應用程式,請在任意 Dapr 實體上使用 invoke 這個API, sidecar 編程模型鼓勵每個應用程式與自己的 Dapr 實體對話, Dapr 實體會相互發現并進行通信,

-
服務 A 對服務 B 發起HTTP/gRPC的呼叫,
-
Dapr通過服務名決議組件發現了運行在此Dapr環境中的服務B
-
Dapr 將訊息轉發至服務 B的 Dapr 邊車
注: Dapr 邊車之間的所有呼叫考慮到性能都優先使用 gRPC, 僅服務與 Dapr 邊車之間的呼叫可以是 HTTP 或 gRPC
-
服務 B的 Dapr 邊車將請求轉發至服務 B 上的特定端點 (或方法) , 服務 B 隨后運行其業務邏輯代碼,
-
服務 B 發送回應給服務 A, 回應將轉至服務 B 的邊車,
-
Dapr 將訊息轉發至服務 A 的 Dapr 邊車,
-
服務 A 接收回應
通過以上步驟我們可以發現,我們只需要呼叫呼叫自己的sidecar的invoke方法來呼叫其他服務即可,比如
localhost:3500/v1.0/invoke/nodeapp.production/method/neworder
2.狀態管理
當使用狀態管理時,你的應用程式可以利用一些自己構建會很復雜,容易出錯的功能,比如:
- 分布式并發和資料一致性
- 批量CRUD 操作
你的應用程式可以使用Dapr的狀態管理API,使用狀態存盤組件保存和讀取鍵/值對,如下圖所示, 例如,通過使用HTTP POST可以保存鍵/值對,通過使用HTTP GET可以讀取一個鍵并回傳它的值,
而Dapr的狀態存盤組件支持可插拔,可以不用改代碼而隨意替換,

3.發布訂閱
發布 / 訂閱模式 允許微服務使用訊息相互通信, 生產者或發布者 將訊息發送至 主題(Topic) ,并且不知道接收訊息的應用程式, 這涉及將它們寫入一個輸入頻道, 同樣,一個 消費者 將訂閱該主題并收到它的訊息,并且不知道什么應用程式生產了這些訊息, 這涉及從輸出頻道接收訊息, 中間訊息代理(intermediary message broker)負責將每條訊息從輸入頻道復制到所有對此訊息感興趣的訂閱者的輸出頻道, 當您需要將微服務解偶時,此模式特別有用,
Dapr 中的發布/訂閱 API 提供至少一次(at-least-once)的保證,并與各種訊息代理和佇列系統集成, 您的服務所使用的特定實作是可插拔的,并被配置為運行時的 Dapr Pub/Sub 組件, 這種方法消除了您服務的依賴性,從而使您的服務可以更便攜,更靈活地適應更改,

4.資源系結
使用系結,您可以使用來自外部系統的事件或與外部系統的介面來觸發應用程式, 此構建塊為您和您的代碼提供了若干益處 :
- 除去連接到訊息傳遞系統 ( 如佇列和訊息總線 ) 并進行輪詢的復雜性
- 聚焦于業務邏輯,而不是如何與系統互動的實作細節
- 使代碼不受 SDK 或庫的跟蹤
- 處理重試和故障恢復
- 在運行時在系結之間切換
- 構建具有特定于環境的系結的可移植應用程式,不需要進行代碼更改
5.Actors
actor 模式 闡述了 Actors 為最低級別的“計算單元”, 換句話說,您將代碼寫入獨立單元 ( 稱為actor) ,該單元接收訊息并一次處理訊息,而不進行任何型別的并行或執行緒處理,
當代碼處理一條訊息時,它可以向其他參與者發送一潭訓多條訊息,或者創建新的 Actors, 底層 運行時 將管理每個 actor 的運行方式,時機和位置,并在 Actors 之間傳遞訊息,

6.可觀測性
Dapr 使用 Zipkin 協議進行分布式跟蹤和指標收集, 由于 Zipkin 協議無處不在,許多后端被開箱即用,例如 Stackdriver、 Zipkin、 New Relic 等, 與 OpenTelemetry 收藏器組合,Dapr 可以匯出跟蹤到許多其他后端,包括但不局限于 Azure Monitor Datadog, Instanca, Jaeger, and SignalFX

Dapr 將 HTTP/GRPC Middleware 添加到 Dapr sidecar, Middleware 攔截所有 Dapr 和應用程式流量,并自動注入關聯ID以跟蹤分布式事務, 此設計有如下優點:
- 無需代碼檢測, 所有流量都會自動跟蹤可配置的跟蹤級別,
- 跨微服務的一致跟蹤行為, 跟蹤是在 Dapr sidecar 上進行配置和管理的,因此它可以在服務之間保持一致,這些服務由不同的團隊提供,并可能以不同的編程語言撰寫,
- 可配置和可擴展, 通過利用 Zipkin API 和 OpenTelemetry 收集器,可以將 Dapr 追蹤配置為與流行的追蹤后端配合使用,包括客戶可能有的自定義后端,
- 可以同時定義和啟用多個Exporter,
7.Secrets
應用程式通常會通過使用專用的密鑰存盤來秘密存盤敏感資訊,如連接字串、密鑰和用于與資料庫、服務和外部系統進行驗證的令牌,
通常這需要建立一個密鑰存盤,如Azure Key Vault、Hashicorp 保險庫和其他倉庫,并在那里存盤應用程式級別的密鑰, 要訪問這些密鑰存盤,應用程式需要匯入密鑰存盤SDK,并使用它訪問這些密鑰, 這可能需要相當數量的模板代碼,這些代碼與應用的實際業務領域無關,因此在多云場景中,可能會使用不同廠商特定的密鑰存盤,這就成為一個更大的挑戰,
讓開發人員在任何地方更容易消耗應用程式密鑰, Dapr 有一個專用的密鑰構建塊 API ,允許開發人員從一個密鑰存盤獲得密鑰,
使用 Dapr 的密鑰存盤構建塊通常涉及以下內容:
- 設定一個特定的密鑰存盤解決方案的組件,
- 在應用程式代碼中使用 Dapr 密鑰 API 獲取密鑰,
- 可選,在Dapr組件檔案中參考密鑰,

安裝Dapr
此系列文章,我們先來依據Windows環境下的Dapr的自托管模式來實戰,之后再通過K8S來運行Dapr,
1.安裝 Dapr CLI 腳手架工具
Dapr CLI 是您用于各種 Dapr 相關任務的主要工具, 您可以使用它來運行一個帶有Dapr sidecar的應用程式, 以及查看sidecar日志、列出運行中的服務、運行 Dapr 儀表板,
此命令提示命令將安裝最新的 Windows Dapr CLI 到 C:\dapr 并將此目錄添加到用戶PATH 環境變數,
powershell -Command "iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex"
驗證安裝
您可以通過重新啟動您的終端/命令提示和運行以下操作來驗證CLI:
dapr
輸出顯示應該如下方所示:
__ ____/ /___ _____ _____ / __ / __ '/ __ \/ ___/ / /_/ / /_/ / /_/ / / \__,_/\__,_/ .___/_/ /_/ =============================== Distributed Application Runtime Usage: dapr [command] Available Commands: completion Generates shell completion scripts components List all Dapr components. Supported platforms: Kubernetes configurations List all Dapr configurations. Supported platforms: Kubernetes dashboard Start Dapr dashboard. Supported platforms: Kubernetes and self-hosted help Help about any command init Install Dapr on supported hosting platforms. Supported platforms: Kubernetes and self-hosted invoke Invoke a method on a given Dapr application. Supported platforms: Self-hosted list List all Dapr instances. Supported platforms: Kubernetes and self-hosted logs Get Dapr sidecar logs for an application. Supported platforms: Kubernetes mtls Check if mTLS is enabled. Supported platforms: Kubernetes publish Publish a pub-sub event. Supported platforms: Self-hosted run Run Dapr and (optionally) your application side by side. Supported platforms: Self-hosted status Show the health status of Dapr services. Supported platforms: Kubernetes stop Stop Dapr instances and their associated apps. . Supported platforms: Self-hosted uninstall Uninstall Dapr runtime. Supported platforms: Kubernetes and self-hosted upgrade Upgrades a Dapr control plane installation in a cluster. Supported platforms: Kubernetes Flags: -h, --help help for dapr -v, --version version for dapr Use "dapr [command] --help" for more information about a command.
2.在本地環境中初始化 Dapr
Dapr 與您的應用程式一起作為sidecar運行,在自托管模式下,這意味著它是您本地機器上的一個行程, 因此,初始化 Dapr 包括獲取 Dapr sidecar 二進制檔案并將其安裝到本地.
此外,默認初始化程序還創建了一個開發環境,幫助簡化 Dapr 的應用開發, 這包括下列步驟:
- 運行一個用于狀態存盤和訊息代理的Redis容器實體
- 運行一個用于提供可觀察性的Zipkin容器實體
- 創建具有上述組件定義的 默認組件檔案夾
- 運行用于本地演員支持的Dapr placement服務容器實體
確保以管理員方式運行命令提示符終端 (右鍵單擊,以管理員方式運行)
安裝最新的 Dapr 運行時二進制程式:
dapr init
驗證
dapr --version
輸出應該看起來像這樣:
CLI version: 1.2.0 Runtime version: 1.4.0
驗證容器正在運行
docker ps
請確保鏡像為daprio/dapr, openzipkin/zipkin和 redis 的容器都在運行:

在 dapr init時,CLI 還創建了一個默認組件檔案夾,其中包括幾個 YAML 檔案,其中包含state store、elevated 和 zipkin, Dapr sidecar, 將讀取這些檔案, 告訴它使用Redis容器進行狀態管理和訊息傳遞,以及Zipkin容器來收集跟蹤,
- Windows 中,Dapr 初始化路徑到
%USERPROFILE%\.dapr\
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/302097.html
標籤:.NET技术
