【RabbitMq】搭建到应用最全学习教程

一、RabbitMq的下载与部署

1.下载Rabbitmq的镜像

拉取最新的rabbitmq的镜像

docker pull rabbitmq

拉取指定版本的rabbitmq镜像

docker pull rabbitmq:版本号

2.创建并运行rabbitmq容器

docker run -d -p 15673:15672 -p 5674:5672 \
        --restart=always \
        -e RABBITMQ_DEFAULT_VHOST=my_vhost  \
        -e RABBITMQ_DEFAULT_USER=admin \
        -e RABBITMQ_DEFAULT_PASS=admin123456 \
        --hostname myRabbit \
        --name rabbitmq-new\
        rabbitmq:latest

注意:在映射的端口号的时候不要映射 5671端口,端口5671是 RabbitMQ 的默认AMQP over TLS/SSL端口。AMQP(Advanced Message Queuing Protocol)是一种消息传递协议,用于在应用程序之间进行可靠的消息传递。
参数说明:

-d:表示在后台运行容器;
-p:将主机的端口 15673(Web访问端口号)对应当前rabbitmq容器中的 15672 端口,将主机的5674(应用访问端口)端口映射到rabbitmq中的5672端口;
–restart=alawys:设置开机自启动
-e:指定环境变量:
RABBITMQ_DEFAULT_VHOST:默认虚拟机名;
RABBITMQ_DEFAULT_USER:默认的用户名;
RABBITMQ_DEFAULT_PASS:默认的用户密码;
–hostname:指定主机名(RabbitMQ 的一个重要注意事项是它根据所谓的 节点名称 存储数据,默认为主机名);
–name rabbitmq-new:设置容器名称;
查看启动情况
在这里插入图片描述

3.启动web客户端

方法一:进入容器开启

#进入rabbitmq容器
docker exec -it 容器名/容器id /bin/bash
#开启web客户端
rabbitmq-plugins enable rabbitmq_management

方法二:不进入容器开启

docker exec -it 容器名/容器id rabbitmq-plugins enable rabbitmq_management

4.访问rabbitmq的web客户端

在浏览器上输入 ip+端口 访问rabbitmq的web客户端
在这里插入图片描述
输入上面在初始化Rabbitmq容器时我们自己指定了默认账号和密码:admin/admin123456,如果没有指定的话那么rabbitmq的默认账号密码是:guest/guest

登录成功如下图所示:
在这里插入图片描述
如果提示网页无法访问的话,可检查服务器的防火墙是否开启了这个端口。

#查看防火墙规则中打开的端口列表
firewall-cmd --list-ports
#添加端口
firewall-cmd --zone=public --add-port=15673/tcp --permanent
#重新加载,使配置生效
firewall-cmd --reload

–zone=public 指定了要添加规则的区域(这里是公共区域)
–add-port=15673/tcp 指定了要添加的端口及其协议(这里是 TCP 协议的 15673 端口)
–permanent 则表示将规则永久保存,使其在系统重启后仍然有效。

5.遇到的问题

问题描述:在rabbitmq的web客户端发现界面会弹出如下提示框Stats in management UI are disabled on this node
在这里插入图片描述
解决方法
(1)进入到启动的rabbitmq的容器中
docker exec -it 容器名称/容器id /bin/bash

(2)切换到rabbitmq的配置文件目录
cd /etc/rabbitmq/conf.d/
(3)修改配置文件- management_agent.disable_metrics_collector.conf

echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf

二、RabbitMq管理页面介绍

1.管理界面概览

在这里插入图片描述
connections
无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况

channels
通道,建立连接后,会形成通道,消息的投递获取依赖通道。

Exchanges
交换机,用来实现消息的路由

Queues
队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列。

Admin:
管理用户

2.Overview模块

2.1 Node服务节点
在这里插入图片描述
Nodes项,显示的是RabbitMQ的服务节点,目前有一个本地节点,可以有多个服务节点(比如集群的时候)。
2.2 ports端口
在这里插入图片描述
这里一共有三个端口,其中5672是amqp协议的端口,15672是RabbitMQ的管理工具端口(这就是我们现在操作的),25672是做集群的端口。

如果我们现在的Java程序要与RabbitMQ进行交互,需要和哪个端口交互呢?是5672。因为Java客户端需要与RabbitMQ服务进行数据交互,必须要遵循amqp协议协议,所以要走5672端口。

而15672是RabbitMQ的管理工具的端口,与服务无关,仅仅是管理工具运行的端口。
2.3 Export definitions和Import definitions
在这里插入图片描述
Export definitions为导出RabbitMQ的基本信息

Import definitions为导入RabbitMQ的基本信息

3.Admin模块

3.1 添加用户
在这里插入图片描述

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

超级管理员(administrator)

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

监控者(monitoring)

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

策略制定者(policymaker)

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

普通管理者(management)

    仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

其他
无法登陆管理控制台,通常就是普通的生产者和消费者。

3.2 创建虚拟机Virtual Hosts
为了让各个用户可以互不干扰的工作,RabbitMQ添加了虚拟主机(Virtual Hosts)的概念。其实就是一个独立的访问路径,不同用户使用不同路径,各自有自己的队列、交换机,互相不会影响
在这里插入图片描述
在这里插入图片描述
创建好虚拟主机,我们还要给用户添加访问权限:

