Przejdź do treści

Jak uruchomić Azure Service Bus lokalnie przy użyciu .NET Aspire

  • przez

Testowanie aplikacji cloud-native często przypomina balansowanie na linie. Albo płacisz za dedykowane środowisko „Dev” w chmurze, albo spędzasz godziny na konfigurowaniu skomplikowanych mocków. Dzięki .NET Aspire ten problem znika.

W tym wpisie sprawdzimy, jak wykorzystać Azure Service Bus Emulator wewnątrz .NET Aspire, aby w kilka minut uruchomić w pełni funkcjonalny system kolejek na własnym komputerze.

Dlaczego .NET Aspire?

.NET Aspire to nowoczesny stos technologiczny do budowania skalowalnych i obserwowalnych aplikacji rozproszonych. Jedną z jego największych zalet jest możliwość orkiestracji zasobów (takich jak bazy danych czy brokery wiadomości) bezpośrednio z poziomu kodu C#.

Wymagania wstępne

  • .NET 8.0/9.0+ SDK
  • Docker Desktop lub Podman (wymagany do uruchomienia kontenera z emulatorem)
  • Visual Studio 2022 (17.10+) lub VS Code z C# Dev Kit

Krok 1: Dodanie zasobu Service Bus

W projekcie .AppHost musisz zdefiniować zasób Service Bus. Ponieważ chcemy działać lokalnie, .NET Aspire automatycznie uruchomi Azure Service Bus Emulator w kontenerze.

var builder = DistributedApplication.CreateBuilder(args);

// Dodanie zasobu Azure Service Bus
var messaging = builder.AddAzureServiceBus("messaging")
                       .RunAsEmulator(); // Tu dzieje się magia!

// Podpięcie usługi do API lub Workera
builder.AddProject<Projects.MyApiService>("apiservice")
       .WithReference(messaging);

builder.Build().Run();

Krok 2: Konfiguracja projektu klienckiego

W projekcie, który wysyła lub odbiera wiadomości (np. MyApiService), dodaj pakiet integracyjny Aspire:

dotnet add package Aspire.Azure.Messaging.ServiceBus

Następnie zarejestruj klienta w pliku Program.cs:

builder.AddAzureServiceBusClient("messaging");

Krok 3: Wysyłanie i odbieranie wiadomości

Teraz możesz wstrzyknąć ServiceBusClient w dowolnym miejscu w kodzie, nie martwiąc się o parametry połączenia (connection strings). Aspire zajmie się konfiguracją za Ciebie.

app.MapPost("/wyslij", async (ServiceBusClient client) =>
{
    var sender = client.CreateSender("moja-kolejka");
    await sender.SendMessageAsync(new ServiceBusMessage("Witaj lokalnie!"));
    return Results.Ok("Wiadomość wysłana!");
});

Podsumowanie

Używając metody RunAsEmulator(), zyskujesz:

  1. Oszczędność kosztów: Brak opłat za chmurę podczas developmentu.
  2. Wydajność: Brak opóźnień sieciowych w porównaniu do endpointów w chmurze.
  3. Praca offline: Możesz programować w pociągu, samolocie czy gdziekolwiek bez dostępu do Internetu.