Поделиться через


интеграция .NET AspireDapr

распределенной среде выполнения приложений (Dapr) предлагает API-интерфейсы разработчика, которые служат каналом для взаимодействия с другими службами и зависимостями, а также абстрагируют приложение от конкретных служб и зависимостей. Dapr и .NET Aspire могут работать вместе, чтобы улучшить локальный опыт разработки. Используя Dapr с .NET Aspire, вы можете сосредоточиться на написании и реализации распределенных приложений на основе .NETвместо локального подключения.

В этом руководстве вы узнаете, как воспользоваться преимуществами абстракции Daprи авторской конфигурации .NET Aspireоблачных технологий для создания простых, переносимых, устойчивых и защищенных микрослужб в большом масштабе.

Сравнение .NET Aspire и Dapr

На первый взгляд Dapr и .NET Aspire могут выглядеть так, будто их функции пересекаются — и это действительно так. Однако они принимают различные подходы. .NET .NET Aspire считает, как создавать распределенные приложения на облачной платформе и сосредоточиться на улучшении локального опыта разработки. Dapr — это среда выполнения, которая абстрагирует общие сложности базовой облачной платформы как во время разработки, так и в рабочей среде. Он полагается на боковики для предоставления абстракций для таких вещей, как конфигурация, управление секретами и обмен сообщениями. Базовая технология может легко переключаться через файлы конфигурации, при этом ваш код не требует изменения.

Аспект .NET Aspire Dapr
Цель Предназначен для упрощения разработки облачных решений на локальных компьютерах разработки. Разработан, чтобы упростить разработку и запуск распределенных приложений с общими API, которые можно легко переключить.
API Разработчики должны вызывать API ресурсов с помощью определенных пакетов SDK Разработчики обращаются к API в контейнере Dapr, который перенаправляет вызов к нужному API. Можно легко заменить API ресурсов, не изменяя код в микрослужбах.
Языки Вы пишете микросервисы на языках .NET, Go, Python, Javascript и других. Вы можете вызывать функции сайдкара Dapr на любом языке, поддерживающем интерфейсы HTTP/gRPC.
Политики безопасности Не включает политики безопасности, но может безопасно настраивать подключения между межзависимыми ресурсами. Включает настраиваемые политики безопасности, которые управляют доступом микрослужб к другим службам или ресурсам.
Развёртывание Существуют инструменты для развертывания для Azure и Kubernetes. Не включает средства развертывания. Приложения обычно развертываются с системами непрерывной интеграции и непрерывной разработки (CI/CD).
Панель управления Предоставляет комплексное представление ресурсов и их телеметрии и поддерживает прослушивание любого поддерживаемого ресурса OTEL. Ограничено только Dapr ресурсами.

.NET Aspire упрощает настройку и отладку приложений Dapr, предоставляя простой API для настройки Dapr боков и предоставляя боковики в качестве ресурсов на панели мониторинга.

Изучение компонентов Dapr с помощью .NET Aspire

предоставляет множество встроенных компонентов, а при использовании с можно легко изучить и настроить эти компоненты. Не путайте эти компоненты с интеграциями .NET.NET Aspire. Например, рассмотрим следующее:

Установка Dapr

Для этой интеграции требуется Dapr версии 1.13 или более поздней. Сведения об установке Daprсм. в статье Daprcli . После установки интерфейса командной строки Dapr запустите dapr init, как указано в Инициализация Dapr в вашей локальной среде.

Важный

Если вы попытаетесь запустить решение .NET Aspire без интерфейса командной строки Dapr, вы получите следующую ошибку:

Unable to locate the Dapr CLI.

Интеграция хостинга

В решении .NET Aspire для интеграции Dapr и доступа к его типам и API добавьте пакет NuGet 📦Aspire.Hosting.Dapr в проект хоста приложения .

dotnet add package Aspire.Hosting.Dapr

Дополнительные сведения см. в статье "dotnet add package" или "Управление зависимостями пакетов в .NET приложениях".

Добавьте боковой Dapr к ресурсам .NET Aspire.

Dapr использует шаблон боковинка. Dapr сайдкар функционирует совместно с вашим приложением как облегчённый, переносимый и бессерверный HTTP-сервер, который прослушивает входящие HTTP-запросы от вашего приложения.

Чтобы добавить сайдкар к ресурсу .NET.NET Aspire, вызовите метод WithDaprSidecar на нем. Параметр appId является уникальным идентификатором для приложения Dapr, но это необязательно. Если вы не предоставляете appId, вместо этого используется родительское имя ресурса.

using Aspire.Hosting.Dapr;

var builder = DistributedApplication.CreateBuilder(args);

var apiService = builder
    .AddProject<Projects.Dapr_ApiService>("apiservice")
    .WithDaprSidecar();

Настройте Dapr сайдкары

Метод WithDaprSidecar предлагает перегрузки для настройки параметров вспомогательных модулей Dapr, таких как AppId и различные порты. В следующем примере контейнер sidecar Dapr настроен с конкретными портами для GRPC, HTTP, метрик и идентификатора приложения.

DaprSidecarOptions sidecarOptions = new()
{
    AppId = "FirstSidecar",
    DaprGrpcPort = 50001,
    DaprHttpPort = 3500,
    MetricsPort = 9090
};

