RabbitMQ(一):环境安装(Docker容器化)及第一个程序

消息中间件

1、消息(message)是指在应用间传送的数据。消息可以非常简单,比如一个文本字符串;也可以很复杂,比如对象。
2、消息中间件(Message Queue Middleware,简称MQ),是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通讯来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间通信。
3、RabbitMQ支持事务、消息传递有丰富的安全机制;kafka性能比Rabbit MQ优秀、但是不支持事务,Kafka适用于对消息安全要求一般的日志系统,Rabbit MQ适用于订单系统、注册登陆的验证码等场景;Rocket MQ是阿里开发并贡献给apache维护的项目,但是一些高级特性是阿里云平台提供并收费的,因此一般的消息队列场景、Rabbit MQ会优先考虑,注重极致性能的场景、优选kafka。

Rabbit MQ的安装需要Erlang的环境,我们直接使用docker安装Rabbit MQ会省去很多配置工作

docker安装

可以在windows10或Mac中直接安装docker服务、不需要借助centos7虚拟机,在生产环境、绝大部分还是以centos为服务器的、因此在centos7中安装docker服务很有必要。

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
  • 安装必要的包
  yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
  • 设置稳定的仓库
    yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  • 测试仓库
yum-config-manager --enable docker-ce-nightly

yum-config-manager --enable docker-ce-test
  • 执行安装docker命令,不指定版本、默认安装最新版本
yum install docker-ce
  • 查看版本历史的命令。如果需要指定一个版本、可以先执行以下命令查看版本历史,再选择安装哪个版本,这一步非必须
yum list docker-ce --showduplicates | sort -r
  • 启动docker服务
systemctl start docker
  • 查看docker版本并运行hello world测试安装是否成功
docker --version

docker run hello-world

RabbitMQ容器部署

部署Rabbit MQ容器也非常简单,只需要拉取高手共享的Rabbit MQ镜像、然后本地启动容器就可以了。

  • 拉取Rabbit MQ镜像
docker pull rabbitmq:management
  • 运行
docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management

-hostname:指定容器主机名称
-name:指定容器名称
-p:将mq端口号映射到本地
15672:控制台端口号
5672:应用访问端口号
在本地Windows或mac宿主机访问:http://localhost:15672 ,账户密码为:admin/admin,在启动容器命令中可以修改

JavaAPI

- git代码地址,feature分支
rabbitmq-api : springboot整合
rabbitmq-original : amqp原始方式API实现
在这里插入图片描述

  • 生产者
import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author : zhaochuanzhen
 * @date : 2019/1/25 10:15
 * @Desc:
 */
public class HelloProducer {

    private static final String HOST = "127.0.0.1";
    private static final Integer POST = 5672;
    private static final String USERNAME = "admin";
    private static final String PASSWORD = "admin";
    
    private static final String QUEUE_NAME = "user_queue";
    private static final String EXCHANGE_NAME = "user_exchange";
    private static final String EXCHANGE_TYPE = "direct";
    private static final String ROUTING_KEY = "user.single";
    
    public static void main(String[] args) {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(HOST);
        factory.setPort(POST);
        factory.setUsername(USERNAME);
        factory.setPassword(PASSWORD);

        Connection conn = null;
        Channel channel = null;
        try {
            conn = factory.newConnection();
            channel = conn.createChannel();
            channel.exchangeDeclare(EXCHANGE_NAME, EXCHANGE_TYPE, true);
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY, null);
            channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, "陈独秀".getBytes());

