RabbitMQ(一) 入门及消息分发机制

一、RabbitMQ 简介

RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

二、RabbitMQ 安装运行

  • 安装依赖环境
  1. 安装 通用依赖
yum install -y autoconf
yum install -y ncurses-devel
  1. 安装erlang
wget https://github.com/erlang/otp/archive/OTP-22.2.tar.gz
tar -zvxf OTP-22.2.tar.gz
cd otp-OTP-22.2/
./otp_build autoconf
./configure
make
make install
  1. 安装 socat
sudo yum install -y socat
  • 安装 RabbitMQ
  1. 下载
wget -P /home/download https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.23/rabbitmq-server-3.7.23-1.el7.noarch.rpm

可以在 https://github.com/rabbitmq/rabbitmq-server/tags 下载历史版本。

  1. 安装 RabbitMQ
sudo rpm -Uvh rabbitmq-server-3.7.23-1.el7.noarch.rpm

假如报版本错误,添加 --nodeps 参数,安装时不检查依赖关系。

  • 启动和关闭
1.启动服务
sudo systemctl start rabbitmq-server
2.查看状态
sudo systemctl status rabbitmq-server
3.停止服务
sudo systemctl stop rabbitmq-server
4.设置开机启动
sudo systemctl enable rabbitmq-server
  • 开启 Web 管理插件
  1. 见后面的笔记
  • 设置防火墙
#开放端口
#需开放 4369、5672、25672、15672
sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent
#重启防火墙
sudo firewall-cmd --reload

三 、RabbitMQ 基本配置

  • RabbitMQ 有一套默认的配置,能够满足日常开发需求,如果需要修改,需要自己创建一个配置文件
touch /etc/rabbitmq/rabbitmq.conf
  1. 配置文件示例
    https://blog.csdn.net/qq_43681755/article/details/112171144
  2. 配置项说明
    https://www.rabbitmq.com/configure.html#config-items
  • RabbitMQ 端口
  1. RabbitMQ 会绑定一些端口,安装完后,需要将这些端口添加至防火墙。
端口 描述
4369 是 Erlang 的端口/节点名称映射程序,用来跟踪节点名称监听地址,在集群中起到一个类似 DNS 的作用。
5672、5671 AMQP 0-9-1 和 1.0 客户端端口,没有使用 SSL 和使用 SSL 的端口。
25672 用于 RabbitMQ 节点间和 CLI 工具通信,配合 4369 使用。
15672 HTTP_API 端口,管理员用户才能访问,用于管理 RabbitMQ,需要启用 management 插件。
61613、61614 当 STOMP 插件启用的时候打开,作为 STOME 客户端端口(根据是否使用 TLS 选择)。
1883、8883 当 MQTT 插件启用的时候打开,作为 MQTT 客户端端口(根据是否使用 TLS 选择)
15674 基于 WebSocket 的 STOMP 客户端端口(当插件 Web STOMP启用的时候打开)。
15675 基于 WebSocket 的 MQTT 客户端端口(当插件 Web MQTT 启用的时候打开)。

四、RabbitMQ 管理界面

  • 启用 RabbitMQ 管理界面
#RabbitMQ 安装包中带有管理插件,但需要手动激活
rabbitmq-plugins enable rabbitmq_management

访问管理界面本机地址 端口为15672,账号密码默认都是:guest

在这里插入图片描述

RabbitMQ 有一个默认的用户“guest”,但这个用户默认只能通过本机访问,要让其他机器可以访问,需要创建一个新用户,为其分配权限。

#添加用户,后面两个参数分别是用户名和密码
rabbitmqctl add_user admin admin
#为用户分配权限,将用户设为管理员
rabbitmqctl set_user_tags admin administrator
# 为用户分配资源权限
abbitmqctl set_permissions -p / admin ".*" ".*" ".*"

使用新创建的用户进行访问
在这里插入图片描述

  • RabbitMQ 的用户角色分类

none、management、policymaker、monitoring、administrator

none

不能访问 management plugin

management

1.用户可以通过 AMQP 做任何事情。
2.列出自己可以通过 AMQP 登入的 virtual hosts。
3.查看自己的 virtual hosts 中的 queues、exchanges、bindings。
4.查看和关闭自己的 channels 和 connections。
5.查看有关自己的 virtual hosts 的“全局”的统计信息,包含其他用户在这些 virtual hosts 中的活动。

policymaker

1.management 可以做的任何事情。
2.查看、创建和删除自己的 virtual hosts 所属的 policies 和 parameters。

monitoring

1.management 可以做的任何事情。
2.列出所有的 virtual hosts,包括他们不能登录的 virtual hosts。
3.查看其他用户的 connections 和 channels。
4.查看节点级别的数据如 clustering 和 memory 使用情况。
5.查看真正的关于所有 virtual hosts 的全局的统计信息。

administrator

1.policymaker 和 monitoring 可以做的任何事情。
2.创建和删除 virtual hosts
3.查看、创建和删除 users
4.查看、创建和删除 permissions
5.关闭其他用户的 connections

五、在 Java 中使用 RabbitMQ

  • Maven 依赖
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.8.0</version>
</dependency>
  • Producer
/**
 * 简单队列生产者
 * 使用 RabbitMQ 的默认交换器发送消息
 */
public class Producer {
   
    public static void main(String[] args) throws IOException, TimeoutException {
   
        // 1. 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 2. 设置连接属性
        factory.setHost("192.168.253.133");
        factory.setUsername("admin");
        factory.setPassword("admin");

        Connection connection = null;
        Channel channel = null;

        try {
   
            // 3. 从连接工厂获取连接
            connection = factory.newConnection("生产者");

            // 4. 从连接中创建通道
            channel = connection.createChannel();

            /**
             * 5、声明(创建)队列
             * 如果队列不存在,才会创建
             * RabbitMQ 不允许声明两个队列名相同,属性不同的队列,否则会报错
             *
             * queueDeclare参数说明:
             * @param queue 队列名称
             * @param durable 队列是否持久化
             * @param exclusive 是否排他,即是否为私有的,如果为true,会对当前队列加锁,其它通道不能访问,
             *                  并且在连接关闭时会自动删除,不受持久化和自动删除的属性控制。
             *                  一般在队列和交换器绑定时使用
             * @param autoDelete 是否自动删除,当最后一个消费者断开连接之后是否自动删除
             * @param arguments 队列参数,设置队列的有效期、消息最大长度、队列中所有消息的生命周期等等
             */
            channel.
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值