Odesílání zpráv pomocí RabbitMQ

Dokončeno

Je jednoduché napsat kód, který vytváří fronty, odesílá zprávy a přijímá zprávy z RabbitMQ. V řešení .NET Aspire také potřebujete pomoct vytvořit kontejner RabbitMQ a připojit se k němu z mikroslužeb.

Ve svém prodejci venkovních zařízení jste se rozhodli implementovat RabbitMQ jako centralizovaného zprostředkovatele zpráv pro web katalogu produktů určených pro zákazníky. Ke správě tohoto zprostředkovatele a jeho front chcete použít komponentu .NET Aspire RabbitMQ.

V této lekci se dozvíte, jak vytvořit kontejner RabbitMQ a jak ho použít k odesílání a přijímání zpráv.

Použití komponenty .NET Aspire RabbitMQ

Při použití RabbitMQ z .NET obvykle musíte vytvořit ConnectionFactory objekt s připojovací řetězec a pak ho použít k vytvoření připojení ke službě. V projektu .NET Aspire je jednodušší spravovat připojení RabbitMQ, protože:

  • V projektu AppHost zaregistrujete připojení a připojovací řetězec.
  • Když službě předáte odkaz na využívání projektů, můžou pomocí injektáže závislostí získat připojení k RabbitMQ. Nepotřebují vytvářet a konfigurovat vlastní připojení.

Konfigurace RabbitMQ v hostiteli aplikace

V rozhraní .NET Aspire musíte nainstalovat komponentu hostování Rabbit MQ v hostiteli aplikace:

dotnet add package Aspire.Hosting.RabbitMQ

Nyní můžete zaregistrovat službu RabbitMQ a předat ji projektům, které ji používají:

// Service registration
var rabbit = builder.AddRabbitMQ("messaging");

// Service consumption
builder.AddProject<Projects.CatalogAPI>()
       .WithReference(rabbit);

Spravuje AppHost připojení pro všechny projekty v řešení.

Konfigurace Rabu

Dále přidejte komponentu .NET Aspire RabbitMQ do každého projektu, který ji používá:

dotnet add package Aspire.RabbitMQ.Client

Pokud chcete získat odkaz na zprostředkovatele zpráv RabbitMQ, zavolejte metodu AddRabbitMQClient() :

builder.AddRabbitMQClient("messaging");

Teď můžete pomocí injektáže závislostí získat připojení k RabbitMQ:

public class CatalogAPI(IConnection rabbitConnection)
{
    // Send and receive messages here
}

Dalším krokem při připojení je vytvoření kanálu pro zasílání zpráv, například takto:

var channel = connection.CreateModel();

Odesílání zpráv

Jakmile máte kanál pro zasílání zpráv, můžete ho použít k nastavení front, výměn a dalších součástí topologie zasílání zpráv. Například k vytvoření fronty použijte tento kód:

channel.QueueDeclare(queue: "catalogEvents",
    durable: false,
    exclusive: false,
    autoDelete: false,
    arguments: null);

Metodu BasicPublish použijete k odeslání zprávy do této fronty, ale zpráva očekává, že text bude pole bajtů:

var body = Encoding.UTF8.GetBytes("Getting all items in the catalog.");

channel.BasicPublish(exchange: string.Empty,
    routingKey: "catalogEvents",
    basicProperties: null,
    body: body);

Příjem zpráv

V přijímající komponentě vytvoříte kanál pro zasílání zpráv a frontu stejným způsobem jako pro odesílatele. Ujistěte se, že název fronty odpovídá názvu fronty, který jste vytvořili v odesílající komponentě. V opačném případě vytvoříte dvě samostatné fronty a zprávy nedorazí do správného cíle.

Musíte vytvořit novou EventingBasicConsumer() metodu a zaregistrovat metodu Received pro zpracování události:

var consumer = new EventingBasicConsumer(channel);
consumer.Received += ProcessMessageAsync;

Obslužná rutina zprávy používá BasicDeliverEventArgs objekt k získání vlastností zprávy, včetně textu zprávy. Je nutné pamatovat na deserializaci textu zprávy:

private void ProcessMessageAsync(object? sender, BasicDeliverEventArgs args)
{
    string messagetext = Encoding.UTF8.GetString(args.Body.ToArray());
    logger.LogInformation("The message is: {text}", messagetext);
}

Nakonec chcete-li zkontrolovat frontu pro nové zprávy, zavolejte metodu BasicConsume() ;

channel.BasicConsume(queue:  queueName,
                    autoAck: true, 
                    consumer: consumer);

Další informace