Bootstrap

docker安装RabbitMQ

1.拉取RabbitMQ镜像

docker pull rabbitmq:latest

2.运行容器

自己创建了一个网络指定网络 --network=docker_network

docker run -d --name rabbitmq -p 5673:5672 -p 15673:15672 --network=docker_network --restart=always -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq:latest

如果不设置用户名和密码默认都是guest

3.docker logs rabbitmq

查看是否运行成功
在这里插入图片描述

4.放开这两个端口5673 、15673

5.开启web管理页面

5.1 需要先登录进容器中的rabbitmq

docker exec -it 容器名/容器id /bin/bash

5.2 执行下面命令

rabbitmq-plugins enable rabbitmq_management

6.访问这个页面

http://<宿主机IP地址>:15673

根据官网学习rabbitmq

官方文档:https://www.rabbitmq.com/tutorials

1.引入依赖

<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
  <groupId>com.rabbitmq</groupId>
  <artifactId>amqp-client</artifactId>
  <version>5.17.0</version>
</dependency>

hello world

在这里插入图片描述

在这里插入图片描述
复制这个发送消息的类到项目中

package com.yupi.springbootinit.mq;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.nio.charset.StandardCharsets;

public class SingleProducer {

    //队列名称
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] argv) throws Exception {
        //1.创建到rabbitmq服务器的连接
        ConnectionFactory factory = new ConnectionFactory();
        //2.1指定需要连接的rabbitmq的服务器ip
        factory.setHost("47.120.4.160");
        //如果修改了用户名和密码和访问端口号,就需要进行设置
        factory.setUsername("admin");
        factory.setPassword("123456");
        factory.setPort(5673);
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            //2.2声明一个队列
            //queueName:消息队列名称(注意,同名称的消息队列,只能用同样的参数创建一次)
			//durabale:消息队列重启后,消息是否丢失
			//exclusive:是否只允许当前这个创建消息队列的连接操作消息队列
			//autoDelete:没有人用队列后,是否要删除队列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello World!";
            //使用channel.basicPublish方法将消息发布到指定的队列中。这里我门指定的队列名为"hello"
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

Work Queues(多消费者)

在这里插入图片描述
公平分配:一人一条

交换机

在这里插入图片描述

  • fontout:广播,很适合发布/订阅模型
    也就是生产者发送一条消息,绑定这个交换机的每个队列都会收到这条消息
    生产者和队列都需要绑定同一个交换机

Direct交换机【常用】

在这里插入图片描述

绑定:交换机和队列进行关联,可以让交换机把指定的消息发送给哪些队列。
routingKey:控制消息要转发到哪个队列的
消息会根据这个routingKey发送到指定的队列
一个队列可以绑定多个路由键
特点:绑定关系完全匹配路由键

Topic交换机【常用】

特点:消息会根据一个模糊的路由键转发到指定的队列
场景:特定的一类消息可以交给特定的一类系统(程序)来处理
绑定关系:可以模糊匹配多个绑定
*:匹配一个单词
#:匹配0个或多个单词
在这里插入图片描述

Headers交换机

性能差,实践比较复杂,不推荐使用

使用消息队列实现RPC远程过程调用

没必要直接使用现成的Dubbo、GRPC等RPC框架就好。

;