天天看點

使用Dapr和.NET 6.0進行微服務實戰:Dapr簡介

作者:opendotnet
大家好,我是張飛洪,感謝您的閱讀,我會不定期和你分享學習心得,希望我的文章能成為你成長路上的墊腳石,讓我們一起精進。

本文是《使用Dapr和.NET 6.0進行微服務實戰》的第2篇Dapr簡介部分,大緻包括:了解Dapr,探索Dapr核心元件,設定Dapr環境,建構Dapr簡單示例,閑話不說,我們開始系列旅程吧。

導讀

Dapr全稱Distributed Application Runtime,翻譯過來就是分布式應用程式運作時,在v1.0釋出後得到了極大的發展。

本章将向您介紹Dapr架構的核心概念,為您使用Dapr進行開發做好預熱和準備工作。

可以這麼說,Dapr加速了新的雲原生應用的開發,并簡化了微服務架構的運用。

在本章中,我們将讨論以下主題:

  • 簡單了解Dapr
  • 探索Dapr核心元件
  • 設定Dapr環境
  • 建構Dapr示例

這些主題是後續使用Dapr和微服務架構的基礎和理論指導。首先,我們進入開篇的第一步,從Dapr的工作原理開始。

1.簡單了解Dapr

Dapr是一個事件驅動的、可移植的運作時,由Microsoft使用開源方法建立的,由雲原生計算基金會(CNCF)孵化的項目。

事件驅動(Dapr的定義中強調了這一點)在微服務中扮演着重要的角色;對來自外部系統或第三方的事件作出的反應,同時可以向其他服務轉發新的事件。

Dapr是可移植的,它有三種托管模式。首先它可以在本地機器上自托管,也可以部署到邊緣,或者在Kubernetes上運作。

下圖顯示了Dapr提供的許多建構塊:

使用Dapr和.NET 6.0進行微服務實戰:Dapr簡介

從上圖可以看出,Dapr先要運作在微軟Azure、亞馬遜(AWS)、谷歌雲或國内阿裡,華為雲上都是沒問題的。

Dapr建立在微軟開發超大規模雲原生應用的經驗基礎上。它的靈感來自Orleans和Service Fabric(服務網格),同時又反哺微軟雲的大規模運用。

1.1Dapr簡史

Dapr于2019年10月首次釋出,您可以在這裡上了解到。

Dapr在2020年9月,在初始開發階段采用了開放式治理模式;請參見下面的描述.

Dapr于2021年2月釋出了面向生産環境的v1.0版本,請參看這裡。2021年11月,Dapr作為孵化項目加入CNCF;請參閱公告

Dapr為開發人員提供了一種面向微服務架構的設計工具和運作時,以便更好地運作我們的應用。

微服務提供了面向高可用,高并發等一系列的好處,但是同時帶來了響應的複雜行,比如熔斷限流,服務調用監控,負載均衡等,通常會給開發團隊帶來沉重的負擔。

而Dapr運作時剛好可以幫助我們簡化以上複雜性操作,我們看看具體如何操作:

使用Dapr和.NET 6.0進行微服務實戰:Dapr簡介

(圖1.2)

如圖1.2所示,它顯示了兩種Dapr托管模式:Dapr運作時在邊車(sidecar)程序中運作,将應用的大部分複雜性提升到一個單獨的環境中,這大大簡化了開發和操作。這些sidecar程序在您的開發環境的本地運作,或者在Kubernetes的Pod的容器中運作。

從應用程式的角度來看,Dapr是一種應用程式設計接口(API),可以通過超文本傳輸協定(HTTP)、遠端過程調用(gRPC)直接通路,或者更簡單地說,可以通過适用于.NET、Java、Go、Python、PHP、JavaScript、C++和Rust語言的任何軟體開發工具包(SDK)直接通路。

當然,你也可以不必采用Dapr SDK(稍後将體驗到),對Dapr服務的請求可以像對HTTP調用一樣簡單,例如:http://localhost:3500/v1.0/invoke//method/。如果您通過Dapr SDK與Dapr互動,或者使用Actor SDK利用Dapr Actor模型,那麼使用SDK确實會帶來許多好處。

您可以在Dapr文檔中了解有關SDK和支援的語言的更多資訊,網址。

