只有累積,沒有奇蹟

2024年3月4日 星期一

[NET] .NET Aspire From 0 To 1 : 快速入門

前言
.NET Conf 一直是微軟對開發者展示火力的重要來源之一,在今年 .NET Conf 2023 上 .NET 平台團隊的 PM Glenn condrin 與 David Flower 介紹新一代雲原生框架 .NET Asipre。在議程中 David Fowler Demo 使用 .NET Aspire 專案,讓開發者可以輕鬆開始使用 .NET Aspire 框架提升開發者的體驗,並增進生產力,並帶來所有雲原生可以帶來的遙測數據、可觀察性、可擴展性和靈活性。另外讓我覺得興奮的是 .NET 8 與 OpenTelemetry 的深度整合,對於開發者在實踐可觀測性上更是方便許多。
自己在研究 Aspire 接著會預計整理成相關系列文章,這篇是研究 .NET Aspire 的系列文第一篇,這系列主要會分為幾篇分別是
  • .NET Aspire 快速入門 : 介紹 .NET Aspire 的基礎知識,包括其設計理念、主要功能
  • .NET Aspire 中的可觀測性 : 解釋 .NET Aspire 如何提供應用程式的可觀測性,包括如何蒐集遙測數據、監控和日誌記錄
  • .NET Aspire 整合 : 說明 .NET Aspire 如何與其他微軟雲服務(如 Azure)整合
希望可以透過各種官網的文件與說明,加上自己的理解針對新一代 .NET Aspire 雲原生框架進行說明,讓有興趣的開發夥伴們可以更進一步了解對開發者帶來的好處與效益,與若對於上述內容有問題或是不清楚的地方,歡迎提出來一起討論。


背景
近幾年互聯網發展的速度可以說是有增無減,新的科技名詞層出不窮,當中 ABCDE 可以代表新興科技發展的五個重要方向,分別是指 AI(人工智慧)、Big data(大數據)、Cloud(雲端)、Device(裝置)、Ecosystem(生態)。隨著雲端技術的成熟,將應用程式上雲一直是這幾年熱度不減的議題之一,身為開發者的我們,除了要了解或熟悉雲端上的服務 Service、將應用程式服務容器化,在 Cloud Native 雲原生概念出現後,開發者要將傳統的應用程式搬遷到雲端上也是一個不容忽視的挑戰,在 CNCF 雲原生基金會所提供各式各樣的 Gituhb 專案中,開發者可以找到許多用於建購或部署雲原生服務的工具或組件。這些組件或工具包含了架構、容器化、持續集成或是持續部署(CI/CD),在到上線後的監控與日誌等方面,身為開發者的我們,還須了解它們各自的優勢與限制將其組合起來,應用在開發專案中,有沒有一個框架可以協助開發者快速進度入雲原生應用 ? 讓開發者可以更專注的在開發應用程式的服務呢 ?

.NET Aspire 簡介
在官方 github 介紹如下
.NET Aspire is an opinionated, cloud ready stack for building observable, production ready, distributed applications. .NET Aspire is delivered through a collection of NuGet packages that handle specific cloud-native concerns. Cloud-native apps often consist of small, interconnected pieces or microservices rather than a single, monolithic code base. Cloud-native apps generally consume a large number of services, such as databases, messaging, and caching.
簡單翻譯可以理解為
  • .NET Aspire 是微軟為雲原生應用開發推出的一個新框架,它在 .NET 8 中提供了許多重要功能,專注於提升開發效率和簡化雲原生應用的開發過程。它包含了與雲端服務更緊密的整合,以及支持容器化、微服務架構和分散式系統管理的先進工具和實踐。
.NET Aspire 的目標是簡化複雜的雲原生應用開發,同時提供強大的功能,如改進的遙測數據、可觀察性、可擴展性和靈活性。這對於追蹤和管理分散式系統至關重要,尤其是在面對快速發展的雲端環境時。

準備條件
了解完 .NET Asipre 想要解決的問題與目的後,接著我們來看如果想要使用 .NET Aspire 的前置作業是甚麼,在使用前需安装以下軟體:
  • .NET 8.0
  • .NET Aspire workload
  • Use the Visual Studio installer
  • Use the dotnet workload install aspire command
  • Docker Desktop
  • Integrated Developer Environment (IDE) or code editor, such as:
  • Visual Studio 2022 Preview version 17.9 or higher (Optional)
  • Visual Studio Code (Optional)