builder.AddProject<Projects.Dapr_Web>("webfrontend")
    .WithExternalHttpEndpoints()
    .WithReference(apiService)
    .WithDaprSidecar(sidecarOptions);

Полный пример хоста приложения Dapr

Объединив все вместе, рассмотрим следующий пример проекта хоста приложения .NET.NET Aspire, который включает в себя:

  • Сервис API на стороне сервера, который объявляет сайдкар Dapr со значениями по умолчанию.
  • Проект веб-интерфейса, который объявляет Dapr сайдкар с определенными параметрами, такими как явные порты.
using Aspire.Hosting.Dapr;

var builder = DistributedApplication.CreateBuilder(args);

var apiService = builder
    .AddProject<Projects.Dapr_ApiService>("apiservice")
    .WithDaprSidecar();

DaprSidecarOptions sidecarOptions = new()
{
    AppId = "FirstSidecar",
    DaprGrpcPort = 50001,
    DaprHttpPort = 3500,
    MetricsPort = 9090
};

builder.AddProject<Projects.Dapr_Web>("webfrontend")
    .WithExternalHttpEndpoints()
    .WithReference(apiService)
    .WithDaprSidecar(sidecarOptions);

builder.Build().Run();

При запуске решения .NET Aspire панель мониторинга отображает в качестве ресурса сайдкар Dapr с его статусом и логами.

панель управления .NET Aspire, показывающая ресурсы сайдкар Dapr

Использование Dapr боковой кареты в использовании проектов .NET Aspire

Чтобы использовать API Dapr из ресурсов .NET Aspire, вы можете использовать пакет NuGet 📦Dapr.AspNetCore/. Пакет SDK Dapr предоставляет набор API-интерфейсов для взаимодействия с Dapr сайдкарами.

Заметка

Используйте библиотеку Dapr.AspNetCore для интеграции Dapr с ASP.NET (интеграция DI, регистрация подписок и т. д.). Приложения, отличные отASP.NET (например — консольные приложения), могут просто использовать 📦Dapr.Client, чтобы делать вызовы через боковик Dapr.

dotnet add package Dapr.AspNetCore

Добавить клиента Dapr

После установки в проект ASP.NET Core пакет SDK можно добавить в построитель служб.

builder.Services.AddDaprClient();

Вызов методов Dapr

Теперь экземпляр DaprClient можно внедрить в службы для взаимодействия с Dapr сайдкаром через SDK Dapr.

using Dapr.Client;

namespace Dapr.Web;

public class WeatherApiClient(DaprClient client)
{
    public async Task<WeatherForecast[]> GetWeatherAsync(
        int maxItems = 10, CancellationToken cancellationToken = default)
    {
        List<WeatherForecast>? forecasts =
            await client.InvokeMethodAsync<List<WeatherForecast>>(
                HttpMethod.Get,
                "apiservice",
                "weatherforecast",
                cancellationToken);

        return forecasts?.Take(maxItems)?.ToArray() ?? [];
    }
}

public record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

InvokeMethodAsync — это метод, который отправляет HTTP-запрос в сайдкар Dapr. Это универсальный метод, который принимает:

  • HTTP-команда.
  • Идентификатор приложения Dapr вызываемой службы.
  • Имя метода.
  • Токен отмены.

В зависимости от команды HTTP он также может принимать текст запроса и заголовки. Параметр универсального типа — это тип текста отклика.

Отображается полный Program.cs-файл для проекта внешнего интерфейса:

  • Клиент Dapr добавляется в построитель служб.
  • Класс WeatherApiClient, использующий клиент Dapr для вызова серверной службы.
using Dapr.Web;
using Dapr.Web.Components;

var builder = WebApplication.CreateBuilder(args);

// Add service defaults & Aspire components.
builder.AddServiceDefaults();

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

builder.Services.AddOutputCache();

builder.Services.AddDaprClient();

builder.Services.AddTransient<WeatherApiClient>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();
app.UseAntiforgery();

app.UseOutputCache();

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.MapDefaultEndpoints();

app.Run();

Например, в проекте Blazor можно интегрировать класс WeatherApiClient на страницу Razor и использовать его для обращения к серверной службе.

@page "/weather"
@attribute [StreamRendering(true)]
@attribute [OutputCache(Duration = 5)]

@inject WeatherApiClient WeatherApi

<PageTitle>Weather</PageTitle>

<h1>Weather</h1>

<p>This component demonstrates showing data loaded from a backend API service.</p>

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Date</th>
                <th>Temp. (C)</th>
                <th>Temp. (F)</th>
                <th>Summary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var forecast in forecasts)
            {
                <tr>
                    <td>@forecast.Date.ToShortDateString()</td>
                    <td>@forecast.TemperatureC</td>
                    <td>@forecast.TemperatureF</td>
                    <td>@forecast.Summary</td>
                </tr>
            }
        </tbody>
    </table>
}

@code {
    private WeatherForecast[]? forecasts;

    protected override async Task OnInitializedAsync()
    {
        forecasts = await WeatherApi.GetWeatherAsync();
    }
}

При использовании SDK Dapr сайдкар Dapr вызывается по HTTP. Затем Dapr боковой карете перенаправит запрос в целевую службу. Хотя целевая служба выполняется в отдельном процессе от боковой тележки, интеграция, связанная со службой, осуществляется в боковой тележке Dapr и отвечает за обнаружение службы и маршрутизацию запросов к целевой службе.

Дальнейшие действия