我們已經了解了Dapr的架構,知道Dapr是什麼了,接下來我們要澄清下Dapr不是什麼了。

1.2Dapr不是什麼

我們從正面了解到了Dapr,也許你對此頗感興趣,但是我覺得很有必要全面了解Dapr,我們需要介紹一下Dapr不是什麼。這使有利我們消除對Dapr産生的誤解,如下所示:

  • Dapr不會強迫開發人員接受具有嚴格規則和限制的程式設計模型。相反,雖然Dapr把開發人員從微服務架構的複雜性中解放出來,但開發人員并沒有被規定要如何編寫應用程式。例如,對存儲狀态的資料庫的連接配接的管理是Dapr的責任(後續的狀态管理會看到),當它對微服務應用是透明的。
  • Dapr不是服務網格。雖然Dapr和服務網格可以找到許多相似之處,但Dapr是在應用級别提供能力,而服務網格在基礎架構上運作。如果出現沖突或間歇性問題,開發人員有權決定如何處理Dapr可能傳回的錯誤;無論是采用Dapr的重試政策,還是向用戶端傳回錯誤,或者補償操作,這些都是隻有開發人員才有權限做出決定。
Dapr旨在與Istio等服務網格內建,這超出了本專欄的範圍。
  • Dapr不是Microsoft雲服務。它确實幫助開發人員在雲中建構微服務應用程式,它當然提供了許多與Azure雲服務的內建,但它也為AWS、GCP和其他服務提供了同樣多的元件。同時,Azure在具有本機擴充的Azure Kubernetes Service(AKS)、具有Dapr政策的Azure API管理以及具有Dapr本機內建的Azure容器應用程式中确實為Dapr提供了豐富的支援。
  • Dapr不是一種僅限.NET的技術。Dapr本身是用Go語言編寫的,任何語言都可以利用它。我們可以使用多種語言的SDK,但也可以選擇直接與Dapr API互動,而無需任何額外的SDK庫。

注意事項

雖然本專欄偏向.NET,但作為示例,我也會示範Dapr和Python的使用關系。

希望以上介紹能讓你對Dapr的了解會更加全面、客觀,并為你是否采用這項技術提供選項幫助。接下來,我們将專門介紹Dapr的體系結構。

2.探索Dapr核心元件

Dapr從一開始就被設計為一組可插拔的建構塊,開發人員可以依賴該建構塊或叫基礎設施進行開發,而運維人員可以通過簡單地配置就可以讓使應用适配其托管環境。

以下是Dapr工具群組件的完整清單:

  • Dapr指令行工具(CLI):用于配置、管理和監視Dapr環境的跨平台指令行工具。它也是用于本地調試Dapr應用的工具。
  • Dapr Helm Charts:提供了在Kubernetes環境中安裝和更新Dapr的手段。
  • Dapr API:定義應用如何與Dapr運作時互動,使用其建構塊的API。
  • Dapr runtime:這是實作Dapr API的核心。如果您很好奇,可以在Dapr的存儲庫中檢視它是如何開發的.
  • Dapr host:在開發機器上,主機作為獨立程序運作;在Kubernetes中,它是應用pod中的一個sidecar容器。
  • Dapr operator:針對Kubernetes模式,該operator用于管理綁定和配置。
  • Dapr sidecar injector(邊車注入):一旦在Kubernetes下配置了該服務,它會将Dapr sidecar注入到應用程式的pod中。
  • Dapr placement service:該服務的目的是在Dapr pod中分發(或放置)Actor執行個體。
  • Dapr Sentry(哨兵):一個内置的證書頒發機構(CA),用于頒發和管理Dapr使用的證書,以提供透明的互傳輸層安全(mTLS)。

