最近学习使用 rocketmq,需要搭建 rocketmq 服务端,本文主要记录 rocketmq 搭建过程以及这个过程踩到的一些坑。
准备工作
在搭建之前,我们需要做一些准备工作,这里我们需要使用 docker
搭建服务,所以需要提前安装 docker。此外,由于 rocketmq
需要部署 broker
与 nameserver
,考虑到分开部署比较麻烦,这里将会使用 docker-compose
。
rocketmq 架构图如下:
另外,还需要搭建一个 web 可视化控制台,可以监控 mq 服务状态,以及消息消费情况,这里使用 rocketmq-console
,同样该程序也将使用 docker 安装。
部署过程
首先我们需要 rocketmq docker 镜像,这里我们可以选择自己制作,直接拉取 git@github.com:apache/rocketmq-docker.git
,然后再制作镜像。 另外还可以直接使用 docker hub 上官方制作的镜像,镜像名: rocketmqinc/rocketmq
接着创建 mq 配置文件 broker.conf
,文件放置到 /opt/docker/container/rocketmq/conf
,配置如下:
brokerClusterName = DefaultCluster
brokerName = rmqbroker
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 如果是本地程序调用云主机 mq,这个需要设置成 云主机 IP
brokerIP1=192.168.1.2
在创建如下文件夹:/opt/docker/container/rocketmq/logs
,/opt/docker/container/rocketmq/store
,最后创建 docker-compose.yml 文件,配置如下:
version: '2'
services:
namesrv:
image: rocketmqinc/rocketmq
container_name: rmqnamesrv
ports:
- 9876:9876
volumes:
- ~/opt/docker/container/rocketmq/logs:/home/rocketmq/logs
- ~/opt/docker/container/rocketmq/store:/home/rocketmq/store
command: sh mqnamesrv
broker:
image: rocketmqinc/rocketmq
container_name: rmqbroker
ports:
- 10909:10909
- 10911:10911
- 10912:10912
volumes:
- ~/opt/docker/container/rocketmq/logs:/home/rocketmq/logs
- ~/opt/docker/container/rocketmq/store:/home/rocketmq/store
- ~/opt/docker/container/rocketmq/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf
#command: sh mqbroker -n namesrv:9876
command: sh mqbroker -n namesrv:9876 -c ../conf/broker.conf
depends_on:
- namesrv
environment:
- JAVA_HOME=/usr/lib/jvm/jre
console:
image: styletang/rocketmq-console-ng
container_name: rocketmq-console-ng
ports:
- 8087:8080
depends_on:
- namesrv
environment:
- JAVA_OPTS= -Dlogging.level.root=info -Drocketmq.namesrv.addr=rmqnamesrv:9876
- Dcom.rocketmq.sendMessageWithVIPChannel=false
注意点
这里需要注意 rocketmq broker 与 rokcetmq-console 都需要与 rokcetmq nameserver 连接,需要知道 nameserver ip。使用 docker-compose 之后,上面三个 docker 容器将会一起编排,可以直接使用容器名代替容器 ip,如这里 nameserver 容器名 rmqnamesrv。
配置完成之后,运行 docker-compose up 启动三个容器,启动成功后,访问 ip:8087,查看 mq 外部控制台,如果可以看到以下信息,rocketmq 服务启动成功。
相关命令
# 启动容器
docker-compose -f docker-compose.yml up -d
# 停止容器
docker-compose down
SpringBoot 实例
项目配置
这里将会使用 springboot 快速上手使用 mq,将会使用 rocketmq-spring-boot-starter 模块,pom 配置如下:
<!--在pom.xml中添加依赖-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
## application.yml
rocketmq:
name-server: 192.168.1.2:9876
producer:
group: producer-group
生产者:
@RestController
public class RocketController {
private final RocketMQTemplate rocketMQTemplate;
public RocketController(RocketMQTemplate rocketMQTemplate) {
this.rocketMQTemplate = rocketMQTemplate;
}
// 发送给Broker,默认会自动创建topic,topic和tag用冒号分隔
@GetMapping("/rocket/send")
public String rocketSend() {
LocalDateTime currentTime = LocalDateTime.now();
this.rocketMQTemplate.convertAndSend("rocket-topic-1", currentTime.toString());
return currentTime.toString();
}
// 延时消息,RocketMQ支持这几个级别的延时消息,不能自定义时长
// 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
@GetMapping("/rocket/delayMsg/send")
public String rocketDelayMsgSend() {
LocalDateTime currentTime = LocalDateTime.now();
this.rocketMQTemplate.syncSend("rocket-topic-1:tag-2", MessageBuilder.withPayload(currentTime.toString()).build(), 2000, 3);
return currentTime.toString();
}
}
消费者:
@Component
@Slf4j
public class RokcetServiceListener {
@Service
@RocketMQMessageListener(consumerGroup = "consumer-group-1", topic = "rocket-topic-1")
public class Consumer1 implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
log.info("consumer1 rocket收到消息:{}", s);
}
}
// RocketMQ支持两种消费方式,集器消费和广播消费
@Service
@RocketMQMessageListener(consumerGroup = "consumer-group-2", topic = "rocket-topic-1",
selectorExpression = "tag2", messageModel = MessageModel.BROADCASTING)
public class Consumer2 implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
log.info("consumer2 rocket收到消息:{}", s);
}
}
}
参考文档: