RabbitMQ в ASP.NET Core

от автора

RabbitMQ – это брокер сообщений, служба, отвечающая за обмен сообщениями между разными программными сервисами.

RabbitMQ держит сообщения в очереди (Queue), которая является именованным буфером, хранящим адресованные ему сообщения.

Программа, посылающая сообщения в очередь RabbitMQ, называется поставщиком (Producer).

Программа, принимающая сообщения, называется подписчиком (Consumer). Такие программы подписываются на события поступления сообщения в очередь, и всегда находятся в ожидании новых сообщений.

Множество поставщиков могут отправлять сообщения в очередь, и множество подписчиков могут считывать сообщения из очереди.

  1. Запуск сервера RabbitMQ

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

1.1. Способ 1: Запуск сервера RabbitMQ в докер контейнере на своем локальном компьютере

Для этого нам необходимо, чтобы на нашем компьютере предварительно было установлено программное обеспечение Docker Desktop.

— Для этого переходим по ссылке https://www.docker.com/products/docker-desktop, скачиваем установщик и запускаем его.

Важно выбрать опции Enable Hyper-V Windows Features или Install required Windows components for WSL 2, когда установщик об этом спросит.

Следуем инструкциям установщика, и по завершении процесса установки жмем кнопку Close.

Находим Docker Desktop в списке установленных на компьютере программ, и запускаем его.

В командной строке Windows или в PowerShell поочередно запускаем две следующие команды:

docker run -d --hostname my-rabbit-host --name my-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management

и

docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

Окно командной строки не закрываем.

В приложении Docker Desktop, на вкладке Containers / Apps увидим запущенные контейнеры RabbitMQ:

В браузере перейдем по ссылке localhost:15672. В поля имя пользователя и пароль введем guest и guest. Здесь мы можем управлять нашей службой RabbitMQ.

1.2. Способ 2: Регистрация в облачном сервисе CloudAMQP и настройка сервиса RabbitMQ

Переходим по адресу https://www.cloudamqp.com/plans.html.

Выбираем бесплатный план Little Lemur (жмем Get Now).

Регистрируемся на сайте.

Создаем новую сущность (instance) RabbitMQ.

На следующей странице выбираем доступный регион расположения сервера и жмем Review.

На странице Configure жмем Create Instance.

На следующей странице жмем на названии нашей новой сущности:

и попадаем в панель управления нашего экземпляра RabbitMQ:

  1. Использование  RabbitMQ в проектах ASP.NET Core

Создадим 2 проекта ASP.NET Core Web API: проект, который будет поставщиком (продюсером) сообщений, и проект, который будет подписчиком (консьюмером).

Для обоих проектов, после их создания на последующих шагах, необходимо выполнить установку NuGet пакета: RabbitMQ.Client.

Для этого в SolutionExplorer (Обозреватель решений) правой кнопкой мыши жмем по названию рабочего проекта и выбираем Manage NuGet Packages… (Управление пакетами Nuget).

Далее переходим на крайнюю левую вкладку Browse, и в строку поиска вводим название устанавливаемого пакета NuGet.

В левом окне выбираем нужный нам пакет, а в правом жмем кнопку Install.

2.1. Создаем проект ASP.NET Core Web API с продюсером.

В Visual Studio создаем новый проект ASP.NET Core Web API:

В новый проект добавляем NuGet пакет RabbitMQ.Client как описано выше.

В корне проекта создаем папку “RabbitMq”, и в этой папке создаем интерфейс:

public interface IRabbitMqService { void SendMessage(string message); }

В этой же папке создаем класс:

using RabbitMQ.Client; using System.Text;  public class RabbitMqService : IRabbitMqService { public void SendMessage(string message) { var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "MyQueue",                            durable: false,                            exclusive: false,                            autoDelete: false,                            arguments: null);  var body = Encoding.UTF8.GetBytes(message);  channel.BasicPublish(exchange: "",                            routingKey: "MyQueue",                            basicProperties: null,                            body: body); } } }

В данном примере мы создали продюсер для локального сервера RabbitMQ:

var factory = new ConnectionFactory() { HostName = "localhost" };

Для облачного сервиса RabbitMQ нужно изменить эту строку.

Перейдем в панель управления CloudAMQP, и нажмем значок “скопировать” напротив строки подключения: AMQP URL.

Вставим скопированную строку подключения в наш код:

var factory = new ConnectionFactory() { Uri = new Uri("строка_подключения") };

Тееперь продюсер будет отправлять сообщения в облачный сервис.

Добавим класс RabbitMqService в DI контейнер. Для этого добавим в метод ConfigureServices класса Startup следующую строку:

