最近一直在做消息通知方面的项目,其中用的是阿里公司的RocketMq(简称RMQ)作为消息服务,RMQ是阿里开发的一个很不错的消息开源组件,支持亿级消息堆积能力,它也为淘宝天猫双十一提供了稳定的消息传递平台,现在在阿里云也推出了ONS服务,也是基于RMQ组件,RMQ在应用范围还是很广的,今天先简单介绍一下如何搭建服务。
RMQ的结构分为四个部分:生产者、消费者、nameserver、brokerserver
nameserver:nameserver接收broker的请求注册broker路由信息。收client的请求根据某个topic获取所有到broker的路由信息。
brokerserver:消息的接收和推送,
生产者:发送消息,将消息推送给brokerserver。
消费者:接收消息,从brokerserver上获取消息。
参考[Windows下安装JDK],注意,RMQ需要1.6以上64位的版本。
访问 RMQ官方Github 下载页,下载服务器端和客户端压缩包。
将下载好的alibaba-rocketmq-3.2.6.tar.gz解压到一个目录。如 D:\soft\alibaba-rocketmq\
启动CMD,进入D:\soft\alibaba-rocketmq\bin目录,然后执行
mqnamesrv.exe -n 172.16.192.186:9876↙
其中,172.16.192.186为我本机的IP。
如果出现The Name Server boot success.则说明nameserver启动成功。
然后再启动一个CMD,在刚才的目录中执行
mqbroker.exe -n 172.16.192.186:9876↙
如果出现下面文字,则说明broker启动成功。
The broker[jiale-pc, 172.16.192.186:10911] boot success. and name server is 172.16.192.186:9876
参考[Linux下安装JDK]
linux下安装jdk和RMQ相对简单。
安装RMQ
Java
wget https://github.com/alibaba/RocketMQ/releases/download/v3.2.6/alibaba-rocketmq-3.2.6.tar.gz
tar alibaba-rocketmq-3.2.6.tar.gz
cd rocketmq
sh install.sh
进入bin目录
运行 nohup mqnamesrv -n 172.16.192.186:9876 &↙ 启动nameserver服务。
运行 nohup mqbroker -n 172.16.192.186:9876↙ 启动broker服务
其中,172.16.192.186为我本机的IP。
完成了上面几部,基本上已经完成了RMQ的搭建,下面咱们用客户端进行测试一下。
创建生产者和消费者,然后生产者生产消息,消费者消费消息。具体代码如下。
新建一个Java类,如下代码
Java
public class Consumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(
"rmq-group");
consumer.setNamesrvAddr("172.16.192.186:9876");
consumer.setInstanceName("rmq-instance");
consumer.subscribe("TopicA-test", "TagA");
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(
List msgs, ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
System.out.println(new String(msg.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
System.out.println("Consumer Started.");
}
}
创建一个java类,如下:
Java
public class Producer {
public static void main(String[] args) throws MQClientException, InterruptedException {
DefaultMQProducer producer = new DefaultMQProducer("rmq-group");
producer.setNamesrvAddr("172.16.192.186:9876");
producer.setInstanceName("rmq-instance");
producer.start();
try {
for (int i = 0; i < 3; i++) {
Message msg = new Message("TopicA-test",// topic
"TagA",// tag
(new Date() + "Hello RocketMQ ,QuickStart" + i)
.getBytes()// body
);
SendResult sendResult = producer.send(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
producer.shutdown();
}
}
运行Consumer和Producer,就可以看到生产者推送了消息,很快生产者就接收到了消息。