RabbitMQ

本文详细介绍了如何使用Docker安装RabbitMQ,包括配置管理界面、启用插件以及重启服务。接着讲解了如何在SpringBoot应用中使用RabbitMQ,包括创建消息队列、声明交换机、生产者和消费者的角色。最后,文章阐述了RabbitMQ延迟消息队列的设置,包括安装延迟插件、配置及Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、rabbitmq安装

1.1、Docker 安装Rabbitmq

1.2、rabbitmq管理界面

启用管理界面

重启RabbitMQ服务

二、使用rabbitmq消息队列

1.1、前期准备

1.2、创建消息队列,声明交换机

1.3、通过队列发送与接受消息

1.31、生产者

1.32、消费者

1.4、通过交换机发送与接收消息

1.41、生产者

1.42、消费者

三、rabbitMq延迟消息队列

 3.1下载延迟插件

查看镜像的信息获取版本号

安装插件并启用

将刚刚上传的插件拷贝到容器内plugins目录下

进入到RabbitMQ容器内部

查看插件是否存在

启用插件

退出容器,重启RabbitMQ容器

 Java SpringBoot 代码部分


一、rabbitmq安装

1.1、Docker 安装Rabbitmq

下载镜像,rabbitmq:management 镜像中已经安装了管理界面

docker pull rabbitmq:management

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
 
# 重启 docker 系统服务
systemctl restart docker

配置管理员用户名和密码

#mkdir创建文件夹
mkdir /etc/rabbitmq
vim /etc/rabbitmq/rabbitmq.conf

# 添加两行配置:
default_user = admin
default_pass = admin

启动Rabbitmq容器

docker run -d --name rabbit \
-p 5672:5672 \
-p 15672:15672 \
-v /etc/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-e RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf \
--restart=always \
rabbitmq:management

访问管理控制台 http://192.168.64.140:15672
用户名密码是 admin

设置rabbitmq服务器

# 设置服务,开机自动启动
systemctl enable rabbitmq-server

# 启动服务
systemctl start rabbitmq-server

1.2、rabbitmq管理界面

启用管理界面

# 开启管理界面插件
rabbitmq-plugins enable rabbitmq_management

# 防火墙打开 15672 管理端口
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload

重启RabbitMQ服务

systemctl restart rabbitmq-server

登录rabbitmq网页         

二、使用rabbitmq消息队列

1.1、前期准备

pom文件添加依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

.yml配置文件

spring:
  rabbitmq:
    host: 192.168.64.136
    username: admin
    password: admin
    listener:
      simple:
        # 每次收1条,处理完之前不收下一条
        # 默认 250
        prefetch: 1
        # acknowledgeMode: NONE # rabbitmq的自动确认
        # acknowledgeMode: AUTO # rabbitmq的手动确认, springboot会自动发送确认回执 (默认)
        # acknowledgeMode: MANUAL # rabbitmq的手动确认, springboot不发送回执, 必须自己编码发送回执

消息队列与通过交换机生成的消息队列属性

Name:队列的名称
Durable:是否持久化(重启rabbitmq之后,队列是否还存在)
Exclusive:是否只被一个客户端连接使用,且当连接关闭后,删除队列
AutoDelete :是否自动删除(当最后一个消费者退订后即被删除)
Arguments:队列的其他属性参数,有如下可选项:
(1)x-message-ttl:消息的过期时间,单位:毫秒;
(2)x-expires:队列过期时间,队列在多长时间未被访问将被删除,单位:毫秒;
(3)x-max-length:队列最大长度,超过该最大值,则将从队列头部开始删除消息;
(4)x-max-length-bytes:队列消息内容占用最大空间,受限于内存大小,超过该阈值则从队列头部开始删除消息;
(5)x-overflow:设置队列溢出行为。这决定了当达到队列的最大长度时消息会发生什么。有效值是drop-head、reject-publish或reject-publish-dlx。仲裁队列类型仅支持drop-head;
(6)x-dead-letter-exchange:死信交换器名称,过期或被删除(因队列长度超长或因空间超出阈值)的消息可指定发送到该交换器中;
(7)x-dead-letter-routing-key:死信消息路由键,在消息发送到死信交换器时会使用该路由键,如果不设置,则使用消息的原来的路由键值
(8)x-single-active-consumer:表示队列是否是单一活动消费者,true时,注册的消费组内只有一个消费者消费消息,其他被忽略,false时消息循环分发给所有消费者(默认false)
(9)x-max-priority:队列要支持的最大优先级数;如果未设置,队列将不支持消息优先级;
(10)x-queue-mode(Lazy mode):将队列设置为延迟模式,在磁盘上保留尽可能多的消息,以减少RAM的使用;如果未设置,队列将保留内存缓存以尽可能快地传递消息;
(11)x-queue-master-locator:在集群模式下设置镜像队列的主节点信息。

交换机的类型

