интеграция .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
- Dapr— хранилища состояний: вызовите AddDaprStateStore, чтобы добавить настроенное хранилище состояний в проект .NET.NET Aspire.
- Dapr— Pub Sub: вызовите AddDaprPubSub, чтобы добавить настроенный Pub Sub в проект .NET.NET Aspire.
- Dapr— компоненты: вызов AddDaprComponent для добавления настроенной интеграции в проект .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 с его статусом и логами.
Использование 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 и отвечает за обнаружение службы и маршрутизацию запросов к целевой службе.
Дальнейшие действия
.NET Aspire