截至目前v1.9版本,Dapr提供了九大建構塊(building blocks),微服務開發人員可以根據需求選擇性地采用這些建構塊,具體如下:

  1. 服務調用(Service invocation):服務調用使我們能夠調用位于同一宿主環境中的其他服務,同時處理重試政策。在第4章“服務調用”中會更詳細地介紹了這個建構塊。
  2. 狀态管理(State management):為了将應用狀态作為一個簡單的鍵值對進行有效管理。Dapr提供了許多狀态存儲,包括Redis、Azure Cosmos DB、Azure SQL Server和PostgreSQL,它們可以通過配置插入。在第5章的“狀态管理簡介”中會詳細探讨。
  3. 消息的釋出和訂閱(pub/sub):pub/sub模式通過交換消息實作微服務之間的解耦通信,服務總線可以在生産者和消費者之間路由消息。在第6章的“釋出和訂閱”中會詳細讨論該建構塊。
  4. 資源綁定(Resource bindings):這就是Dapr的事件驅動特性所在。通過綁定,您的應用程式可以通過SMS進行觸發(這隻是通信API領域的流行服務之一)。第7章“資源綁定”中會更詳細地介紹這個建構塊。
  5. 參與者(Actors):Actors模式可以了解為單線程模型,旨在通過在大量計算單元(Actors)之間配置設定總請求量的負載來簡化高并發場景,這些計算單元通過一次處理一個Actors的請求,在較小但獨立的範圍内處理任務。在第8章“使用Actors”中會詳聊該建構塊。
  6. 可觀察性:Dapr使開發人員和運維員能夠觀察應用和服務的行為,而無需對它們進行檢測。第11章“跟蹤Dapr應用”中會更詳細地介紹了這個建構塊。
  7. 安全密鑰(Secrets):将安全與代碼分開是一種良性的做法。Dapr能夠存儲密鑰,并從Kubernetes或Azure密鑰庫等其他元件中引用這些密鑰。
  8. 配置(Configuration):在Alpha狀态的Dapr 1.8版中引入了此建構塊,它解決了檢索應用程式所需配置資料的常見需求。
  9. 分布式鎖(Distributed lock:):Dapr 1.8版在Alpha狀态下引入分布式鎖,它提供了一種強大的基于租約的機制來管理對命名鎖的互斥通路。應用程式可以使用該鎖來確定多個并發執行個體對資源的獨占。

    了解了Dapr體系結構群組件後,在開始使用之前,我們需要在我們的開發環境中設定Dapr。

3.設定Dapr環境

Dapr是多個平台和語言的運作時,本專欄的重點是.NET中的C#,并使用Visual Studio Code作為開發工具。

我們使用的開發環境是Windows,如果你需要有關在Linux或macOS上執行特定操作,建議您檢視Dapr官方文檔。

Dapr路線圖

Dapr運作時于2021年2月釋出v1.0生産環境版本,我們可以在Dapr官方部落格中檢視到,Dapr于2021年釋出了五個新的次要版本。您可以在Dapr路線圖中檢視。

本專欄中的示例和腳本已經用Dapr的v1.9進行了更新和測試。

接下來,我們将完成以下步驟:

  • 配置Docker
  • 安裝Dapr CLI
  • 安裝.NET 6.0
  • 安裝VS Code
  • 安裝Windows終端
  • 在自托管模式下安裝Dapr
  • 在Kubernetes上安裝Dapr

配置Docker

Docker的安裝很簡單,我們可以在以下位置找到運作Docker的詳細說明。

安裝Dapr CLI

Dapr運作時安裝也不難,您可以在此通路安裝。

在Windows上,執行以下指令将CLI安裝到c:\dapr目錄中,并将其添加到使用者PATH環境變量中,以便可以從指令行輕松使用工具:

powershell -Command "iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex"

有關Dapr CLI的更多詳細資訊,請參閱。

安裝.NET 6.0

要安裝.NET 6,請參閱,擷取最新二進制檔案的連結。

.NET 6是.NET的長期支援(LTS)版本,可獲得3年免費支援和更新。

在開發機器上,建議安裝包含運作時的完整版SDK。安裝完成後,我們運作dotnet--info指令進行校驗,成功後,您将看到以下輸出:

安裝VS Code

VS Code是微軟的一個很棒的跨平台源碼編輯器。您可以按照以下說明免費安裝它:跳轉。

Dapr擴充

Dapr有一個VS Code的擴充,它有助于導航Dapr本地環境,并簡化調試配置,我們強烈建議安裝它。

安裝Windows終端