点击添加好的虚拟主机:
在这里插入图片描述
进入虚拟主机设置界面,给用户设置权限
在这里插入图片描述

4.Connections 连接

在这里可以看客户端连接RabbitMQ服务的信息。目前尚未有客户端连接,所以上面看不到连接信息。
在这里插入图片描述

5. Channels(通道)

在这里可以看客户端连接RabbitMQ通道的信息。通道是建立在连接之上的,因为现在没有连接,所以也没有通道
在这里插入图片描述

6.Exchanges(交换机)

Exchanges选项有交换机的信息,并且可以通过Add a new exchange来添加交换机
在这里插入图片描述
在这里插入图片描述
添加exchange的属性说明:

Name: exchange的名称

Type:exchange的类型,可选值为direct, headers, topic, fanout

Durability:是否需要持久化, Durable表示持久化,即rabbitmq重启后exchange不会被清除,依旧存在

Auto Delete:是否自动删除,默认是No。

自动删除的触发条件是:当绑定到该exchange上的所有queue和exchange都已经解除绑定时,rabbitmq自动删除该exchange。

Internal:是否为rabbitmq内部使用,默认NO。如果是,客户端不能直接投递消息到此交换器,只能由rabbitmq自己向这个exchange投递消息,一般用于exchange到exchange的绑定。

Arguments:其他选项参数, 一般设置为 [],不需要。

7.Queues

Queues选项有queue的信息,并且可以通过Add a new queue来添加queue
在这里插入图片描述
添加queue属性说明:

Name: queue的名称

Durability:Durable表示持久化,即rabbitmq重启后,不会清除该queue,保留queue

Auto delete: 是否自动删除,默认NO。

自动删除触发条件:当所有消费客户端连接断开后,会删除该消息队列。

例:
当Queue中的 autoDelete 属性被设置为true时,那么,当所有消息接收者宕机或者关闭连接后,消息队列则会删除,消息发送者一直发送消息,当消息接收者重新启动恢复正常后,会接收最新的消息,而宕机期间的消息则会丢失。

    当Quere中的 autoDelete 属性被设置为false时,那么,当消息接收者宕机,关闭后,消息队列不会删除,消息发送者一直发送消息,当消息接收者重新启动恢复正常后,会接收包括宕机期间的消息。

Arguments:其他选项参数,如TTL,Auto expire等,在该选项下面有参数选择。

下面,我创建一个name为myqueue的消息队列,创建完成后,会在queue表格中看到
在这里插入图片描述
创建了exchange和queue之后,我们还需要将queue绑定到exchange。下面我将上面创建的myqueue绑定到exchange上,在queues页面,点击我们需要绑定的队列,进入到详情页,在Add binding to this queue中填入exchange名称和路由键。然后就可以在对应的exchange详情页的bingdings看到绑定信息
在这里插入图片描述
在这里插入图片描述

三、RabbitMq在Java中的应用

添加Maven依赖

		<dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.25.0</version> <!-- 使用最新版本 -->
        </dependency>

1、消费者

package com.ylzinfo.brt.controller;

import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Consumer {
    private final static String QUEUE_NAME = "test-queues";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost"); // RabbitMQ 服务器地址
        factory.setUsername("admin"); // 默认用户名 如果报错不要用超级管离者,自己创建一个用户,赋予权限
        factory.setPort(5674); // 默认端口 宿主机端口
        factory.setPassword("admin123456"); // 默认密码
        factory.setVirtualHost("my_vhost");

        // 自定义线程池大小(如设置为 4 个线程) 利用线程池创建、不创建可能会报错
        ExecutorService executor = Executors.newFixedThreadPool(4);
        factory.setSharedExecutor(executor);

        Connection connection = factory.newConnection(executor);
        Channel channel = connection.createChannel();


        // 定义消息处理回调
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received: " + message);

            // 手动发送 ACK 确认(重要!)
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        };

        // 设置手动 ACK 模式(autoAck=false)
        channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});

        System.out.println(" [*] Waiting for messages. Press CTRL+C to exit");
    }
}

2、生产者

package com.ylzinfo.brt.controller;

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

public class Producer {
    private final static String EXCHANGE_NAME = "my-exchange";
    private final static String ROUTING_KEY = "test-queues"; // 需与绑定时设置的 routing_key 一致

    public static void main(String[] args) {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost"); // RabbitMQ 服务器地址
        factory.setUsername("admin"); // 默认用户名 如果报错不要用超级管离者,自己创建一个用户,赋予权限
        factory.setPort(5674); // 默认端口 宿主机端口
        factory.setPassword("admin123456"); // 默认密码
        factory.setVirtualHost("my_vhost");// 不加这个有可能会报错,要指定虚拟主机


        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // 发送消息到 Exchange
            String message = "你好啊 我第一次玩RabbitMQ ";
            channel.basicPublish(
                EXCHANGE_NAME, 
                ROUTING_KEY, 
                null, // 消息属性(可选,如持久化设置)
                message.getBytes()
            );
            System.out.println(" [x] Sent: " + message);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3、实现效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值