exchange也有几个类型,完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。对key进行模式匹配后进行投递的叫做Topic交换机,符 号”#”匹配一个或多个词,符号”*”匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。还 有一种不需要key的,叫做Fanout交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。

1.2、创建消息队列,声明交换机

package com.example.demo.entity;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitmqConfig {
    //声明队列
    @Bean
    public Queue taskQueue() {
        /*
         * 可用以下形式:
         * new Queue("helloworld") - 持久,非排他,非自动删除
         * new Queue("helloworld",false,false,false,null)
         */
        return new Queue("hello",false);
    }

    //声明交换机
    @Bean
    public FanoutExchange logs(){
        return new FanoutExchange("fanout_logs",false,false);
    }
}

1.3、通过队列发送与接受消息

    //注入生产者
    @Autowired
    private SimpleSender simpleSender;

    public String a(String msg){
        simpleSender.a(msg);
        return msg;
    }

1.31、生产者

package com.example.demo.component;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class SimpleSender {
    @Autowired
    private AmqpTemplate template;

    public void a(String msg){
        template.convertAndSend("hello",msg);
    }
}

1.32、消费者

package com.example.demo.component;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class SimpleReceiver {

    @RabbitListener(queues = "hello")
    public void receive(String msg){
        System.out.println("消费者消费消息"+msg);
    }
}

1.4、通过交换机发送与接收消息

1.41、生产者

package com.example.demo.component;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class SimpleSender {
    @Autowired
    private AmqpTemplate template;

    public void a(String msg){
        //路由可以为空,如果有值则需要对应的消费者消费
        //                         交换机    路由 消息
        template.convertAndSend("fanout_logs",k,msg);
    }
}

1.42、消费者

当交换机绑定的队列hello已存在时

package com.example.demo.component;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class SimpleReceiver {

    @RabbitListener(queues = "hello")
    public void receive(String msg){
        System.out.println("消费者消费消息"+msg);
    }
}

当不存在与交换机绑定的队列时

注意@QueueBinding注解的三个属性:

  • value: @Queue 注解,用于声明队列,value 为 queueName, durable 表示队列是否持久化, autoDelete 表示没有消费者之后队列是否自动删除
  • exchange: @Exchange 注解,用于声明 exchange, type 指定消息投递策略,我们这里用的 topic 方式
  • key: 在 topic 方式下,这个就是我们熟知的 routingKey(路由),若生产者传递的路由为空则可以不写
    /**
     * 队列不存在时,需要创建一个队列,并且与exchange绑定
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "topic.n1", durable = "false", autoDelete = "true"),
            exchange = @Exchange(value = "fanout_logs", type = ExchangeTypes.TOPIC),
            key = "info"))
    public void consumerNoQueue(String data) {
        System.out.println("consumerNoQueue: " + data);
    }

    @RabbitListener(bindings = @QueueBinding(
            //@Queue注解spring会随机创建队列,参数为 非持久、独占、自动删除
            value = @Queue,
            // declare = "false"  不在这里创建交换机,而是用名字引用存在的交换机
            exchange = @Exchange(name = "fanout_logs",declare = "false"),
            key = {"info","warning","error"}
    ))
    public void receive1(String msg){
        System.out.println("消费者1收到:" +msg);
    }

三、rabbitMq延迟消息队列

 3.1下载延迟插件

查看镜像的信息获取版本号

docker inspect rabbitmq:management

 根据版本号下载延迟插件

下载地址:RabbitMQ

 

 将插件文件上传到服务器,我这里是直接上传到/root下了

安装插件并启用

将刚刚上传的插件拷贝到容器内plugins目录下

rabbit是容器的name,也可以使用容器id

docker cp /root/rabbitmq_delayed_message_exchange-3.9.0.ez rabbit:/plugins

进入到RabbitMQ容器内部

docker exec -it rabbit /bin/bash

查看插件是否存在

cd plugins
ls |grep delay

启用插件

(注意是在plugins内)

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

退出容器,重启RabbitMQ容器

exit
docker restart rabbit

登录RabbitMQ的管理界面(ip:15672 访问web界面)检查x-delayed-message是否存在

 Java SpringBoot 代码部分

配置类

package com.example.demo.entity;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

@Configuration
public class Rabbitmq {
    //交换机
    public static final String DELAYED_EXCHANGE ="delayed_exchange";
    //队列
    public static final String DELAYED_QUEUE ="delayed_queue";
    //routeingKey
    public static final String DELAYED_ROUTINGKEY ="delayed_routingKey";

    //声明延迟交换机
    @Bean
    public CustomExchange delayedExchange(){
        HashMap<String, Object> arguments = new HashMap<>();
        //自定义交换机的类型
        arguments.put("x-delayed-type", "direct");
        /**
         * 交换机名
         * 交换机类型
         * 持久化
         * 自动删除
         */
        return new CustomExchange(DELAYED_EXCHANGE,"x-delayed-message",true,false,arguments);
    }

    /**
     * 声明队列
     * @return
     */
    @Bean
    public Queue delayedQueue(){
        return new Queue(DELAYED_QUEUE);
    }

    //延迟交换机和队列绑定
    @Bean
    public Binding delayedQueueBindingDelayedExchange(Queue delayedQueue, CustomExchange delayedExchange){
        return BindingBuilder.bind(delayedQueue).to(delayedExchange).with(DELAYED_ROUTINGKEY).noargs();
    }
}