推薦一款不錯的新的Windows終端Windows Terminal,是一款新式、快速、高效、強大且高效的終端應用程式,适用于指令行工具和指令提示符,PowerShell和 WSL 等 Shell 使用者。在接下來的章節中,我們通常必須并行運作多個指令和工具。是以,Windows終端的頁籤功能也是我建議您采用它的原因之一。

在自托管模式下安裝Dapr

Dapr可以以兩種模式初始化:自托管和Kubernetes。

由于打算用于開發環境,是以這裡采用自托管模式,執行

Dapr init

後,會在本地會預設安裝Redis、Dapr placement services和Zipkin。

這裡要留意的是Dapr init指令,建議在網絡比較好的早晨進行初始化,如果是下午或者晚上,可能會無法成功。

預設情況下,Dapr二進制檔案和預設元件位于%USERPROFILE%.dpr\檔案夾中。

例如,在本地開發環境中,Dapr打算用于Redis的端口可能已經被占用。在這種情況下,您應該确定哪些程序或容器正在使用該端口,并相應地更改它們。

一旦啟動init指令成功,您會看到如下輸出:

PS C:\Repos\practical-dapr\chapter01> dapr init
Making the jump to hyperspace...
Installing runtime version 1.8.4
Downloading binaries and setting up components...
Downloaded binaries and completed components set up.
daprd binary has been installed to C:\Users\dabedin\.dapr\bin.
dapr_placement container is running.
dapr_redis container is running.
dapr_zipkin container is running.
Use `docker ps` to check running containers.
Success! Dapr is up and running. To get started, go here: https://aka.ms/dapr-getting-started
           

我們可以通過docker ps來驗證一下是否成功:

PS C:\Repos\practical-dapr\chapter01> docker ps --format "{{.
Image}} - {{.Ports}} - {{.Names}}"
daprio/dapr:1.8.4 - 0.0.0.0:6050->50005/tcp, :::6050->50005/tcp
- dapr_placement
openzipkin/zipkin - 9410/tcp, 0.0.0.0:9411->9411/tcp, :::9411-
>9411/tcp - dapr_zipkin
redis - 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp - dapr_redis
           

下面是在Linux下的驗證:

使用Dapr和.NET 6.0進行微服務實戰:Dapr簡介

在Kubernetes上安裝Dapr

Dapr專門用于在Kubernetes上執行。在安裝了Dapr CLI的開發機器上,可以在Kubernetes叢集上設定Dapr:

dapr init -k

或者,您可以使用Helm v3 chart在Kubernetes上安裝Dapr。您可以在官網上檢視詳情。

要驗證k8s當中的安裝是否成功完成,請執行以下指令

kubectl get pods --namespace dapr-system

Linux下的效果是這樣的:

使用Dapr和.NET 6.0進行微服務實戰:Dapr簡介

更新Dapr版本

在開發環境是Windows的機器上,Dapr的早期版本已經存在,隻需使用我們在上面提到的指令重新安裝即可更新CLI。

如官網文檔所述,我們必須先解除安裝Dapr,如下所示:

PS C:\Repos\practical-dapr\chapter01> dapr uninstall --all

更新CLI并解除安裝Dapr後,我們可以按如下方式重新安裝Dapr:

PS C:\Repos\practical-dapr\chapter01> dapr init

切記在早上網絡好一點的時候進行初始化,具體原因您懂的。

在執行dapr-init之後,檢查dapr版本,我們可以看到CLI和運作時的版本都從1.0向前移動到1.9.5,如以下代碼片段所示:

PS C:\Repos\practical-dapr\chapter01> dapr --version
CLI version: 1.9.1 
Runtime version: 1.9.5
           

我們的Dapr測試環境已啟動并正在運作。我們現在準備用我們的第一個示例進行試驗。

4.建構Dapr示例

我們将建構一個傳回hello world消息的web API。我們選擇将所有樣本都放在C:\Repos\pactual dapr\檔案夾中,并為第一個樣本建立了C:\Repos\Pactual dapr_chapter01檔案夾。我們的步驟如下:

(1)建立Web API ASP.NET項目

PS C:\Repos\practical-dapr\chapter01> dotnet new webapi -o dapr.microservice.webapi
           

(2)添加Dapr SDK引用

PS C:\Repos\practical-dapr\chapter01> dotnet add package Dapr.AspNetCore --version 1.9.5
           

