Cvičení – odesílání zpráv mezi mikroslužbami prostřednictvím RabbitMQ

Dokončeno

RabbitMQ je spolehlivý zprostředkovatel zpráv, který poskytuje flexibilní výměny zpráv a fronty. Pokud chcete odesílat a přijímat zprávy prostřednictvím RabbitMQ v projektu .NET Aspire, musíte přidat kontejner RabbitMQ a pak vytvořit kód, který odesílá zprávy z jedné mikroslužby a přijímá je v jiné.

V tomto cvičení budete odesílat zprávy do fronty z projektu Catalog.API. Přidáte nový projekt služby na pozadí, který tyto zprávy obdrží z fronty a odešle je do protokolu konzoly pro zobrazení.

Požadavky na instalaci

Požadavky pro .NET Aspire jsou:

  • .NET 8
  • Visual Studio 2022 Preview
  • Docker Desktop nebo Podman
  • Úloha .NET Aspire v sadě Visual Studio

Pokud už máte tyto balíčky nainstalované, můžete přeskočit a začít pracovat s RabbitMQ.

Instalace .NET 8

Postupujte podle tohoto odkazu na .NET 8 a vyberte správný instalační program pro váš operační systém. Pokud například používáte Windows 11 a moderní procesor, vyberte sadu x64 .NET 8 SDK pro Windows.

Po dokončení stahování spusťte instalační program a postupujte podle pokynů. V okně terminálu spusťte následující příkaz a ověřte, že instalace proběhla úspěšně:

dotnet --version

Měli byste vidět číslo verze sady .NET SDK, kterou jste nainstalovali. Příklad:

8.0.300-preview.24203.14

Instalace sady Visual Studio 2022 Preview

Postupujte podle tohoto odkazu sady Visual Studio 2022 Preview a vyberte Stáhnout verzi Preview. Po dokončení stahování spusťte instalační program a postupujte podle pokynů.

Instalace Docker Desktopu

Postupujte podle tohoto odkazu na Docker Desktop a vyberte správný instalační program pro váš operační systém. Po dokončení stahování spusťte instalační program a postupujte podle pokynů. Pro zajištění nejlepšího výkonu a kompatibility použijte back-end WSL 2.

Otevřete aplikaci Docker Desktop a přijměte smlouvu o poskytování služeb.

Instalace úlohy .NET Aspire v sadě Visual Studio

Nainstalujte úlohu .NET Aspire pomocí rozhraní příkazového řádku .NET:

  1. Otevřete terminál.

  2. Aktualizujte úlohy .NET pomocí tohoto příkazu:

    dotnet workload update
    

    Měla by se zobrazit zpráva, že se úlohy úspěšně aktualizovaly.

    No workloads installed for this feature band. To update workloads installed with earlier SDK versions, include the --from-previous-sdk option.
    Updated advertising manifest microsoft.net.sdk.ios.
    Updated advertising manifest microsoft.net.workload.mono.toolchain.net6.
    Updated advertising manifest microsoft.net.sdk.android.
    Updated advertising manifest microsoft.net.workload.emscripten.net7.
    Updated advertising manifest microsoft.net.workload.emscripten.net6.
    Updated advertising manifest microsoft.net.sdk.macos.
    Updated advertising manifest microsoft.net.workload.emscripten.current.
    Updated advertising manifest microsoft.net.workload.mono.toolchain.current.
    Updated advertising manifest microsoft.net.sdk.maui.
    Updated advertising manifest microsoft.net.workload.mono.toolchain.net7.
    Updated advertising manifest microsoft.net.sdk.maccatalyst.
    Updated advertising manifest microsoft.net.sdk.tvos.
    Updated advertising manifest microsoft.net.sdk.aspire.
    No workloads installed for this feature band. To update workloads installed with earlier SDK versions, include the --from-previous-sdk option.
    
    Successfully updated workload(s): .
    
  3. Pomocí tohoto příkazu nainstalujte úlohu .NET Aspire:

    dotnet workload install aspire
    

    Měla by se zobrazit zpráva, že je nainstalovaná úloha Aspire.

    Installing Aspire.Hosting.Sdk.Msi.x64 ...... Done
    Installing Aspire.ProjectTemplates.Msi.x64 ..... Done
    Installing Aspire.Hosting.Orchestration.win-x64.Msi.x64 ............. Done
    Installing Aspire.Hosting.Msi.x64 ..... Done
    Installing Aspire.Dashboard.Sdk.win-x64.Msi.x64 ....... Done
    
    Successfully installed workload(s) aspire.
    
  4. Pomocí tohoto příkazu ověřte, že je nainstalovaná úloha .NET Aspire:

    dotnet workload list
    

    Měli byste vidět podrobnosti o úloze .NET Aspire.

     Installed Workload Id      Manifest Version      Installation Source
    ---------------------------------------------------------------------------------------------
    aspire                     8.0.0/8.0.100         SDK 8.0.300-preview.24203, VS 17.10.34902.84
    
    Use `dotnet workload search` to find additional workloads to install.
    

