当前位置: 代码迷 >> 综合 >> # SpringBoot 集成 RabbitMQ
  详细解决方案

# SpringBoot 集成 RabbitMQ

热度:61   发布时间:2023-10-31 20:16:36.0

SpringBoot 集成 RabbitMQ

RabbitMQ

概念

RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层。保存这个数据。

Windows环境安装

  • RabbitMq Windows 环境安装参考https://blog.csdn.net/zhm3023/article/details/82217222

简述

  • queue:队列,每个队列可以有多个消费者,但是一条消息只会被一个消费者消费

  • exchange:交换机,队列可以绑定交换机,交换机根据路由或者其他匹配信息将消息发送至queue

模式

  • simple模式:不需要交换机,直连模式。一个队列只有一个消费者

  • work模式:一个队列多个消费者

  • direct模式:需要交换机,通过交换机的路由key,精确匹配queue,并发送至对应的queue

  • topic模式:通过路由与路由key,模糊匹配的模式。可用通配符。比如key.1会被绑定路由key.*queue获取到

  • fanout: 广播模式,不需要路由key,给所有绑定到交换机的queue

请添加图片描述


SpringBoot集成RabbitMq

简单实例

引入Maven依赖

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

配置yml

spring:  rabbitmq:host: 127.0.0.1port: 5672username: guestpassword: guest

创建队列、交换机

@Configuration
public class RebbitMqConfig {
    /*** 队列名*/private static final String LOG_QUEUE = "log_queue";/*** 交换机名*/public static final String LOG_EXCHANGE = "log_exchange";public static final String MESSAGE_QUEUE = "message_queue";public static final String MESSAGE_EXCHANGE = "message_exchange";public static final String DIRECT_ROUTINGKEY = "test";/*** 创建队列* @return*/@Beanpublic Queue createLogQueue() {
    return new Queue(LOG_QUEUE);}/*** 创建队列* @return*/@Beanpublic Queue createMessageQueue() {
    return new Queue(MESSAGE_QUEUE);}/*** 创建交换机* @return*/@Beanpublic FanoutExchange logExchange() {
    return new FanoutExchange(LOG_EXCHANGE);}/*** 创建交换机* @return*/@Beanpublic DirectExchange messageExchange() {
    return new DirectExchange(MESSAGE_EXCHANGE);}/*** 队列与交换机进行绑定* @return*/@Beanpublic Binding bindingFanout() {
    return BindingBuilder.bind(createLogQueue()).to(logExchange());}/*** 队列与交换机绑定并添加路由key(direct和topic模式)* @return*/@Beanpublic Binding bindingDirect() {
    return BindingBuilder.bind(createMessageQueue()).to(messageExchange()).with(DIRECT_ROUTINGKEY);}
}

生产者简单实例

@RestController
@RequestMapping("/rabbit")
public class RabbitMqProduct {
    /*** 队列名*/private static final String LOG_QUEUE = "log_queue";/*** 交换机名*/public static final String LOG_EXCHANGE = "log_exchange";public static final String DIRECT_ROUTINGKEY = "test";@Autowiredprivate RabbitTemplate rabbitTemplate;@RequestMapping("/test1")public void sendMessage() {
    String context = "simple---> " + new Date();//如果没有配置默认交换机,直接传入queue的namerabbitTemplate.convertAndSend(LOG_QUEUE, context);//如果配置了默认的交换机,(交换机,queue_name,内容)rabbitTemplate.convertAndSend("", DIRECT_ROUTINGKEY, context);}@RequestMapping("/test2")public void sendMessages() {
    String context = "direct---> " + new Date();//(交换机名称,路由的key,内容)rabbitTemplate.convertAndSend(LOG_EXCHANGE, DIRECT_ROUTINGKEY, context);}
}

消费者简单实例

@Component
public class RabbitMqConsume {
    //基础注解,指定queue的名称,可以多个。如果是simple不需要交换机的直接写队列名称就好。//如果是其他的也想只指定一个queues——name的话,需要上面的配置类配置queue或者其他绑定关系@RabbitListener(queues = "log_queue")@RabbitHandlerpublic void processSimpleMsg(String message) {
    System.out.println("########################received simple" + message);}}

RabbitMq 管理页面说明

  • 安装完RabbitMqhttp://localhost:15672/#/输入账号和密码guest登录进入管理界面

概览界面

请添加图片描述

总数预览

  • 可以查看总的连接数,总的通道、总的交换机、总的队列、总的消费者
    请添加图片描述

服务节点

  • Nodes项,显示的是RabbitMQ的服务节点,目前有一个本地节点,可以有多个服务节点(比如集群的时候)
    请添加图片描述

端口上下文

  • 5672amqp协议的端口,15672RabbitMQ的管理工具端口(这就是我们现在操作的),25672是做集群的端口。
    请添加图片描述

Admin 界面

  • Tags选项,其实是指定用户的角色,可选的有以下几个:

  • 超级管理员(administrator):可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

  • 监控者(monitoring):可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

  • 策略制定者(policymaker):可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

  • 普通管理者(management):仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

  • 其他:无法登陆管理控制台,通常就是普通的生产者和消费者
    请添加图片描述

创建虚拟主机(Virtual Hosts)

  • 为了让各个用户可以互不干扰的工作,RabbitMQ添加了虚拟主机(Virtual Hosts)的概念。其实就是一个独立的访问路径,不同用户使用不同路径,各自有自己的队列、交换机,互相不会影响。
    请添加图片描述