1. 前言
前文对RocketMQ的基本概念做了一些介绍,本文将小试牛刀一下。本文主要讲述如何通过docker来部署单机版的RocketMQ。部署RocketMQ的最核心是部署nameserver以及部署broker。然后,我们还需要安装可视化界面,在RocketMQ的官网上提供的是基础的安装方式。
2. 拉取镜像
git clone https://github.com/apache/rocketmq-docker.git
如果访问不了github的话则需要科学上网。该命令会拉取最新的rocketmq镜像。
下载好之后,可以通过访问 https://archive.apache.org/dist/rocketmq/ 命令来查看rocketmq镜像的版本。
下载好之后 执行cd rocketmq-docker
命令跳转到 ./rockeetmq-docker
命令。
然后,跳转到 image-build
目录,然后,执行 build-image.sh 命令构建镜像。
cd image-build sh build-image.sh 5.1.3 alpine
docker images
3. 下载可视化工具镜像
docker pull apacherocketmq/rocketmq-dashboard:latest
4. broker配置
这里自定义一个路径用于存放broker的配置,然后在此路径下创建一个broker.conf的文件。
mkdir -p /Users/manongfeige/config/rocketmq cd /Users/manongfeige/config/rocketmq/ touch broker.conf vim broker.conf
broker.conf文件的配置信息如下:
# 所属集群名称,如果节点较多可以配置多个 brokerClusterName = DefaultCluster #broker名称,master和slave使用相同的名称,表明他们的主从关系 brokerName = broker-a #0表示Master,大于0表示不同的slave brokerId = 0 #表示几点做消息删除动作,默认是凌晨4点 deleteWhen = 04 #在磁盘上保留消息的时长,单位是小时 fileReservedTime = 48 #有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制; brokerRole = ASYNC_MASTER #刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功 状态,ASYNC_FLUSH不需要; flushDiskType = ASYNC_FLUSH # 设置broker节点所在服务器的ip地址、物理ip,不能用127.0.0.1、localhost、docker内网ip brokerIP1 = 192.168.41.121
这里需要注意的是设置broker节点所在的服务器ip地址,必须是真实的物理ip,不能用127.0.0.1、localhost、docker内网ip。
在mac电脑中通过 ifconfig
命令来查看。
配置好broker.conf,接着配置启动 RocketMQ的yml文件。这里创建一个 rocketmq.yml 文件,跟broker.conf文件放在同一个目录下。
5.启动文件 rocketmq.yml 配置
version: '3' services: namesrv: image: apache/rocketmq:5.1.3-alpine container_name: rmqnamesrv ports: - 9876:9876 command: sh mqnamesrv broker: image: apache/rocketmq:5.1.3-alpine container_name: rmqbroker ports: - 10909:10909 - 10911:10911 - 10912:10912 volumes: - /Users/manongfeige/config/rocketmq/broker.conf:/home/rocketmq/rocketmq-5.1.3/conf/broker.conf command: sh mqbroker -n namesrv:9876 -c /home/rocketmq/rocketmq-5.1.3/conf/broker.conf depends_on: - namesrv mqconsole: image: apacherocketmq/rocketmq-dashboard container_name: rmqdashboard ports: - 8181:8080 environment: JAVA_OPTS: -Drocketmq.config.namesrvAddr=namesrv:9876 -Drocketmq.config.isVIPChannel=false depends_on: - namesrv
此配置文件主要分为三部分:
- 第一部分是:nameserver的配置。nameserver默认的端口是 9876。镜像的话这里指定为:apache/rocketmq:5.1.3-alpine。如果版本不同需要做对应的修改。如果不知道你的镜像是啥可以在docker中查看。
- 配置broker
broker 需要注意的是将前面配置的 broker.conf 文件映射到容器中的/home/rocketmq/rocketmq-5.1.3/conf/broker.conf
中去。 - 配置myconsole
主要是设置使用的镜像,容器的名称以及使用的端口号。console 依赖的是Java环境以及nameserver。
配置好之后,接着执行如下命令:
docker-compose -f rocketmq.yml up -d
启动正常的命令应该是这样的,然后。我们访问一下 http://localhost:8181/#/producer 控制台。
6. 测试消息的发送和接收
<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.2.3</version> </dependency>
rocketmq.name-server=192.168.31.191:9876 rocketmq.producer.group=myProducerGroup
@Component public class Producer { @Autowired private RocketMQTemplate rocketMQTemplate; public void sendMessage(String topic, String message) { rocketMQTemplate.convertAndSend(topic, message); } }
@Service @RocketMQMessageListener(topic = "test_topic", consumerGroup = "test_consumer_group") public class Consumer implements RocketMQListener<String> { @Override public void onMessage(String s) { System.out.println("Received message:" + s); } }
@SpringBootApplication public class RocketmqDemoApplication { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(RocketmqDemoApplication.class, args); Producer producer = run.getBean(Producer.class); producer.sendMessage("test_topic", "你好呀,码农飞哥"); } }