            conn.addShutdownListener(new ShutdownListener() {
                @Override
                public void shutdownCompleted(ShutdownSignalException cause) {
                    System.out.println("shutdownCompleted ==> " + cause.getLocalizedMessage());
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } finally {
            if (channel != null) {
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }

            if (conn != null) {
                try {
                    conn.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

  • 消费者
import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * @author : zhaochuanzhen
 * @date : 2019/1/26 10:45
 * @Desc:
 */
public class HelloConsumer {

    private static final String HOST = "127.0.0.1";
    private static final Integer POST = 5672;
    private static final String USERNAME = "admin";
    private static final String PASSWORD = "admin";
    
    private static final String QUEUE_NAME = "user_queue";
    private static final String EXCHANGE_NAME = "user_exchange";
    private static final String EXCHANGE_TYPE = "direct";
    private static final String ROUTING_KEY = "user.single";

    public static void main(String[] args) {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(HOST);
        factory.setPort(POST);
        factory.setUsername(USERNAME);
        factory.setPassword(PASSWORD);

        boolean autoACK = false;
        String consumerTag = "consumerTag1";

        Connection conn = null;
        Channel channel = null;
        try {
            conn = factory.newConnection();
            channel = conn.createChannel();
            channel.exchangeDeclare(EXCHANGE_NAME, EXCHANGE_TYPE, true);
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY, null);

            channel.basicQos(64);
            Channel finalChannel = channel;
            channel.basicConsume(QUEUE_NAME, autoACK, consumerTag, new DefaultConsumer(finalChannel) {

                @Override
                public void handleDelivery(String consumerTag,
                                           Envelope envelope,
                                           AMQP.BasicProperties properties,
                                           byte[] body) throws IOException {
                    String routingKey = envelope.getRoutingKey();
                    String contentType = properties.getContentType();
                    long deliveryTag = envelope.getDeliveryTag();
                    finalChannel.basicAck(deliveryTag, false);
                    System.out.println(new String(body));
                }
            });

            TimeUnit.SECONDS.sleep(5);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (channel != null) {
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

  • 首先运行生产者,结果如下:Ready显示当前就绪消息数为1
    在这里插入图片描述
  • 运行消费者,可以看到控制台打印的消息内容,并且Rabbit MQ管理页面显示当前就绪消息为0.
    在这里插入图片描述

这只是Rabbit MQ最基本的操作,若要继续深入,需要理解交换器、队列、路由键、绑定、绑定键等概念,关于队列还有:死信队列、延迟队列、优先级队列等不同场景适用的队列。关于这些代码的编写逻辑、将在写完基本概念后、逐行讲解。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是用 Docker 搭建 RabbitMQ 集群的步骤: 1. 首先,确保已经安装DockerDocker Compose。 2. 在本地创建一个新的文件夹,用于存储 RabbitMQ 的配置文件和数据。 3. 在该文件夹中创建一个名为 docker-compose.yml 的文件,并将以下内容复制到该文件中: ``` version: '3' services: rabbitmq-node1: image: rabbitmq:3.8-management-alpine hostname: rabbitmq-node1 environment: RABBITMQ_ERLANG_COOKIE: "secret_cookie" RABBITMQ_DEFAULT_USER: "admin" RABBITMQ_DEFAULT_PASS: "admin" ports: - "5672:5672" - "15672:15672" volumes: - ./data/node1:/var/lib/rabbitmq - ./config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf networks: rabbitmq-network: aliases: - rabbitmq-node1 rabbitmq-node2: image: rabbitmq:3.8-management-alpine hostname: rabbitmq-node2 environment: RABBITMQ_ERLANG_COOKIE: "secret_cookie" RABBITMQ_DEFAULT_USER: "admin" RABBITMQ_DEFAULT_PASS: "admin" volumes: - ./data/node2:/var/lib/rabbitmq - ./config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf networks: rabbitmq-network: aliases: - rabbitmq-node2 rabbitmq-node3: image: rabbitmq:3.8-management-alpine hostname: rabbitmq-node3 environment: RABBITMQ_ERLANG_COOKIE: "secret_cookie" RABBITMQ_DEFAULT_USER: "admin" RABBITMQ_DEFAULT_PASS: "admin" volumes: - ./data/node3:/var/lib/rabbitmq - ./config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf networks: rabbitmq-network: aliases: - rabbitmq-node3 networks: rabbitmq-network: driver: bridge ``` 该文件定义了一个 RabbitMQ 集群,由三个节点组成。每个节点都有一个名称、一个主机名、一个环境变量(Erlang cookie、默认用户名和密码)、端口映射、数据卷和网络别名。该文件还定义了一个网络,用于连接三个节点。 4. 在该文件夹中创建一个名为 config 的文件夹,并在其中创建一个名为 rabbitmq.conf 的文件。将以下内容复制到该文件中: ``` cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config cluster_formation.classic_config.nodes.1 = rabbit@rabbitmq-node1 cluster_formation.classic_config.nodes.2 = rabbit@rabbitmq-node2 cluster_formation.classic_config.nodes.3 = rabbit@rabbitmq-node3 ``` 该文件定义了 RabbitMQ 集群的配置,包括节点发现方式和节点列表。 5. 在该文件夹中创建一个名为 data 的文件夹,用于存储 RabbitMQ 节点的数据。 6. 在终端中导航到该文件夹,并运行以下命令: ``` 回复:搭建rabbitmq集群需要使用Docker,可以参考Docker官方文档:https://docs.docker.com/engine/examples/rabbitmq/。好的,以下是如何使用Docker搭建RabbitMQ集群的步骤: 1. 首先,确保您已经在本地安装Docker,并且已经在命令行中登录到了Docker。 2. 在命令行中输入以下命令,以在Docker中下载和运行RabbitMQ镜像: ``` docker run -d --name rabbitmq-node1 -p 5672:5672 -p 15672:15672 rabbitmq:3.8-management ``` 这将下载最新版本的RabbitMQ,并将其运行在Docker容器中。这里我们指定了两个端口,一个用于AMQP通信(5672),另一个用于Web管理界面(15672)。 3. 等待RabbitMQ容器启动后,您可以使用以下命令在另一个容器中运行第二个RabbitMQ节点: ``` docker run -d --name rabbitmq-node2 -p 5673:5672 -p 15673:15672 --link rabbitmq-node1:rabbit1 rabbitmq:3.8-management ``` 这将启动第二个RabbitMQ容器,并将其链接到第一个容器,以便它们可以互相通信。请注意,我们使用了不同的端口(5673和15673),以便避免与第一个节点的端口冲突。 4. 接下来,您可以使用以下命令启动第三个节点: ``` docker run -d --name rabbitmq-node3 -p 5674:5672 -p 15674:15672 --link rabbitmq-node1:rabbit1 --link rabbitmq-node2:rabbit2 rabbitmq:3.8-management ``` 同样,我们指定了不同的端口,并将此容器链接到前两个容器,以创建一个RabbitMQ集群。 5. 等待第三个节点启动后,您可以使用以下命令检查集群状态: ``` docker exec -it rabbitmq-node1 rabbitmqctl cluster_status ``` 这将显示集群中所有节点的状态。 恭喜!您已经成功地在Docker中部署了一个RabbitMQ集群。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值