透過 cli 安裝 .NET Aspire workload 示意圖
Use the Visual Studio installer,記得確認右方要有 .NET Aspire SDK (Preview)
建立專案
在本機安裝完上述的軟體後,接著我們透過 Visual Studio IDE 來建立 Aspire 應用程式模板方案,在 Visual Studio 2022 17.9 版本有提供 .NET Aspire 專案模板,可以提供開發者設定出初始組態設定作業。

Step 1 : 開啟 Visual Studio 並建立新專案,右方對話框中搜尋 Aspire 後選擇或者是在 project type 直接選擇 .NET Aspire,點選 .NET Aspire Starter Application,點選下一步
Step 2 : 專案名稱輸入 AspireSampleApp,其餘設定保持預設值,點選下一步
Step 3 : Framework 選擇 .NET 8(Long term support),接著按下建立按鈕
創建完畢之後,我們來看一下方案中預設有哪些專案跟內容
└───📂 AspireSample
     ├───📂 AspireSample.ApiService
     │    ├───📂 Properties
     │    │    └─── launchSettings.json
     │    ├─── appsettings.Development.json
     │    ├─── appsettings.json
     │    ├─── AspireSample.ApiService.csproj
     │    └─── Program.cs
     ├───📂 AspireSample.AppHost
     │    ├───📂 Properties
     │    │    └─── launchSettings.json
     │    ├─── appsettings.Development.json
     │    ├─── appsettings.json
     │    ├─── AspireSample.AppHost.csproj
     │    └─── Program.cs
     ├───📂 AspireSample.ServiceDefaults
     │    ├─── AspireSample.ServiceDefaults.csproj
     │    └─── Extensions.cs
     ├───📂 AspireSample.Web
     │    ├───📂 Components
     │    │    ├───📂 Layout
     │    │    │    ├─── MainLayout.razor
     │    │    │    ├─── MainLayout.razor.css
     │    │    │    ├─── NavMenu.razor
     │    │    │    └─── NavMenu.razor.css
     │    │    ├───📂 Pages
     │    │    │    ├─── Counter.razor
     │    │    │    ├─── Error.razor
     │    │    │    ├─── Home.razor
     │    │    │    └─── Weather.razor
     │    │    ├─── _Imports.razor
     │    │    ├─── App.razor
     │    │    └─── Routes.razor
     │    ├───📂 Properties
     │    │    └─── launchSettings.json
     │    ├───📂 wwwroot
     │    │    ├───📂 bootstrap
     │    │    │    ├─── bootstrap.min.css
     │    │    │    └─── bootstrap.min.css.map
     │    │    ├─── app.css
     │    │    └─── favicon.png
     │    ├─── appsettings.Development.json
     │    ├─── appsettings.json
     │    ├─── AspireSample.Web.csproj
     │    ├─── Program.cs
     │    └─── WeatherApiClient.cs
     └─── AspireSample.sln
稍早建立的方案 AspireSampleApp 其中有內建四個專案,分別是
  • AspireSampleApp.ApiService
  • AspireSampleApp.AppHost
  • AspireSampleApp.ServiceDefaults
  • AspireSampleApp.Web
接著我們來針對這些重要的專案分別作重點介紹

AppHost
做為跨專案的協調器 (orchestrator) 項目,用於連結和配置應用程式不同項目和服務。此專案會設定為方案的啟動項目,並且依賴於 AspireSample.ApiService 和 AspireSample.Web 專案。專案命名以 *.AppHost 做結尾,且開啟專案屬性的設定為 true
前面提到 AppHost 專案作為協調器,那麼在這專案要如何設定呢 ? 我們可以開啟 AspireSampleApp.AppHost 中的 Program.cs 程式碼來一探究竟
var builder = DistributedApplication.CreateBuilder(args);

var cache = builder.AddRedis("cache");

var apiService = builder.AddProject("apiservice");

builder.AddProject("webfrontend")
    .WithReference(cache)
    .WithReference(apiService);

