Dapr實戰(一) 基礎概念與環境搭建
什麼是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 //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\