Klonování projektu

Pojďme použít git k získání ukázkové aplikace, která zatím nepoužívá zprostředkovatele zpráv:

  1. Na příkazovém řádku přejděte do složky podle vašeho výběru, kde můžete pracovat s kódem.

  2. Spuštěním následujícího příkazu naklonujte ukázkovou aplikaci:

    git clone -b aspire-rabbitmq  https://github.com/MicrosoftDocs/mslearn-aspire-starter
    

Vytvoření kontejneru RabbitMQ

Začněme přidáním RabbitMQ do hostitelského projektu aplikace. Když spustíme řešení, .NET Aspire přidá do aplikace kontejner RabbitMQ a předá odkazy na projekty, které ho používají:

  1. Spusťte Visual Studio a vyberte Otevřít projekt nebo řešení.

  2. Přejděte do složky, do které jste projekt naklonovali.

  3. Poklikejte na počáteční složku, vyberte eShop.rabbitmq.sln řešení a pak vyberte Otevřít.

  4. V Průzkumník řešení klikněte pravým tlačítkem na projekt eShop.AppHost, vyberte Přidat a pak vyberte balíček .NET Aspire.

  5. Do vyhledávacího textového pole na konci existujícího textu zadejte RabbitMQ.

  6. Vyberte balíček Aspire.Hosting.RabbitMQ .

  7. V seznamu verzí vyberte nejnovější verzi 8.0.0 a pak vyberte Nainstalovat.

  8. Pokud se zobrazí dialogové okno Náhled změn, vyberte Použít.

  9. V dialogovém okně Přijetí licence vyberte Přijmout.

  10. V Průzkumník řešení rozbalte eShop.AppHost a poklikejte na Program.cs.

  11. Najděte tento řádek kódu:

    var builder = DistributedApplication.CreateBuilder(args);
    
  12. Ihned za tímto kódem přidejte tento kód pro registraci serveru RabbitMQ:

    var messaging = builder.AddRabbitMQ("messaging");
    
  13. Vyhledejte následující kód, který zaregistruje projekt Catalog.API pro orchestraci .NET Aspire:

    var catalogApi = builder.AddProject<Catalog_API>("catalog-api")
        .WithReference(catalogDb);
    
  14. Pokud chcete předat službu RabbitMQ do projektu Catalog.API , upravte tento kód tak, aby odpovídal tomuto kódu:

    var catalogApi = builder.AddProject<Catalog_API>("catalog-api")
        .WithReference(catalogDb)
        .WithReference(messaging);
    

Přidání RabbitMQ do projektu Catalog.API

