RocketMQ 是阿里巴巴开源的分布式消息中间件。
RocketMQ 特点:
●是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式等特点
●Producer、Consumer、队列都可以分布式
●Producer 向一些队列轮流发送消息,队列集合称为 Topic,Consumer 如果做广播消费,则一个 Consumer 实例消费这个 Topic 对应的所有队列,如果做集群消费,则多个 Consumer 实例平均消费这个 Topic 对应的队列集合
能够保证严格的消息顺序
●支持拉(pull)和推(push)两种消息模式
●高效的订阅者水平扩展能力
●实时的消息订阅机制
●亿级消息堆积能力
●支持多种消息协议,如 JMS、OpenMessaging 等
●较少的依赖
下载地址:http://rocketmq.apache.org/dowloading/releases/
下载后上传到服务器上(我这里使用的是阿里centos7.6云服务器)
执行unzip rocketmq-all-4.7.0-source-release.zip命令进行解压(若不能执行yum install -y unzip zip)
cd进入解压目录
修改启动需要的内存(因为默认的非常大)
cd bin/
vi runserver.sh,修改后输入:wq回车保存
vi runbroker.sh,修改后输入:wq回车保存
修改conf目录下broker.conf,增加brokerIP1=公网ip
再进入bin目录
启动nameserver
nohup sh mqnamesrv -n 公网ip:端口 &(&表示后台启动)
启动broker
nohup sh mqbroker -c …/conf/broker.conf -n 公网ip:9876 autoCreateTopicEnable=true &
如果消费者、生产者位于不通的网段需要经过防火墙的话,需要开通到broker(9876)和nameserver(10911)的防火墙端口,Rocket默认开启了VIP通道,VIP通道端口为10911-2=10909。若Rocket服务器未启动端口10909,则报connect to <> failed的报错。
建议如果rocketMQ搭建在远程服务器,需要本地测试,则三个端口都添加到安全组。(9876,10911,10909)
以下为没有开通端口可能会报的错误:
org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout
com.alibaba.rocketmq.client.exception.MQClientException: No route info of this topic, TopicTest1
安装可视化
1、下载rocketmq-externals-master.zip上传到linux中(下载地址https://github.com/apache/rocketmq-externals)
2、unzip rocketmq-externals-master.zip
3、进入解压目录后,cd rocketmq-console/src/main/resources
4、vi application.properties,修改如下
5、切换到rocketmq-console目录下,执行mvn clean package -Dmaven.test.skip=true(需要下载maven,安装如下:
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
修改配置文件 vi /etc/profile,追加如下两行(注意M2_HOME是你自己maven的解压目录)
6、进入target目录,执行nohup java -jar rocketmq-console-ng-1.0.1.jar &
7、浏览器输入公网ip:8086就可以访问到(需要在安全组开放8086),如图
pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gjm</groupId>
<artifactId>Mq</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</project>
rocketmq-spring-boot-starter的依赖包是不能直接从中央仓库下载的,需要自己通过源码install到本地仓库的
步骤如下:
下载地址:https://github.com/apache/rocketmq-spring(多打几次,打不开留言,我发百度网盘连接)
注意一下版本问题,选择2.0.0的,如下:
下载到电脑上解压,进入如图目录rocketmq-spring-2.0.0下后在此位置输入cmd回车(本地需要安装和配置好maven)
输入mvn clean install即可编译rocketmq-spring-boot-starter到本地仓库,然后pom引用就可以了。
新建两个springboot项目,一个作为消息提供者,一个作为消息消费者,使用依赖相同。
消息提供者代码:
package com.gjm.temp;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.PostConstruct;
/**
* @author GJM
* @title
* @data 2020/4/8 10:20
*/
@SpringBootApplication
public class SpringProducer {
@Autowired
RocketMQTemplate rocketMQTemplate;
@PostConstruct
public void exec() {
for (int i = 0; i < 20; i++) {
String msg = "hello world ! " + i;
System.out.println("发送数据到my-top:tag1,megssage=" + msg);
rocketMQTemplate.convertAndSend("my-topic:tag1", msg);
//my-topic:tag1分别于消费者绑定
}
}
public static void main(String[] args) {
SpringApplication.run(SpringProducer.class, args);
}
}
消息消费者:
启动类:
package com.gjm.rocketmq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author GJM
* @title
* @data 2020/4/2 16:43
*/
@SpringBootApplication
public class Start{
public static void main(String[] args) {
SpringApplication.run(Start.class, args);
}
}
消费者监听topic
package com.gjm.rocketmq;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
/**
* @author GJM
* @title
* @data 2020/4/8 10:19
*/
@Component
@RocketMQMessageListener(
topic = "my-topic",
consumerGroup = "gjm-group",
selectorExpression = "tag1",
consumeMode = ConsumeMode.ORDERLY,
messageModel = MessageModel.CLUSTERING,
consumeThreadMax = 1
)
public class SpringConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String msg) {
System.out.println("接收到消息 -> " + msg);
}
}
application.properties文件
# NameServer地址
spring.rocketmq.nameServer=xx.xx.xx.xx:9876
# 生产者的组名需要和消费者监听consumerGroup一致
spring.rocketmq.producer.group=gjm-group
topic和selectorExpression与消息提供者一致,即可完成消费