Docker 安装 RocketMQ 5.x

RocketMQ 是一个开源的分布式消息中间件,由阿里巴巴开发并开源。它具有高可用性、高性能和可扩展性的特点,被广泛应用于大规模数据处理和实时消息推送等场景。本文将介绍如何使用 Docker 安装 RocketMQ 5.x。

1. 环境准备

在开始安装之前,需要确保已经安装了 Docker 和 Docker Compose。Docker 是一个开源的容器化平台,可以帮助我们快速部署和管理应用程序。Docker Compose 是 Docker 的一个工具,可以通过 YAML 文件定义和管理多个容器的关系。

2. 创建 Docker Compose 文件

首先,创建一个名为 docker-compose.yml 的文件,并将以下内容复制到文件中:

version: '3'
services:
  namesrv:
    image: rocketmqinc/rocketmq:4.5.2
    command: sh mqnamesrv
    ports:
      - "9876:9876"
    volumes:
      - ./logs/namesrv:/home/rocketmq/logs

  broker:
    image: rocketmqinc/rocketmq:4.5.2
    command: sh mqbroker -n namesrv:9876
    ports:
      - "10909:10909"
      - "10911:10911"
    volumes:
      - ./logs/broker:/home/rocketmq/logs
      - ./store:/home/rocketmq/store

该文件定义了两个服务:namesrvbrokernamesrv 是 RocketMQ 的名称服务器,负责管理和维护消息队列的元数据信息。broker 是消息队列的代理服务器,负责接收和处理消息。

我们将 9876 端口映射到宿主机上,这样可以通过宿主机的 IP 地址和该端口号来访问 RocketMQ 的管理界面。

3. 启动容器

在安装目录下执行以下命令,启动容器:

docker-compose up -d

该命令将会下载并启动 RocketMQ 的镜像,并创建两个容器:namesrvbroker

4. 验证安装

可以通过以下命令查看容器的状态:

docker-compose ps

如果一切正常,会看到类似以下输出:

       Name                      Command               State                    Ports
------------------------------------------------------------------------------------------------------
rocketmq_broker_1       sh mqbroker -n namesrv:9 ...   Up      0.0.0.0:10909->10909/tcp, 0.0.0.0:10911->10911/tcp
rocketmq_namesrv_1     sh mqnamesrv                    Up      0.0.0.0:9876->9876/tcp

可以使用浏览器访问 http://<宿主机IP地址>:9876,进入 RocketMQ 的管理界面。

5. 使用 RocketMQ

5.1 生产者

下面是一个使用 Java 编写的简单的 RocketMQ 生产者示例:

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;

public class SimpleProducer {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("producer_group");
        producer.setNamesrvAddr("localhost:9876");
        producer.start();
        
        Message message = new Message("topic", "tag", "Hello, RocketMQ!".getBytes());
        producer.send(message);
        
        producer.shutdown();
    }
}

5.2 消费者

下面是一个使用 Java 编写的简单的 RocketMQ 消费者示例:

import org.apache.rocketmq.client.consumer.DefaultMQConsumer;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.client.exception.MQClientException;

public class SimpleConsumer {
    public static void main(String[] args) throws MQClientException {
        DefaultMQConsumer consumer = new DefaultMQConsumer("consumer_group");
        consumer.setNamesrvAddr("localhost:9876");
        consumer.subscribe("topic", "*");
        consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
            for (MessageExt msg : msgs) {
                System.out.println(new String(msg.getBody()));
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });
        
        consumer.start();
    }
}

6. 总结