RocketMQ入门-搭建与demo
Apache RocketMQ由4个部分组成:nameServer,broker,producer,consumer,另外还提供了一个console用于监控。
- nameServer会提供基本的服务发现和路由,producer和consumer通过nameServer可以获取到broker的地址,从而与broker进行通讯
- broker则提供真正的MQ功能
图片来自官网http://rocketmq.apache.org/docs/rmq-arc/
使用docker搭建RocketMQ
首先确认机器的内网地址和外网地址,我以{内网IP},{外网IP}表示
nameserver
docker run -d -p 9876:9876 --name rmqserver \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
foxiswho/rocketmq:server
broker
在本地创建配置文件/etc/rocketmq/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 以下是我添加的
# 配置nameserver的地址,broker需要上报状态给nameserver
namesrvAddr = {内网IP}:9876
# 配置监听地址,nameserver会将此地址提供给客户端使用
# 如果mq服务需要在外网使用则配成外网,需要在内网使用则配成内网地址
brokerIP1 = {外网IP}
docker run -d -p 10911:10911 -p 10909:10909 --name rmqb \
-v /etc/rocketmq/broker.conf:/etc/rocketmq/broker.conf \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
foxiswho/rocketmq:broker
console
docker run --name rmqconsole -p 8080:8080 \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr={内网IP}:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-t styletang/rocketmq-console-ng
demo
消费者
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("s1");
consumer.setNamesrvAddr("{外网IP}:9876");
consumer.subscribe("mytopic", "mytag");
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
for(int i=0; i<msgs.length(); i++){
MessageExt msg = msgs.get(i);
System.out.println(msg.getTopic() + " " + msg.getTags() + " " + new String(msg.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
生产者
DefaultMQProducer producer = new DefaultMQProducer("s2");
producer.setNamesrvAddr("{外网IP}:9876");
producer.start();
Message msg = new Message();
msg.setTopic("mytopic");
msg.setTags("mytag");
msg.setBody("mybody".getBytes());
producer.send(msg);