1、RibbitMq的安装

1、通过Docker方式安装

1、在Centos中安装docker

文档:https://docs.docker.com/engine/install/centos/

1、卸载之前的老版本

  1. sudo yum remove docker \
  2. docker-client \
  3. docker-client-latest \
  4. docker-common \
  5. docker-latest \
  6. docker-latest-logrotate \
  7. docker-logrotate \
  8. docker-engine

2、设置安装的源

sudo yum install -y yum-utils
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

3、安装

sudo yum install -y docker-ce docker-ce-cli containerd.io

4、启动

sudo systemctl start docker

5、设置开机自启动

sudo systemctl enable docker

2、安装RabbitMq

  • —name 容器名称
  • -e RABBITMQ_DEFAULT_USER 用户名
  • -e RABBITMQ_DEFAULT_PASS 密码
  • 15672是管理后台端口
  • 5672是api端口

    docker run -dit --name rabbitmq -e RABBITMQ_DEFAULT_USER=djl -e RABBITMQ_DEFAULT_PASS=Djl12367 -p 15672:15672 -p 5672:5672 rabbitmq:management
    

    2、通过其他方式安装

  • 待完善

    2、MQ的应用场景

  • 秒杀订单的消峰,队列排队消费

  • 延迟多久时间触发业务

    • 比如订单过期
    • 延迟多久消息推送
    • 用户锁定24小时解除等等

      3、通过队列的创建

      1、业务场景

      秒杀订单抢到之后,发送消息给MQ,MQ后面的微服务器进行监听消费消息

      2、项目搭建

      1、pom.xml

  • 引入spring-boot-starter-amqp

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

    2、配置yaml

    spring:
    rabbitmq:
      host: ip地址
      port: 5672
      username: djl
      password: Djl12367
      publisher-confirm-type: correlated #消息发送到MQ消息确认机制 是否确认回调
      publisher-returns: true  #消息发送到MQ消息确认机制 是否返回回调
      listener:
        simple:
          acknowledge-mode: manual  #手动应答消费了
          concurrency: 1  #最小的消费者数量
          max-concurrency: 1 #最大的消费者数量
          retry:
            enabled: true #允许重新发送
    

    3、创建队列等

    1、创建秒杀配置类Properties

    @ConfigurationProperties(prefix = "seat.mq.seckill")
    @Data
    public class RabbitMqSeckillProperties {
    
      /**
       * 队列名称
       */
      private String queue;
    
      /**
       * 交换机
       */
      private String exchange;
    
      /**
       * 路由键
       */
      private String routingKey;
    }
    

    2、配置yaml

    seat:
    mq:
      seckill:
        queue: amq_queue_seat_seckill #秒杀队列名称
        exchange: amp.direct.exchange.seat.seckill #秒杀交换机
        routing-key: amq.direct.routing.seat.seckill #秒杀路由键
    

    3、创建RabbitMqSeckillConfig

  • 创建队列,路由键,交换机

  • 注意队列的名称不能有. ```java package com.seat.mq.config;

import com.seat.mq.properties.RabbitMqSeckillProperties; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;

/**

  • @author djy
  • @createTime 2022/1/26 下午11:50
  • @description RabbitMQ秒杀队列配置 */ @Configuration @EnableConfigurationProperties(RabbitMqSeckillProperties.class) public class RabbitMqSeckillConfig {
@Autowired
private RabbitMqSeckillProperties properties;

/**
 * 秒杀队列
 * @return
 */
@Bean
public Queue seatSeckillQueue() {
    // durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
    // exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
    // autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
    //   return new Queue("TestDirectQueue",true,true,false);
    //一般设置一下队列的持久化就好,其S余两个就是默认false
    return new Queue(properties.getQueue(),true);
}

/**
 * 秒杀交换机
 * @return
 */
@Bean
DirectExchange seatDirectExchange() {
    return new DirectExchange(properties.getExchange(),true,false);
}

/**
 * 秒杀绑定  将队列和交换机绑定, 并设置用于匹配键:amq.direct.routing.seat
 * @return
 */
@Bean
Binding bindingDirect() {
    return BindingBuilder.bind(seatSeckillQueue()).to(seatDirectExchange()).with(properties.getRoutingKey());
}

}

<a name="G4DQT"></a>
### 4、创建发送端
<a name="j2bMd"></a>
#### 1、创建基础类
<a name="cXp9y"></a>
# 4、安装延迟插件
<a name="PiChJ"></a>
## 1、下载延迟插件
<a name="fMsxm"></a>
### 1、直接用github下载ez后缀的文件
[https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases](https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/12971636/1650287703238-c65d0079-db4d-4249-8873-126cbdda1f01.png#clientId=u33de5227-c712-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=573&id=u63df353b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1146&originWidth=2368&originalType=binary&ratio=1&rotation=0&showTitle=false&size=186377&status=done&style=none&taskId=u499a64cc-de74-4fa4-9ce3-8cf51aca8c4&title=&width=1184)
<a name="AuSzx"></a>
### 2、从官网下载
[https://www.rabbitmq.com/community-plugins.html](https://www.rabbitmq.com/community-plugins.html)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/12971636/1650287734358-e0facd66-0e02-4d64-8320-679af2b08f95.png#clientId=u33de5227-c712-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=558&id=u8626a0ee&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1116&originWidth=2116&originalType=binary&ratio=1&rotation=0&showTitle=false&size=192634&status=done&style=none&taskId=ud490540e-fbd0-4adc-8d60-f16975679ee&title=&width=1058)
<a name="jtYqp"></a>
### 3、下载的文件
![image.png](https://cdn.nlark.com/yuque/0/2022/png/12971636/1650287769656-f1a6b2ed-4253-4d39-bc94-6f70c0bdbbd8.png#clientId=u33de5227-c712-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=38&id=u4506c057&margin=%5Bobject%20Object%5D&name=image.png&originHeight=76&originWidth=800&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11282&status=done&style=none&taskId=uc23b9efc-d6da-4440-8802-71cbac7b6d4&title=&width=400)
<a name="NmV3y"></a>
## 2、docker安装的rabbitmq
<a name="WzaeX"></a>
### 1、查看docker中plugins的目录
```shell
docker exec -it rabbitmq /bin/bash
root@7fd1b216d7c8:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  plugins  proc  root  run  sbin  srv  sys  tmp  usr  var

2、可以看到在根目录的plugins中

使用命令把主机中的插件文件cp进docker中

docker cp 主机文件 容器:容器目录
  • 示例 ```shell docker cp /mydata/rabbitmq插件/rabbitmq_delayed_message_exchange-3.9.0.ez Myrabbitmq:/plugins
<a name="MNrZE"></a>
### 3、使用命令安装

- 启用延迟队列
```shell
 rabbitmq-plugins enable rabbitmq_delayed_message_exchange

4、延迟消息

image.png