当前位置:   article > 正文

SpringBoot集成RabbitMq消息队列【附源码】_springboot搭建mq

springboot搭建mq

1. 项目背景

要啥项目背景,就是干!!!

  • SpringBoot版本:2.7.12

2. Rabbit MQ安装

这里讲解使用docker安装RabbitMQ,如果在windows下面安装RabbitMQ,参考下文

【笑小枫的按步照搬系列】Windows下安装RabbitMQ,图文完整教程

本文演示使用的windows下的mq,下面额外提供下使用docker安装RabbitMQ。

2.1 docker拉取RabbitMQ镜像
[root@k8s-n1 /]# docker pull rabbitmq:3.7.7-management
  • 1

如下图:
rabbitmq镜像下载成功图片

2.2 创建挂载目录
[root@k8s-n1 /]# mkdir /mnt/rabbitMQ/data
  • 1
2.3 查看下载镜像的镜像id
[root@k8s-n1 /]# docker images
  • 1

查看镜像图片

2.4 启动docker里的RabbitMQ镜像
[root@k8s-n1 /]# docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v /mnt/rabbitMQ/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost  -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 2888deb59dfc
  • 1

参数说明:
-d 后台运行容器;
–name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
-v 映射目录或文件;
–hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)

2.5 启动成功
[root@k8s-n1 /]# docker ps
  • 1
  • 查看docker容器:
    docker查看图片
  • 浏览器访问
    用浏览器访问http://192.168.2.21:15672 访问成功,表示RabbitMQ安装成功。
  • rabbitMQ-success

3. Rabbit MQ基础概念

3.1 虚拟机(Virtual Host)

虚拟主机,表示一批交换器、消息队列和相关对象。

虚拟主机是共享相同的身份认证和加密环境的独立服务器域。

vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。

3.2 发布者、消费者

  • 发布者(Publisher)

生产消息,并将其推送到broker。

  • 消费者(Consumer)

消费者消费消息。

3.3 交换机(exchange)

  • 默认交换机Default Exchange

默认交换机是直接交换机的一种特殊形式,能够使得它对简单的应用程序非常有用,即创建的每个队列都会自动绑定到默认交换机上,并使用与队列名称相同的routing key。

常用场景

没有配置交换机使用的都是默认交换机

  • 直接交换机Direct Exchange

直接交换机根据消息的routing key将消息传递到匹配的队列。直接交换机是消息单播路由的理想选择,但是也可以广播。

常用场景

  1. 点对点聊天
  2. 新闻消息分类(体育、娱乐、社会等)分发
  • 扇形交换机Fanout Exchange

扇形交换机将消息路由到绑定到它的所有队列,并忽略routing key。如果N个队列绑定到扇形交换机,则当向该交换机发布消息时,该消息的副本将传递给这N个队列。

常用场景

  1. 大型多人在线游戏可将扇形交换机用于排行榜(积分、名次等)更新
  2. 体育新闻网站可以使用扇形交换机向移动客户端近乎实时地分发分数更新
  3. 分布式系统可以利用扇形交换机,广播各种状态和配置的更新
  4. 群聊可以利用扇形交换机分发消息
  • 主题交换机Topic Exchange

主题交换机会将消息路由到和其绑定的一个或者多个队列。主题交换机通常用于发布订阅模式,以及广播。当一个问题涉及到多个消费者/应用程序,它们有选择地选择要接收哪种类型的消息时,应考虑使用主题交换机。

主题交换机对路由键进行模式匹配后进行投递,符号#表示一个或多个词,*表示一个词。因此“abc.#”能够匹配到“abc.def.ghi”,但是“abc.*” 只会匹配到“abc.def”。

常用场景

  1. 多个工作线程处理后台任务,每个工作线程处理特定的任务
  2. 股票价格更新(以及其他类型财务数据的更新)
  • 头交换机Headers Exchange

头交换机,不处理路由键,而是根据发送的消息内容中的headers属性进行匹配。

3.4 队列(Queue)

队列存储消息。发布者生成的消息都在队列中,消费者从队列中获取消息进行消费。

3.5 路由键(Routing Key)

路由关键字,exchange根据这个关键字进行消息投递。

4. SpringBoot集成Rabbit MQ

4.1 环境准备

SpringBoot创建过程不多介绍,这里就是一个最简单的项目,文末提供项目源码

  • 软件版本

SpringBoot 2.7.12

Erlang 25.2.1

RabbitMQ 3.11.0

  • 添加依赖 pom.xml
        <!-- 引入MQ依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 添加配置文件 application.yml
server:
  port: 8080

spring:
  rabbitmq:
    addresses: 127.0.0.1:5672
    username: guest
    password: guest
    # 环境隔离,默认使用“/”(虚拟主机)
    virtual-host: /
    connection-timeout: 6000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4.2 单生产者单消费者,简单的小栗子

配置队列

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


/**
 * @author 笑小枫 <https://www.xiaoxiaofeng.com/>
 * @date 2023/12/18
 */
@Configuration
public class SimpleQueueConfig {

    /**
     * 使用默认的交换机,进行消息发布消费
     */
    @Bean
    public Queue simpleQueue() {
        return new Queue("simpleQueue");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

生产者代码

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.stereotype.Component;

/**
 * @author 笑小枫 <https://www.xiaoxiaofeng.com/>
 * @date 2023/12/18
 */
@Component
@AllArgsConstructor
@Slf4j
public class SimpleMsgSender {

    private final AmqpTemplate rabbitTemplate;

    /**
     * 直接没有配置交换机(exchange),使用默认的交换机
     */
    public void send(String msg) {
        rabbitTemplate.convertAndSend("simpleQueue", msg);
        log.info("SimpleMsgSender 发送消息成功:" + msg);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

消费者代码

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @author 笑小枫 <https://www.xiaoxiaofeng.com/>
 * @date 2023/12/18
 */
@Component
@Slf4j
public class SimpleMsgReceiver {


    /**
     * 监听simpleQueue队列的消息,进行消费
     */
    @RabbitListener(queues = "simpleQueue")
    public void simpleMsgHandle(String msg) {
        log.info("SimpleMsgReceiver消费消息: " + msg);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

模拟发送消息调用

    /**
     * 模拟使用默认的交换机,调用消息发送
     */
    @GetMapping("/simpleQueueSend")
    public String simpleQueueSend(String msg) {
        simpleMsgSender.send(msg);
        return "发送成功";
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

GET http://localhost:8080/simpleQueueSend?msg=一条简单MQ测试消息

image-20231220100030661

可以看到RabbitMQ成功产生一条消息,并且被消费成功哟。简单的例子实现啦,可以愉快的使用MQ了声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】

推荐阅读
相关标签