Teď můžeme nainstalovat a nakonfigurovat RabbitMQ v projektu Catalog.API:

  1. V sadě Visual Studio klikněte v Průzkumník řešení pravým tlačítkem na projekt Catalog.API, vyberte Přidat a pak vyberte balíček .NET Aspire.

  2. Do vyhledávacího textového pole na konci existujícího textu zadejte RabbitMQ.

  3. Vyberte balíček Aspire.RabbitMQ.Client.

  4. V seznamu verzí vyberte nejnovější verzi 8.0.0 a pak vyberte Nainstalovat.

  5. Pokud se zobrazí dialogové okno Náhled změn, vyberte Použít.

  6. V dialogovém okně Přijetí licence vyberte Přijmout.

  7. V Průzkumník řešení rozbalte projekt Catalog.API a poklikejte na Program.cs.

  8. V souboru Program.cs vyhledejte následující řádek kódu:

    var builder = WebApplication.CreateBuilder(args);
    
  9. Hned za tento řádek přidejte tento kód, který zaregistruje připojení RabbitMQ:

    builder.AddRabbitMQClient("messaging");
    

Odeslání zprávy do fronty RabbitMQ

Když uživatel požádá o položky v katalogu, chceme odeslat zprávu do fronty RabbitMQ, která popisuje podrobnosti žádosti. Teď přidáme tento kód:

  1. V Průzkumník řešení rozbalte položku Catalog.API > Apis a poklikejte na CatalogApi.cs.

  2. Vyhledejte následující kód, který deklaruje metodu GetAllItems() :

    public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems(
        [AsParameters] PaginationRequest paginationRequest,
        [AsParameters] CatalogServices services)
    {
    
  3. Chcete-li použít injektáž závislostí k získání připojení k RabbitMQ, upravte kód tak, aby odpovídal následujícím řádkům:

    public static async Task<Results<Ok<PaginatedItems<CatalogItem>>, BadRequest<string>>> GetAllItems(
        [AsParameters] PaginationRequest paginationRequest,
        [AsParameters] CatalogServices services,
        RabbitMQ.Client.IConnection connection)
    {
    
  4. Najděte tento řádek kódu:

    var totalItems = await services.DbContext.CatalogItems
        .LongCountAsync();
    
  5. Hned za tento řádek přidejte tento kód, abyste vytvořili kanál zasílání zpráv RabbitMQ:

    var channel = connection.CreateModel();
    
  6. Pokud chcete vytvořit frontu zpráv, přidejte na další řádek tento kód:

    channel.QueueDeclare(queue: "catalogEvents",
                         durable: false,
                         exclusive: false,
                         autoDelete: false,
                         arguments: null);
    
  7. Na další řádek odešlete zprávu tak, že přidáte tento kód:

    var body = Encoding.UTF8.GetBytes("Getting all items in the catalog.");
    
    channel.BasicPublish(exchange: string.Empty,
                         routingKey: "catalogEvents",
     					 mandatory: false,
                         basicProperties: null,
                         body: body);
    

Přidání projektu příjemce zprávy

Pokud chcete přijímat zprávy z fronty RabbitMQ, vytvoříme nový projekt:

  1. V Průzkumník řešení klikněte pravým tlačítkem na řešení, přejděte na příkaz Přidat a vyberte Nový projekt.

  2. Do textového pole Hledat šablony zadejte Konzola.

  3. Vyberte šablonu konzolové aplikace jazyka C# a pak vyberte Další.

  4. Do textového pole Název projektu zadejte RabbitConsumer a pak vyberte Další.

  5. V seznamu Rozhraní se ujistěte, že je vybraná možnost .NET 8.0, a pak vyberte Vytvořit.

  6. V Průzkumník řešení klikněte pravým tlačítkem na projekt AppHost, přejděte na příkaz Přidat a vyberte Odkaz na projekt.

  7. V seznamu projektů se ujistěte, že je vybraný RabbitConsumer , a pak vyberte OK.

    Snímek obrazovky znázorňující, jak přidat odkaz na projekt AppHost, který odkazuje na projekt RabbitConsumer

  8. V Průzkumník řešení rozbalte AppHost a poklikejte na Program.cs.

  9. Vyhledejte následující kód:

    builder.AddProject<WebApp>("webapp")
        .WithReference(catalogApi);
    
  10. Ihned za tímto kódem přidejte projekt RabbitConsumer do orchestrace .NET Aspire, přidejte následující kód:

    builder.AddProject<Projects.RabbitConsumer>("consumers")
        .WithReference(messaging);
    

Konfigurace projektu příjemce zpráv

Než budeme moct přijímat zprávy v novém projektu příjemce zpráv, musíme ji nakonfigurovat tak, aby používala backingovou službu RabbitMQ z AppHost:

  1. V sadě Visual Studio klikněte v Průzkumník řešení pravým tlačítkem myši na projekt RabbitConsumer, vyberte Přidat a pak vyberte balíček .NET Aspire.

  2. Do vyhledávacího textového pole na konci existujícího textu zadejte RabbitMQ.

  3. Vyberte balíček Aspire.RabbitMQ.Client.

  4. V seznamu verzí vyberte nejnovější verzi 8.0.0 a pak vyberte Nainstalovat.

  5. Pokud se zobrazí dialogové okno Náhled změn, vyberte Použít.

  6. V dialogovém okně Přijetí licence vyberte Přijmout.

  7. V Průzkumník řešení klikněte pravým tlačítkem myši na projekt RabbitConsumer, přejděte na příkaz Přidat a vyberte Odkaz na projekt.

  8. V seznamu projektů se ujistěte, že je vybraná možnost eShop.ServiceDefaults , a pak vyberte OK.

    Snímek obrazovky znázorňující, jak přidat odkaz na projekt RabbitConsumer, který odkazuje na projekt ServiceDefaults

  9. V Průzkumník řešení rozbalte projekt RabbitConsumer a poklikejte na Program.cs.

  10. Odeberte veškerý výchozí kód a nahraďte ho následujícími řádky:

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    
    var builder = Host.CreateApplicationBuilder(args);
    
    builder.AddServiceDefaults();
    
    builder.AddRabbitMQClient("messaging");
    
    var host = builder.Build();
    
    host.Run();
    

    Všimněte si, že kód používá orchestraci .NET Aspire k přidání služby RabbitMQ do projektu příjemce. Tuto službu použijete k načtení zpráv.

Přijetí zprávy RabbitMQ

Abychom dostali zprávu, musíme vytvořit komponentu, která běží na pozadí a čeká na doručení zpráv. BackgroundService Pro tento úkol použijte třídu:

  1. V Průzkumník řešení klikněte pravým tlačítkem myši na projekt RabbitConsumer, přejděte na příkaz Přidat a vyberte Třídu.

  2. Do textového pole Název zadejte CatalogProcessingJob a pak vyberte Přidat.

  3. Ve třídě CatalogProcessingJob.cs odeberte veškerý výchozí kód a nahraďte ho následujícími řádky:

     namespace RabbitConsumer;
    
    using System.Text;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    using RabbitMQ.Client;
    using RabbitMQ.Client.Events;
    
    public class CatalogProcessingJob : BackgroundService
    {
        private readonly ILogger<CatalogProcessingJob> _logger;
        private readonly IConfiguration _config;
        private readonly IServiceProvider _serviceProvider;
        private IConnection? _messageConnection;
        private IModel? _messageChannel;
     	private EventingBasicConsumer consumer;
    
        public CatalogProcessingJob(ILogger<CatalogProcessingJob> logger, IConfiguration config, IServiceProvider serviceProvider, IConnection? messageConnection)
        {
            _logger = logger;
            _config = config;
            _serviceProvider = serviceProvider;
        }
    
        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            string queueName = "catalogEvents";
    
            _messageConnection = _serviceProvider.GetRequiredService<IConnection>();
    
            _messageChannel = _messageConnection.CreateModel();
            _messageChannel.QueueDeclare(queue: queueName,
                durable: false,
                exclusive: false,
                autoDelete: false,
                arguments: null);
    
            consumer = new EventingBasicConsumer(_messageChannel);
            consumer.Received += ProcessMessageAsync;
    
            _messageChannel.BasicConsume(queue:  queueName,
                autoAck: true, 
                consumer: consumer);
    
            return Task.CompletedTask;
        }
    
        public override async Task StopAsync(CancellationToken cancellationToken)
        {
            await base.StopAsync(cancellationToken);
            consumer.Received -= ProcessMessageAsync;
            _messageChannel?.Dispose();
        }
    
        private void ProcessMessageAsync(object? sender, BasicDeliverEventArgs args)
        {
    
            string messagetext = Encoding.UTF8.GetString(args.Body.ToArray());
            _logger.LogInformation("All products retrieved from the catalog at {now}. Message Text: {text}", DateTime.Now, messagetext);
    
            var message = args.Body;
        }
    }
    
  4. V Průzkumník řešení v projektu RabbitConsumer poklikejte na Program.cs.

  5. Vyhledejte následující kód:

    builder.AddRabbitMQClient("messaging");
    
  6. Bezprostředně za tento řádek přidejte následující kód:

    builder.Services.AddHostedService<CatalogProcessingJob>();
    

Testování řešení

Pojďme otestovat naši backingovou službu RabbitMQ a mikroslužby, které odesílají a přijímají zprávy:

  1. V sadě Visual Studio spusťte aplikaci v režimu ladění stisknutím klávesy F5 nebo vyberte > Spustit ladění.

  2. Pokud se zobrazí zpráva Start Docker Desktop , vyberte Ano. Aplikace se spustí a zobrazí řídicí panel .NET Aspire na kartě prohlížeče.

  3. Na řídicím panelu .NET Aspire v seznamu prostředků si všimněte, že seznam obsahuje nový kontejner se zasíláním zpráv názvů. Zdroj zahrnuje rabbitmq:3. Tento kontejner spouští zprostředkovatele zpráv RabbitMQ.

    Snímek obrazovky zobrazující kontejner RabbitMQ zobrazený na řídicím panelu .NET Aspire

  4. V levém navigačním panelu vyberte Konzola.

  5. V seznamu Vybrat prostředek vyberte zasílání zpráv. Na stránce se zobrazí protokoly konzoly pro zprostředkovatele RabbitMQ. Všimněte si, že posledních několik zpráv značí, že RabbitMQ dokončil spuštění a přijal jedno připojení. Toto připojení pochází z přijímajícího projektu RabbitConsumer .

  6. V levém navigačním panelu vyberte Prostředky.

  7. Na řádku projektu webové aplikace ve sloupci Koncové body vyberte jeden z odkazů. Otevře se domovská stránka Northern Traders a zobrazí katalog produktů. Tato stránka odešle zprávu do fronty RabbitMQ.

    Snímek obrazovky znázorňující přístup ke koncovému bodu projektu webové aplikace z řídicího panelu .NET Aspire

  8. Přepněte zpět na řídicí panel .NET Aspire. V levém navigačním panelu vyberte Konzola.

  9. V seznamu Vybrat prostředek vyberte zasílání zpráv. Všimněte si, že RabbitQ přijal druhé připojení. Toto připojení pochází z projektu Catalog.API .

  10. V seznamu Vybrat prostředek vyberte uživatele. Tento protokol je určený pro projekt RabbitConsumer . Poslední položka zobrazí zprávu "Získání všech položek v katalogu". Tato zpráva byla načtena z RabbitMQ a zaznamenána.

    Snímek obrazovky zobrazující zprávu načtenou z fronty RabbitMQ a zobrazenou v protokolech konzoly pro projekt příjemce