生产者

package com.example.demo.controller;

import com.example.demo.entity.Rabbitmq;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class D {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 
     * @param message       传递的信息
     * @param delayedTime   延迟时间
     */
    public void a(String message,Integer delayedTime){
        rabbitTemplate.convertAndSend(Rabbitmq.DELAYED_EXCHANGE,Rabbitmq.DELAYED_ROUTINGKEY,message,(msg -> {
            //发送消息 并设置delayedTime
            msg.getMessageProperties().setDelay(delayedTime);
            return msg;
        }));
    }
}

消费者

package com.example.demo.controller;

import com.example.demo.entity.Rabbitmq;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class C {
    @RabbitListener(queues = Rabbitmq.DELAYED_QUEUE)
    public void receiveMessage(Message message){
        String msg = new String(message.getBody());
        System.out.println(msg);
        System.out.println(new Date());
    }
}

### RabbitMQ 使用指南和教程 #### 安装 RabbitMQ RabbitMQ 是一种基于 AMQP 协议的消息中间件,用于实现分布式系统的可靠消息传递。以下是安装 RabbitMQ 的基本流程: 1. **安装 Erlang** RabbitMQ 基于 Erlang 编程语言开发,因此需要先安装 Erlang 运行环境。可以通过包管理器或者下载官方二进制文件完成安装。 2. **安装 RabbitMQ Server** 下载并安装 RabbitMQ Server 软件包。对于 Linux 用户,可以使用以下命令: ```bash sudo apt-get install rabbitmq-server ``` 3. **启动服务** 启动 RabbitMQ 服务后,默认监听端口为 `5672`(AMQP 协议),Web 管理界面默认运行在 `15672` 端口上。 ```bash sudo systemctl start rabbitmq-server ``` 4. **启用 Web 管理插件** 可通过以下命令启用 RabbitMQ 提供的 Web 管理工具: ```bash sudo rabbitmq-plugins enable rabbitmq_management ``` --- #### 配置用户与权限 为了安全访问 RabbitMQ 实例,通常需要创建自定义用户并分配相应权限。 - 创建新用户: ```bash rabbitmqctl add_user rabbitmq 211314 ``` 此操作会新增名为 `rabbitmq` 的用户,并将其密码设为 `211314`[^1]。 - 设置用户角色: ```bash rabbitmqctl set_user_tags rabbitmq administrator ``` 将该用户的标签设定为管理员角色,使其拥有完全控制权[^1]。 - 授予用户权限: ```bash rabbitmqctl set_permissions -p "/" rabbitmq ".*" ".*" ".*" ``` 上述命令授予用户对根虚拟主机 `/` 中所有资源的操作权限[^1]。 - 查看现有用户及其角色: ```bash rabbitmqctl list_users ``` --- #### 集群配置 RabbitMQ 支持多种集群模式来提升可用性和性能。主要分为两类:普通模式和镜像模式。 - **普通模式** 在这种模式下,各节点独立存储队列中的数据和其他元信息(如交换机)。当客户端尝试消费某个不在当前连接节点上的消息时,目标节点会被请求转发所需的数据[^2]。 - **镜像模式** 对比之下,在镜像模式中,指定队列的内容将在多个节点间保持一致副本。即使部分成员失效,剩余存活节点仍能继续提供完整的服务功能[^2]。 > 注意事项:尽管镜像模式提高了可靠性,但也带来了额外开销——网络流量增加以及写入延迟上升等问题需被充分考虑进去。 --- #### 应用集成示例 假设要在一个 Java 或 Python 应用程序里利用 RabbitMQ 来发送/接收消息,则可能涉及以下几个步骤: 1. **声明交换器 (Exchange)** 和绑定关系: ```java channel.exchangeDeclare(exchangeName, "direct", true); channel.queueDeclare(queueName, true, false, false, null); channel.queueBind(queueName, exchangeName, routingKey); ``` 如此一来便完成了持久化队列及路由键关联工作[^3]。 2. 发布一条测试消息至上述已建立好的通道路径之中; 3. 订阅对应主题下的事件流以便实时捕获最新动态更新情况; --- #### 总结 以上涵盖了从基础安装到高级特性使用的整个过程概述。希望这些指导能够帮助您快速掌握如何部署与维护属于自己的 RabbitMQ 平台实例! 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值