(3)我們用Vs Code打開項目,并對生成的模闆做些更改

(4)為了在ASP.NET 6中支援Dapr,我們對Program.cs中的代碼進行了一些更改。我們将builder.Services.AddControllers方法更改為builder.Services.addController().AddDapr()。

最後,為了簡化代碼,我們注釋掉app.UseHttpsRedirection()中間件。

最後看下最終的代碼:

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers().AddDapr();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
 app.UseSwagger();
 app.UseSwaggerUI();
}
//app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.MapSubscribeHandler();
app.Run();
           

(5)最後,我們添加了一個名為HelloWorldController的控制器,如以下代碼片段所示:

[ApiController]
[Route("[controller]")]
public class HelloController : ControllerBase
{
private readonly ILogger<HelloController> _logger;

public HelloController(ILogger<HelloController> logger)
 {
 _logger = logger;
 }

 [HttpGet()]
public ActionResult<string> Get()
 {
 Console.WriteLine("Hello, World.");
return "Hello, World";
 }
}
           

以上我們設定了路由和一個Get方法。

(6)為了運作Dapr應用程式,可以使用以下指令:

dapr run --app-id <my app id> --app-port <port of the app> --dapr-http-port <port in Dapr> dotnet run

我們将ASP.NET預設端口設為5000,将Dapr HTTP端口設為5010。以下指令行啟動Dapr應用程式:

PS C:\Repos\dapr.microservice.webapi> dapr run --app-id hello-world --app-port 5000 --dapr-http-port 5010 dotnet run
           

我們在對應的項目目錄下執行以上代碼,啟動Dapr。Dapr将為HTTP使用端口5010,而對于gRPC,它将自動選擇一個可用端口。

啟動後會在控制台列印日志資訊,要确認應用程式在Dapr運作時上下文中正确運作:

Updating metadata for app command: dotnet run
You're up and running! Both Dapr and your app logs will
appear here.
           

在此階段,ASP.NET在端口5000上進行監聽,Dapr在端口5010上進行監聽。為了測試Dapr,我們按如下方式調用curl指令,使用浏覽器也可以:

PS C:\Repos\practical-dapr> curl http://localhost:5010/v1.0/invoke/hello-world/method/hello
Hello, World
           

Dapr傳回了這個響應,同時Dapr視窗也會列印結果,如下所示

== APP == Hello, World.
           

(7)從另一個視窗,讓我們驗證Dapr服務的詳細資訊。我們按如下方式打開dapr儀表闆,而不是使用dapr list指令

PS C:\Windows\System32> dapr dashboard Dapr Dashboard running on http://localhost:8080

我們可以通過導航到http://localhost:8080顯示了hell-world的詳細資訊:

在本例中,Dapr儀表闆僅顯示我們在開發機器上運作的示例應用程式。在Kubernetes環境中,它将顯示所有正在運作的微服務以及其他元件:

使用Dapr和.NET 6.0進行微服務實戰:Dapr簡介

Dapr儀表闆顯示,部署了Zipkin,Redis,Redis除了做狀态存儲,還支援消息的釋出訂閱。

以上就是我們建構的第一個Dapr示例。

5.總結

在本章,您了解了Dapr項目及其元件、建構塊和sidecar方法。所有這些概念将在後面的章節中單獨深入探讨。同時,我們還示範了在本地開發機器上設定Dapr,準備必要的工具。我們還學習了如何建立一個簡單的ASP.NET項目,以及如何配置和檢查Dapr,我們還了解了Dapr儀表闆,我們可以從中獲得Dapr環境的完整和即時視圖。

在下一章中,我們将使用環境來學習如何調試Dapr。

6.問題

  1. Dapr提供哪些建構塊?
  2. Dapr CLI和Dapr運作時之間的關系是什麼?
  3. 如何在本地開發環境中安裝Dapr?
  4. 在Kubernetes中,可以采用哪些方法安裝Dapr?
  • Dapr概述:https://docs.dapr.io/concepts/overview/
  • Dapr入門:https://docs.dapr.io/getting-started/
  • Dapr路線圖:https://docs.dapr.io/contributing/roadmap/

繼續閱讀