RabbitMQ – это брокер сообщений, служба, отвечающая за обмен сообщениями между разными программными сервисами.
RabbitMQ держит сообщения в очереди (Queue), которая является именованным буфером, хранящим адресованные ему сообщения.
Программа, посылающая сообщения в очередь RabbitMQ, называется поставщиком (Producer).
Программа, принимающая сообщения, называется подписчиком (Consumer). Такие программы подписываются на события поступления сообщения в очередь, и всегда находятся в ожидании новых сообщений.
Множество поставщиков могут отправлять сообщения в очередь, и множество подписчиков могут считывать сообщения из очереди.
Запуск сервера 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
![](https://habrastorage.org/getpro/habr/upload_files/537/632/647/53763264722be6c85c051998cba0ac5b.png)
и
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
![](https://habrastorage.org/getpro/habr/upload_files/764/175/718/764175718259cc88d941d96b935895fe.png)
![](https://habrastorage.org/getpro/habr/upload_files/cf1/f3a/5ca/cf1f3a5ca7d58fd6566f2940e23646c5.png)
Окно командной строки не закрываем.
В приложении Docker Desktop, на вкладке Containers / Apps увидим запущенные контейнеры RabbitMQ:
![](https://habrastorage.org/getpro/habr/upload_files/810/05e/b26/81005eb26740e18bf236fdb294842e5a.png)
В браузере перейдем по ссылке localhost:15672. В поля имя пользователя и пароль введем guest и guest. Здесь мы можем управлять нашей службой RabbitMQ.
![](https://habrastorage.org/getpro/habr/upload_files/51f/2b8/e8c/51f2b8e8c377e72070a9e227e78bfa25.png)
1.2. Способ 2: Регистрация в облачном сервисе CloudAMQP и настройка сервиса RabbitMQ
Переходим по адресу https://www.cloudamqp.com/plans.html.
Выбираем бесплатный план Little Lemur (жмем Get Now).
![](https://habrastorage.org/getpro/habr/upload_files/aba/431/abe/aba431abedd8d65955515e00c421bb47.png)
Регистрируемся на сайте.
Создаем новую сущность (instance) RabbitMQ.
![](https://habrastorage.org/getpro/habr/upload_files/c2e/d1d/b88/c2ed1db88e18183fae430e7c55ab3b32.png)
На следующей странице выбираем доступный регион расположения сервера и жмем Review.
На странице Configure жмем Create Instance.
На следующей странице жмем на названии нашей новой сущности:
![](https://habrastorage.org/getpro/habr/upload_files/0ce/e45/2f1/0cee452f175c44904011a676ef54fdc0.png)
и попадаем в панель управления нашего экземпляра RabbitMQ:
![](https://habrastorage.org/getpro/habr/upload_files/149/0db/3ce/1490db3ce2d3bb9d3bee7a5c0df9b8d0.png)
Использование RabbitMQ в проектах ASP.NET Core
Создадим 2 проекта ASP.NET Core Web API: проект, который будет поставщиком (продюсером) сообщений, и проект, который будет подписчиком (консьюмером).
Для обоих проектов, после их создания на последующих шагах, необходимо выполнить установку NuGet пакета: RabbitMQ.Client.
Для этого в SolutionExplorer (Обозреватель решений) правой кнопкой мыши жмем по названию рабочего проекта и выбираем Manage NuGet Packages… (Управление пакетами Nuget).
Далее переходим на крайнюю левую вкладку Browse, и в строку поиска вводим название устанавливаемого пакета NuGet.
В левом окне выбираем нужный нам пакет, а в правом жмем кнопку Install.
![](https://habrastorage.org/getpro/habr/upload_files/3e7/879/1e2/3e78791e2c8d8cd52daed20f781f52af.png)
2.1. Создаем проект ASP.NET Core Web API с продюсером.
В Visual Studio создаем новый проект ASP.NET Core Web API:
![](https://habrastorage.org/getpro/habr/upload_files/61b/105/97a/61b10597a195039b608e1f1afffdecb8.png)
В новый проект добавляем NuGet пакет RabbitMQ.Client как описано выше.
В корне проекта создаем папку “RabbitMq”, и в этой папке создаем интерфейс:
public interface IRabbitMqService
{
void SendMessage(object obj);
void SendMessage(string message);
}
В этой же папке создаем класс:
using RabbitMQ.Client;
using System.Text;
using System.Text.Json;
public class RabbitMqService : IRabbitMqService
{
public void SendMessage(object obj)
{
var message = JsonSerializer.Serialize(obj);
SendMessage(message);
}
public void SendMessage(string message)
{
// Не забудьте вынести значения "localhost" и "MyQueue"
// в файл конфигурации
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.
![](https://habrastorage.org/getpro/habr/upload_files/41d/79b/42c/41d79b42c3c167e0178f34d88c43919d.png)
Вставим скопированную строку подключения в наш код:
var factory = new ConnectionFactory() { Uri = new Uri("строка_подключения") };
Тееперь продюсер будет отправлять сообщения в облачный сервис.
Добавим класс RabbitMqService в DI контейнер. Для этого добавим в метод ConfigureServices класса Startup следующую строку:
public void ConfigureServices(IServiceCollection services)
{
// другой код
services.AddScoped<IRabbitMqService, RabbitMqService>();
// другой код
}
В папку Controllers добавим новый API контроллер:
![](https://habrastorage.org/getpro/habr/upload_files/d90/445/a65/d90445a65065b04e3df654f9602a997a.png)
Добавим в него код:
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.
![](https://habrastorage.org/getpro/habr/upload_files/9bd/051/ea9/9bd051ea99860bf077643c1ac1317444.png)
В ответе мы должны получить статус код 200 и сообщение “Сообщение отправлено”.
Если вы используете локальный сервер RabbitMQ, переходим в панель управления локальным экземпляром RabbitMQ (http://localhost:15672).
Если вы используете облачный сервис CloudAMQP, переходим в его панель управления. В верхней части левого меню жмем кнопку RabbitMQ Manager и попадаем в такую же панель управления RabbitMQ, что и для локального экземпляра.
Перейдем на вкладку Queues, в табличке нажмем на наименовании нашей очереди ("MyQueue").
В списке внизу раскроем элемент Get messages, нажмем кнопку Get message(s), и увидим наше сообщение “Привет, Кролик!”:
![](https://habrastorage.org/getpro/habr/upload_files/72c/a76/68e/72ca7668e724eff405fb5390226942a3.png)
Продюсер работает.
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;
using System;
public class RabbitMqListener : BackgroundService
{
private IConnection _connection;
private IModel _channel;
public RabbitMqListener()
{
// Не забудьте вынести значения "localhost" и "MyQueue"
// в файл конфигурации
var factory = new ConnectionFactory { HostName = "localhost" };
_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;
}
public override void Dispose()
{
_channel.Close();
_connection.Close();
base.Dispose();
}
}
В данном примере мы создали консьюмер для локального сервера RabbitMQ:
var factory = new ConnectionFactory() { HostName = "localhost" };
Для облачного сервиса RabbitMQ нужно изменить эту строку так, как описано выше в разделе создания продюсера.
В метод ConfigureServices класса Startup добавим строчку:
services.AddHostedService<RabbitMqListener>();
Запустим оба проекта – продюсер и консьюмер.
Перейдем в сваггер продюсера, и отправим произвольное сообщение.
В окне Output from Debug появится наше сообщение, выведенное методом
Debug.WriteLine($"Получено сообщение: {content}");
нашего консьюмера.
![](https://habrastorage.org/getpro/habr/upload_files/d12/afd/4c3/d12afd4c391522944abb8478b5c931b0.png)
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();
}
}
И запускаем проект. Вывод полученного сообщение будет осуществлен в консоль.
PS: Данный туториал рассчитан в первую очередь на уже знакомую с предназначением описываемой технологии аудиторию и представляет из себя краткое руководство по быстрому применению базового функционала этой технологии в своих проектах. Туториал не претендует на полное и исчерпывающее пособие по затронутой тематике и не является рекламой. Идея написания этой, и серии подобных статей, была подсказана студентами, не владеющими в должной мере английским языком и испытывающими определенные трудности при поиске такого рода информации на просторах рунета.