使用 .NET 7、Blazor 和 .NET MAUI 構建你自己的 Podcast App

微軟技術棧 發表於 2023-01-23
.Net

.NET Podcast App 首次在 .NET Conf 2021上推出,最近進行了更新以在 .NET Conf 2022 keynote 中突出顯示 .NET 7 中的新功能。該 Podcast App 已準備好使用展示 .NET,ASP.NET Core,Blazor,.NET MAUI,Azure Container Apps,Orleans,Power Platform,Playwright 等示例應用程式。在本文中,我將解釋所有新功能並展示我們如何升級 .NET Podcast App 以利用它們。

圖片

架構

如前所述,.NET Podcast App 使用雲原生架構來支援移動、桌面和 Web 應用程式。微服務用於新增和更新 podcasts 提要的工作服務以及為應用程式提供資料的 API。這些都由 Azure Container Apps 提供支援,以根據每個服務的不同特徵動態擴充套件微服務。

圖片

.NET Podcast App 還有很多其他功能,包括為我們的資料庫整合到 Azure SQL Server,用於儲存影像和排隊提交的 Azure Storage,以及用於利用 Power Apps 和 Power Automate 中的 API 的 Azure API Management。

API 更新

.NET Podcast API 已更新為使用 ASP.NET Core 中的最新功能,包括輸出快取、速率限制、API 版本控制和用於最小 API 的新路由組。此外,它將最新的增強功能與身份驗證和授權整合在一起,為開發人員大大簡化了這些功能。

// Authentication and authorization-related services

builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration);

builder.Services.AddAuthorizationBuilder().AddPolicy("modify_feeds", policy => policy.RequireScope("API.Access"));

// OpenAPI and versioning-related services
builder.Services.AddSwaggerGen();
builder.Services.Configure<SwaggerGeneratorOptions>(opts =>
{
    opts.InferSecuritySchemes = true;
});
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddApiVersioning(options =>
{
    options.DefaultApiVersion = new ApiVersion(2, 0);
    options.ReportApiVersions = true;
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.ApiVersionReader = new HeaderApiVersionReader("api-version");
});

// Enable Output Cache
builder.Services.AddOutputCache();

// Rate-limiting and output caching-related services
builder.Services.AddRateLimiter(options => options.AddFixedWindowLimiter("feeds", options =>
{
    options.PermitLimit = 5;
    options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
    options.QueueLimit = 0;
    options.Window = TimeSpan.FromSeconds(2);
    options.AutoReplenishment = false;
}));

// Create version set
var versionSet = app.NewApiVersionSet()
                    .HasApiVersion(1.0)
                    .HasApiVersion(2.0)
                    .ReportApiVersions()
                    .Build();

// create new mapping for apis
var shows = app.MapGroup("/shows");

shows
    .MapShowsApi()
    .WithApiVersionSet(versionSet)
    .MapToApiVersion(1.0)
    .MapToApiVersion(2.0);

可觀察性和監控

構建和部署伺服器後,你需要觀察和監控它們。在我們的主題演講中,我們展示瞭如何透過幾行程式碼整合 Open Telemetry、Azure Monitor 等,以此完全檢測你的伺服器。

builder.Services.AddOpenTelemetryTracing(tracing =>
        tracing.SetResourceBuilder(serviceResource)
        .AddAzureMonitorTraceExporter(o =>
        {
            o.ConnectionString = azureMonitorConnectionString;
        })
        .AddJaegerExporter()
        .AddHttpClientInstrumentation()
        .AddAspNetCoreInstrumentation()
        .AddEntityFrameworkCoreInstrumentation()
    );

builder.Services.AddOpenTelemetryMetrics(metrics =>
{
    metrics
    .SetResourceBuilder(serviceResource)
    .AddPrometheusExporter()
    .AddAzureMonitorMetricExporter(o =>
    {
        o.ConnectionString = azureMonitorConnectionString;
    })
    .AddAspNetCoreInstrumentation()
    .AddHttpClientInstrumentation()
    .AddRuntimeInstrumentation()
    .AddProcessInstrumentation()
    .AddHttpClientInstrumentation()
    .AddEventCountersInstrumentation(ec =>
    {
        ec.AddEventSources("Microsoft.AspNetCore.Hosting");
    });
});

builder.Logging.AddOpenTelemetry(logging =>
{
    logging
    .SetResourceBuilder(serviceResource)
    .AddAzureMonitorLogExporter(o =>
    {
        o.ConnectionString = azureMonitorConnectionString;
    })
    .AttachLogsToActivityEvent();
});

.NET SDK 容器

.NET Podcast 應用程式由微服務和容器提供支援。.NET SDK 現在只需更改幾處配置即可將你的應用程式容器化。此功能現已整合到為 .NET Podcast 應用程式和 CI/CD pipeline 提供支援的服務中。

<PropertyGroup>
    <ContainerImageName>podcastapi</ContainerImageName>
</PropertyGroup>

<ItemGroup>
    <PackageReference Include="Microsoft.NET.Build.Containers" Version="0.2.7" />
</ItemGroup>
dotnet publish -c Release -r linux-x64 -p PublishProfile=DefaultContainer src/Services/Podcasts/Podcast.API/Podcast.API.csproj

Playwright 測試

Playwright 是由微軟建立和維護的開源測試工具,為現代 web 應用程式提供可靠的端到端測試。當團隊更新後端和前端更新時,他們希望部落格應用程式的主要功能不會被破壞。他們設定了幾個 Playwright 測試,並將其整合到 CI 管道中,這樣一旦有了拉取請求,管道就會執行。

圖片

Power Apps 整合

使用 Azure API Management(APIM) ,你可以輕鬆地使用 .NET APIs,讓其支援更多的服務和應用程式,包括 Power Apps。在 .NET Conf 2022 中, 我們展示了:透過 APIs 淺層的 .NET APIs,Power Apps 能夠對批准和拒絕新的播客提交進行分類。現在 repo 中包括可以由你自己部署的 Power Apps。

圖片

GitHub 儲存庫有新手指導,介紹瞭如何輕鬆地讓整個應用程式在本地執行,只需一個簡單的命令就能進行開發。此外,你可以透過在克隆的 repo 中設定一些 GitHub secrets 來用 GitHub Actions 實現完整的持續整合和部署管道,將整個解決方案部署到 Azure 平臺上。除了執行應用程式,你還可以在新手指導中找到 .NET Conf 的所有 demo。

我們將繼續為應用程式新增新功能,也會關注你所感興趣的內容以及你正在使用此示例架構構建的內容。有任何反饋,請前往 GitHub 討論組

點我前往原部落格,獲取相關連結、文件和影片~