builder.Build().Run();
  • 以上代碼開始透過 CreateBuilder 方法建立 IDistributedApplicationBuilder 的 instance,透過 IDistributedApplicationBuilder 的擴充方法來設定其相依資源 (resource)
  • 程式碼中描述定義包含三個資源 (resource),要設定 Redis 快取就是透過 .AddRedis 擴充方法並設定其容器 (Container) 名稱是 Cache
  • 接著加入兩個專案 (Project) 分別是 apiservice 跟 webfrontend,因此使用 AddProjects 方法來將 project 加入到 AppHost 專案中
  • WithReference 方法是動態注入 service discovery 的一部分,將其資訊 endpoint 注入到應用程式的配置或資源中,使得在運行時可以根據配置或環境進行適當的連結,查看 source code 可以發現其 format 是 "services__{sourceResourceName}__{endpointIndex}={endpointNameQualifiedUriString}。
  • 使用 Build.Run() 方法來啟動應用程式與所有相依性
MSDN 有針對各自用途做詳細介紹並整理成可視化的圖形如下
另外也提供多種資源類型,像是 ProjectResource、ContainerResource 和 ExecutableResource,詳細可以參考 app-host-overview 介紹

ServiceDefaults
ServiceDefaults 專案目的是放置共用的項目。

過去在開發雲原生應用程式時,遇到好用的 package 或是套件時可以說是每個專案都會同步加上,例如像是 log 可能會使用 serilog 搭配合適的 skin,如果想要加上 retry 機制可能會加上 polly 等廣為人知的好用套件,但如果應用程式的架構或是服務拆分越來越細時,這些套件會在各個專案都重複看見與被使用,假設其套件的組態設定需要調整時,也需要在各個所使用的專案上進行調整,才有機會將其設定統一設定好不遺漏。這可以說是開發者不方便的點之一,在 .NET Aspire 中為了解決這問題,提供開發者可以將其設定移置 serviceDefault 專案中,來提供開發者更好的開發體驗,也可以在其專案中加上工具、OpenTelemetry 狀態檢查獲是環境變數等管理。
以 AspireSampleApp 專案為例建立完後會有 AspireSampleApp.Web 與 AspireSampleApp.ApiService 等應用程式專案,兩者其共用的組態設定與配置是定義在 AspireSampleApp.ServiceDefaults 的 AddServiceDefaults 擴充方法中。程式碼如下
public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBuilder builder)
{
    builder.ConfigureOpenTelemetry();

    builder.AddDefaultHealthChecks();

    builder.Services.AddServiceDiscovery();

    builder.Services.ConfigureHttpClientDefaults(http =>
    {
        // Turn on resilience by default
        http.AddStandardResilienceHandler();

        // Turn on service discovery by default
        http.UseServiceDiscovery();
    });

    return builder;
}
  • ConfigureOpenTelemetry 方法 : 用來設定 openTelemetry 收集遙測數據的設定
  • AddDefaultHealthChecks 方法 : 定義應用程式 healthcheck (AddCheck 方法) 服務正常時需要回傳的值
  • AddServiceDiscovery 方法 : 新增 service discovery 功能
  • ConfigureHttpClientDefaults : 新增在使用 httpClient 的預設值
ApiService 與 Web
  • ApiService : 隨機回傳氣溫結果
  • Web : 作為 Client 負責呼叫 apiService 並將請求呈現在網頁上
目的是演示 Demo 用的氣溫應用程式,若有興趣可以查看專案內容,在此就不在多介紹說明

測試專案
在上面的描述與說明中我們可以初步了解 .NET Aspire sample project 方案中各自專案的用途,設定 AspireSampleApp.Web 為起始專案後,在 Visual Studio 按下 F5 來執行應用程式,可以看到天氣的頁面
專案啟動時同步也會啟動 .NET Aspire 儀表板示意圖如下
今天快速介紹了關於微軟推出的新框架 .NET Aspire,以及透過 Visual Studio IDE 建立 .NET Aspire 新專案的過程,也探索了其方案建立後專案的組成與各自的設計含意與目的,相信透過今天的文章對於 .NET Aspire 有了初步的認識,.NET 8 整合 openTelemetry 後將其遙測數據收集到 .NET Aspire 所提供的 Dashboard 上,讓開發者對於應用程式的掌握度更高,下一篇我們再來探索 .NET Aspire 儀錶板其奧妙之處 !


參考
.NET Aspire documentation (Preview)

0 意見:

張貼留言

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com