RabbitMQ入门其一:环境搭建和Hello World

材料

  • 阿里云ECS
  • IntelliJ IDEA

安装Docker

安装RabbitMQ的方式有很多种,其中一种是通过Docker镜像安装,所以我们首先需要安装Docker。查看系统版本:

lsb_release -a

显示为:Alibaba Cloud Linux release 3 (Soaring Falcon),这是阿里云基于龙蜥社区(OpenAnolis)的龙蜥操作系统(Anolis OS)打造的操作系统发行版,阿里云的产品文档中给出了针对这一系统的Docker安装步骤:

  1. 安装dnf
yum -y install dnf
  1. 安装dnf源中默认的Docker(podman-docker)
dnf -y install docker
  1. 确认Docker是否安装成功
docker images

看到如下图所示表示安装成功:
在这里插入图片描述
这里引用阿里云文档的一段话:

该方式安装的podman-docker没有守护进程(systemd),因此您在后续的操作中无需关注podman-docker的运行状态(无需进行systemctl命令的相关操作),直接使用Docker即可。

可以说非常的方便。

安装RabbitMQ

使用Docker安装RabbitMQ的方法参考官方文档:

  1. 拉取RabbitMQ的Docker镜像:
docker pull rabbitmq:management

注意:rabbitmq后面的:management说明这是带控制台的版本。

  1. 查看镜像列表,确认拉取成功:
docker images

看到如下图所示表示拉取成功:
在这里插入图片描述

  1. 启动容器(守护进程)
docker run -d --hostname rbt-host --name rbt-dm -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 -p 5672:5672 -p 15672:15672 7ac1b528279a

参数说明

  • -hostname:容器的主机名称。官方文档建议我们在启动时指定,因为RabbitMQ是在其所谓的Node Name上储存数据,这个Node Name默认就是hostname。如果不指定hostname将会使用一个随机的值,这样就不利于找到我们的数据。
  • -name:容器名称。我们可以根据它来查看容器日志。
  • -e:设置环境变量。这里我们设置了默认的用户名和密码,用来验证权限和登陆控制台。
  • -p:指定端口映射。就是将主机端口映射到容器端口(-p 主机端口:容器端口),否则无法通过主机端口访问容器端口。
  • 7ac1b528279a:是示例中的RabbitMQ的镜像ID,可以在上面的截图中找到。
  1. 查看容器日志,确认启动成功
docker logs rbt-dm

启动容器后稍等一会儿,执行上面的命令,如果顺利的话可以看到:
在这里插入图片描述

说明RabbitMQ已经跑起来了。

开放防火墙端口

因为一会儿要编写的Hello World程序运行在本地,而需要访问的RabbitMQ部署在ECS上,所以需要开放ECS的防火墙端口。具体步骤如下:

  1. 查看已开启的端口列表:
firewall-cmd --list-port
  1. 开启RabbitMQ默认的5672端口:
firewall-cmd --zone=public --add-port=5672/tcp --permanent
  1. 重启防火墙:
firewall-cmd --reload
  1. 再次查看已开启的端口列表,确认开启成功,命令同步骤1

修改安全组策略

除了开放系统端口外,还需要调整阿里云ECS的安全组策略,在安全组规则中手动添加如下的规则即可:
在这里插入图片描述
提示:控制台所需的15672端口的设置方法同上。

初始化Maven项目

整合Java和RabbitMQ的最简单的方式之一,就是初始化一个Maven项目并引入依赖。可以通过Spring Initializr网站或IDE初始化,这里不再赘述。

引入RabbitMQ依赖

从Maven中央仓库获取,这里使用当前最新的5.15.0版本:


<dependency>
    <groupId>com.rabbitmqgroupId>
    <artifactId>amqp-clientartifactId>
    <version>5.15.0version>
dependency>

编写生产者类

public class Send {

    private static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("somehost");
        factory.setPort(5672);
        // 因为在启动时指定了用户名和密码,所以这里需要设置以通过权限验证
        factory.setUsername("admin");
        factory.setPassword("123456");
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            // 这一步是幂等的,只有当指定的queue不存在时才会创建这个queue 
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello World!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println("[x] Send '" + message + "'");
        }
    }
}

运行后控制台打印出[x] Send 'Hello World!'
提示:如果生产者运行失败,一种可能的原因是RabbitMQ运行的空闲磁盘空间不足(默认需要至少200MB),这种情况下RabbitMQ会拒绝接收消息。可以查看日志来确认是不是这个问题,如有必要调整下disk_free_limit参数试试(官方指南)。

编写消费者类

public class Recv {

    private static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("somehost");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("123456");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println("[*] Waiting for messages. To exit press CTRL+C");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
            System.out.println("[x] Received '" + message + "'");
        };
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {
        });
    }
}

运行后控制台打印出[x] Received 'Hello World!',消费成功。

查看控制台

最后我们可以登录RabbitMQ自带的控制台查看我们创建的queue和发送的消息:

  • 地址:somehost:15672(somehost为RabbitMQ的主机地址)
  • 用户名:admin(启动容器时指定的环境变量RABBITMQ_DEFAULT_USER)
  • 密码:123456(启动容器时指定的环境变量RABBITMQ_DEFAULT_PASS)
    RabbitMQ入门其一:环境搭建和Hello World_第1张图片

参考文档

RabbitMQ tutorial

你可能感兴趣的:(消息队列,rabbitmq)