public void ConfigureServices(IServiceCollection services) { // другой код services.AddScoped<IRabbitMqService, RabbitMqService>(); // другой код }

В папку Controllers добавим новый API контроллер:

Добавим в него код:

using Microsoft.AspNetCore.Mvc; using RabbitMqProducer.RabbitMq;  [Route("api/[controller]")] [ApiController] public class RabbitMqController : ControllerBase { private readonly IRabbitMqService _mqService;  public RabbitMqController(IRabbitMqService mqService) { _mqService = mqService; }  [Route("[action]/{message}")] [HttpGet] public IActionResult SendMessage(string message) { _mqService.SendMessage(message);  return Ok("Сообщение отправлено"); } }

Запустим проект, и в сваггере (https://localhost:ваш_порт/swagger/index.html) вызовем метод SendMessage, передав в качестве параметра произвольную строку. Для этого нажмем на строке этого метода, в открывшейся панели вверху справа нажмем кнопку Try it out, и в окне message введем наше сообщение. Нажмем кнопку Execute.

В ответе мы должны получить статус код 200 и сообщение “Сообщение отправлено”.

Если вы используете локальный сервер RabbitMQ, переходим в панель управления локальным экземпляром RabbitMQ (http://localhost:15672).

Если вы используете облачный сервис CloudAMQP, переходим в его панель управления. В верхней части левого меню жмем кнопку RabbitMQ Manager и попадаем в такую же панель управления RabbitMQ, что и для локального экземпляра.

Перейдем на вкладку Queues, в табличке нажмем на наименовании нашей очереди («MyQueue»).

В списке внизу раскроем элемент Get messages, нажмем кнопку Get message(s), и увидим наше сообщение “Привет, Кролик!”:

Продюсер работает. 

2.2. Создаем проект ASP.NET Core Web API с консьюмером. 

В Visual Studio создаем новый проект ASP.NET Core Web API.

В новый проект добавляем NuGet пакет RabbitMQ.Client как описано выше.

В корне проекта создаем папку “RabbitMq”, и в этой папке создаем класс:

using RabbitMQ.Client.Events; using RabbitMQ.Client; using System.Threading.Tasks; using System.Threading; using Microsoft.Extensions.Hosting; using System.Text; using System.Diagnostics;   public class RabbitMqListener : BackgroundService {         private readonly IModel _channel;  public RabbitMqListener() { var factory = new ConnectionFactory { HostName = "localhost" }; var connection = factory.CreateConnection(); _channel = connection.CreateModel(); _channel.QueueDeclare(queue: "MyQueue", durable: false, exclusive: false, autoDelete: false, arguments: null); }  protected override Task ExecuteAsync(CancellationToken stoppingToken) { stoppingToken.ThrowIfCancellationRequested();  var consumer = new EventingBasicConsumer(_channel); consumer.Received += (ch, ea) => { var content = Encoding.UTF8.GetString(ea.Body.ToArray());  Debug.WriteLine($"Получено сообщение: {content}");  _channel.BasicAck(ea.DeliveryTag, false); };  _channel.BasicConsume("MyQueue", false, consumer);  return Task.CompletedTask; } }

В данном примере мы создали консьюмер для локального сервера RabbitMQ:

var factory = new ConnectionFactory() { HostName = "localhost" };

Для облачного сервиса RabbitMQ нужно изменить эту строку так, как описано выше в разделе создания продюсера.

В метод ConfigureServices класса Startup добавим строчку:

services.AddHostedService<RabbitMqListener>();

Запустим оба проекта – продюсер и консьюмер.

Перейдем в сваггер продюсера, и отправим произвольное сообщение.

В окне Output from Debug появится наше сообщение, выведенное методом

Debug.WriteLine($"Получено сообщение: {content}");

нашего консьюмера.

2.3. Создаем проект .NET Core Console App с консьюмером.

Для этого в метод Main класса Program нового проекта добавляем следующий код:

using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text;  static void Main(string[] args) { var factory = new ConnectionFactory() { HostName = "localhost" };   //var factory = new ConnectionFactory() { Uri = new Uri("строка_подключения_облако") }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "MyQueue",  durable: false,  exclusive: false,  autoDelete: false,  arguments: null);  var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body.ToArray(); var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] Received {0}", message); }; channel.BasicConsume(queue: "MyQueue",  autoAck: true,  consumer: consumer);  Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } }

И запускаем проект. Вывод полученного сообщение будет осуществлен в консоль.


ссылка на оригинал статьи https://habr.com/ru/post/649915/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *