RabbitMQ в действии: запуск и управление RabbitMQ

задняя часть RabbitMQ

Эта серия представляет собой краткий обзор книги «RabbitMQ в действии: эффективное развертывание распределенных очередей сообщений».

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

Эта статья в основном знакомит с тем, как запускать и управлять RabbitMQ. Перед введением будет демонстрация для демонстрации отправки и получения сообщений. С одной стороны, она будет иметь более интуитивное понимание элементов AMQP, а с другой с другой стороны, он будет служить источником данных для мониторинга, который будет введен позже.

Через введение вы узнаете:

  • Простая реализация отправки и получения сообщений
  • Администрирование сервера — запуск и остановка узлов
  • Профиль прав
  • статистика использования

Портал благосостояния:Xiaoai динамик F код

Простая реализация отправки и получения сообщений

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

На основе реализации фреймворка Spring Boot функции основных классов следующие:

  • LogRabbitConfig: создание очередей, обменов, привязок и других операций инициализации;
  • Отправитель: отправитель сообщения;
  • AllReceiver: Получатели логов всех уровней, получать логи всех уровней;
  • ErrorReceiver: приемник журнала уровня ошибки, принимает только журналы уровня ошибки;
  • LogSenderTest: класс тестового примера;

Модель сообщения выглядит следующим образом:

Demo的消息模型

настроить

Сначала настройте зависимости 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_management插件

Просмотр журналов

Посмотреть лог можно в файловой системе, после запуска rabbitmq отобразится путь лога:

rabbitmq日志路径

Кроме того, информацию журнала в режиме реального времени можно получить через AMQP.Существует обмен темами amq.rabbitmq.log, который может отслеживать соответствующую очередь.

В следующей статье будет представлен режим обмена сообщениями и лучшие практики, спасибо за ваше постоянное внимание.

Добро пожаловать, чтобы отсканировать QR-код ниже и подписаться на мою личную общедоступную учетную запись WeChat ~

情情说