Эта серия представляет собой краткий обзор книги «RabbitMQ в действии: эффективное развертывание распределенных очередей сообщений».
ПредыдущийПредставленная передача сообщений AMQP, включая очереди, обмены и привязки, данные и разрешения также могут быть изолированы через виртуальные хосты, режимы сохранения сообщений и подтверждения отправителя гарантируют, что сообщения не будут потеряны.
Эта статья в основном знакомит с тем, как запускать и управлять RabbitMQ. Перед введением будет демонстрация для демонстрации отправки и получения сообщений. С одной стороны, она будет иметь более интуитивное понимание элементов AMQP, а с другой с другой стороны, он будет служить источником данных для мониторинга, который будет введен позже.
Через введение вы узнаете:
- Простая реализация отправки и получения сообщений
- Администрирование сервера — запуск и остановка узлов
- Профиль прав
- статистика использования
Портал благосостояния:Xiaoai динамик F код
Простая реализация отправки и получения сообщений
Эта демонстрация в основном используется для сбора журналов, отправителем сообщений является каждая подсистема приложения, а получателем сообщений является служба сбора журналов, которую можно легко реализовать с помощью RabbitMQ.
На основе реализации фреймворка Spring Boot функции основных классов следующие:
- LogRabbitConfig: создание очередей, обменов, привязок и других операций инициализации;
- Отправитель: отправитель сообщения;
- AllReceiver: Получатели логов всех уровней, получать логи всех уровней;
- ErrorReceiver: приемник журнала уровня ошибки, принимает только журналы уровня ошибки;
- LogSenderTest: класс тестового примера;
Модель сообщения выглядит следующим образом:
настроить
Сначала настройте зависимости spring boot и rabbitmq:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--rabbitmq依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
Затем настройте адрес rabbitmq в файле application.properties:
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.virtual-host=/
Реализация LogRabbitConfig
Используйте Spring @Configuration для определения класса конфигурации, который может заменить файл конфигурации xml.Аннотированный класс содержит один или несколько методов, аннотированных с помощью @Bean, которые используются для построения определений bean-компонентов и инициализации контейнера Spring.
@Configuration
public class LogRabbitConfig {
final static String QUEUE_LOG_ERROR = "log.error";
final static String QUEUE_LOG_ALL = "log.all";
//创建log.error队列
@Bean
public Queue logError() {
return new Queue(QUEUE_LOG_ERROR);
}
//创建log.all队列
@Bean
public Queue logAll() {
return new Queue(QUEUE_LOG_ALL);
}
//创建exchange,命名为log
@Bean
TopicExchange exchange() {
return new TopicExchange("log");
}
//绑定log.error队列到exchange,routingkey为log.error
@Bean
Binding bindingExchangeError(Queue logError, TopicExchange exchange) {
return BindingBuilder.bind(logError).to(exchange).with("log.error");
}
//绑定log.all队列到exchange,routingkey为log.#
@Bean
Binding bindingExchangeAll(Queue logAll, TopicExchange exchange) {
return BindingBuilder.bind(logAll).to(exchange).with("log.#");
}
}
Реализация отправителя
Каждая подсистема отправляет сообщение серверу rabbitmq:
@Component
public class Sender {
@Autowired
private AmqpTemplate rabbitTemplate;
public void send() {
//向mq服务端发送消息,exchange为log,routingkey为log.error
String context = "error log";
this.rabbitTemplate.convertAndSend("log", "log.error", context);
//向mq服务端发送消息,exchange为log,routingkey为log.info
context = "info log";
System.out.println("send msg : " + context);
this.rabbitTemplate.convertAndSend("log", "log.info", context);
//向mq服务端发送消息,exchange为log,routingkey为log.warn
context = "warn log";
System.out.println("send msg : " + context);
this.rabbitTemplate.convertAndSend("log", "log.warn", context);
}
}
Реализация AllReceiver и ErrorReceiver
Получать сообщения от сервера rabbitmq.
AllReceiver получает сообщения из очереди log.all сервера, поскольку связанный с ним ключ маршрутизации — «log.#», поэтому он будет получать журналы всех уровней:
@Component
@RabbitListener(queues = "log.all")
public class AllReceiver {
@RabbitHandler
public void process(String context) {
System.out.println("receive log : " + context);
}
}
ErrorReceiver получает сообщения из очереди log.error сервера. Поскольку ключ маршрутизации, к которому он привязан, — «log.error», он будет получать только журналы уровня ошибок:
@Component
@RabbitListener(queues = "log.error")
public class ErrorReceiver {
@RabbitHandler
public void process(String context) {
System.out.println("receive error : " + context);
}
}
Тестовый пример LogSenderTest
Тестовый пример очень прост: нужно вызвать Sender для отправки сообщения и наблюдать за получением сообщения.
@RunWith(SpringRunner.class)
@SpringBootTest
@SpringBootApplication
public class LogSenderTest {
@Autowired
Sender sender;
@Test
public void sendLog() {
sender.send();
}
}
Журнал работы выглядит следующим образом:
Видно, что ошибка получена дважды, что указывает на то, что обмен распространяется в очереди log.all и log.error одновременно, а логи других уровней распределяются в очередь log.all.
Администрирование сервера — запуск и остановка узлов
RabbitMQ написан на Erlang, Erlang по своей сути позволяет приложениям взаимодействовать друг с другом, не зная, находятся ли они на одной машине, что упрощает кластеризацию и надежную маршрутизацию сообщений.
Понимание приложений Node и Erlang
Подобно Java с виртуальной машиной JVM, Erlang также имеет виртуальную машину. Каждый экземпляр виртуальной машины называется «узлом». Разница в том, что несколько приложений Erlang могут работать на одном узле. автоматически попытается перезапустить приложение автоматически.
Работа узла:
后台启动节点:./rabbitmq-server -detached
停止节点:./rabbitmqctl stop
仅停止rabbit应用程序:./rabbitmqctl stop_app
конфигурационный файл
Формат конфигурационного файла, по сути, представляет собой необработанную структуру данных Erlang, массив, содержащий вложенные хеш-таблицы, как показано ниже:
[
[mnesia , [{dump_log_write_threshold , 1000}]],
[rabbit , [{vm_memory_high_wateremark , 0.4}]]
]
Два приложения настроены выше, каждое приложение будет иметь свою хеш-таблицу для настройки параметров:
- mnesia: используется rabbitmq для хранения метаданных обмена и очереди;
- rabbit: параметр конфигурации, специфичный для rabbitmq;
Если для каждого приложения есть несколько вариантов, разделите их запятыми.
Профиль прав
В системе разрешений RabbitMQ один пользователь может авторизоваться на нескольких виртуальных хостах, а также может отдельно разрешать чтение, запись и настройку.
Сначала создайте пользователя dongqingqing с паролем 123456:
./rabbitmqctl add_user dongqingqing 123456
Предоставить разрешение пользователя dongqingqing, может читать все очереди и обмены, может записывать очереди и обмены только в формате log.*, не может создавать или удалять очереди и обмены
./rabbitmqctl set_permissions dongqingqing ".*" "log.*" ""
Параметры после set_permissions — это имя пользователя, разрешение на чтение, разрешение на запись и разрешение на настройку.
Другие подробные варианты использования см. в документации.
статистика использования
Посмотреть статистику
Статистику данных, такую как количество очередей и сообщений, обменов и привязок, можно просмотреть с помощью команды rabbitmqctl.
Просмотрите все очереди, включая log.all и log.error, определенные в приведенной выше демонстрации:
Просмотрите все обмены, включая журнал, определенный в приведенной выше демонстрации.
Кроме того, rabbitmq предоставляет подключаемый модуль интерфейса управления, облегчающий просмотр различной статистики, который можно включить с помощью следующей команды:
sudo ./rabbitmq-plugins enable rabbitmq_management
Просмотр журналов
Посмотреть лог можно в файловой системе, после запуска rabbitmq отобразится путь лога:
Кроме того, информацию журнала в режиме реального времени можно получить через AMQP.Существует обмен темами amq.rabbitmq.log, который может отслеживать соответствующую очередь.
В следующей статье будет представлен режим обмена сообщениями и лучшие практики, спасибо за ваше постоянное внимание.
Добро пожаловать, чтобы отсканировать QR-код ниже и подписаться на мою личную общедоступную учетную запись WeChat ~