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
该文件定义了两个服务:namesrv
和 broker
。namesrv
是 RocketMQ 的名称服务器,负责管理和维护消息队列的元数据信息。broker
是消息队列的代理服务器,负责接收和处理消息。
我们将 9876
端口映射到宿主机上,这样可以通过宿主机的 IP 地址和该端口号来访问 RocketMQ 的管理界面。
3. 启动容器
在安装目录下执行以下命令,启动容器:
docker-compose up -d
该命令将会下载并启动 RocketMQ 的镜像,并创建两个容器:namesrv
和 broker
。
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();
}
}