什麼是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 例項會相互發現並進行通訊。

  1. 服務 A 對服務 B 發起HTTP/gRPC的呼叫。

  2. Dapr通過服務名解析元件發現了執行在此Dapr環境中的服務B

  3. Dapr 將訊息轉發至服務 B的 Dapr 邊車

    注: Dapr 邊車之間的所有呼叫考慮到效能都優先使用 gRPC。 僅服務與 Dapr 邊車之間的呼叫可以是 HTTP 或 gRPC

  4. 服務 B的 Dapr 邊車將請求轉發至服務 B 上的特定端點 (或方法) 。 服務 B 隨後執行其業務邏輯程式碼。

  5. 服務 B 傳送響應給服務 A。 響應將轉至服務 B 的邊車。

  6. Dapr 將訊息轉發至服務 A 的 Dapr 邊車。

  7. 服務 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 的金鑰儲存構建塊通常涉及以下內容:

  1. 設定一個特定的金鑰儲存解決方案的元件。
  2. 在應用程式程式碼中使用 Dapr 金鑰 API 獲取金鑰。
  3. 可選,在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 的應用開發。 這包括下列步驟:

  1. 執行一個用於狀態儲存和訊息代理的Redis容器例項
  2. 執行一個用於提供可觀察性的Zipkin容器例項
  3. 建立具有上述元件定義的 預設元件資料夾
  4. 執行用於本地演員支援的Dapr placement服務容器例項

確保以管理員方式執行命令提示符終端 (右鍵單擊,以管理員方式執行)

安裝最新的 Dapr 執行時二進位制程式:

dapr init

驗證

dapr --version

輸出應該看起來像這樣:

CLI version: 1.2.0
Runtime version: 1.4.0

驗證容器正在執行

docker ps

請確保映象為daprio/dapropenzipkin/zipkin和 redis 的容器都在執行:

在 dapr init時,CLI 還建立了一個預設元件資料夾,其中包括幾個 YAML 檔案,其中包含state store、elevated 和 zipkin。 Dapr sidecar, 將讀取這些檔案。 告訴它使用Redis容器進行狀態管理和訊息傳遞,以及Zipkin容器來收集跟蹤。

  • Windows 中,Dapr 初始化路徑到 %USERPROFILE%\.dapr\