写在前面:本人是Linux系统小白,虽然有买阿里云的服务器,但是在使用操作上面还是一知半解,一脸懵逼。由于本人服务器上已经部署了项目所需的其余东西,所以不敢轻举妄动(晚上就因为一些骚操作差点被队友拿刀砍了),所以这次安装测试RocketMQ,我先登录阿里云控制台为服务器创建了一份快照。就算出事也有补救机会。以此篇博客记录我的安装过程以及过程中遇到的坑,最后给出我的示例代码。亲测可用。
参考:https://www.jianshu.com/p/b570884e0dd6
目录
8.如果要开启防火墙,则需要开放特定端口(以下内容未经过本人测试)
一、下载
1. 使用如下语句下载rocketmq的包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip
下载完成
查看下载的包
二、解压
1. 在/usr/local下新建一个程序文件夹用来放rocketmq
mkdir -p /usr/local/rocketmq
查看新建的文件夹,ok建好了
2. 将刚刚下载的rocket包解压到我们新建的程序文件夹里面
unzip rocketmq-all-4.2.0-bin-release.zip -d /usr/local/rocketmq
如果提示没有unzip的话,使用yum安装一下
yum install unzip
安装之后,再次执行解压命令(注意:需要到rocket包的那个目录下执行命令),解压后到路径下看一眼嘻嘻(小白的卑微)
三、运行
3.1 修改PATH路径
命令
vim /etc/profile
在末尾追加
#set rocketmq environment
export ROCKETMQ_HOME=/usr/local/rocketmq
#set path
export PATH=$ROCKETMQ_HOME/bin:$PATH
export NAMESRV_ADDR=你的阿里云服务器公网IP:9876
保存后退出,执行以下命令,让文件生效
source /etc/profile
3.2 尝试启动mqnamesrv
解压后在当前目录(也就是rocketmq的这个文件夹)执行以下命令,测试nameServer
nohup sh bin/mqnamesrv &
服务器反馈如下:
让我们输入下面这个命令来看一下出了什么问题
cat nohup.out
反馈如下:
错误日志在/usr/local/rocketmq/hs_err_pid18305.log,我们使用命令来查看错误日志:
cat hs_err_pid18305.log
错误日志如下:
英语不好,所以我去谷歌翻译翻译了一下:
问题在于内存不足,我们可以将测试环境的内存容量调低一点
3.3 调低内存
输入命令:
vim runbroker.sh
可以看到如下信息,白圈标注的地方就是要修改的地方
修改如下:(注:要修改文件需要按一下“ i ”,修改完成后按下“ Esc ”,保存并退出是“ :wq! ”,强制退出是“ :q! ”)
将
-server -Xms8g -Xmx8g -Xmn4g
修改为
-server -Xms256m -Xmx256m -Xmn128m
修改后的文件内容如下
同理修改runserver.sh(我还修改了tools.sh,也是大的地方就改小)
修改后重新启动,以下列出可能会用到的命令
3.4 需要使用到的命令
3.4.1 开启服务命令
//启动nameServer
nohup sh mqbroker -n localhost:9876 &
/***启动broker**/
//可以先尝试这个启动命令能否自己创建topic
nohup sh mqbroker -n localhost:9876 autoCreateTopicEnable=true &
//如果不行,使用3.4.4的命令在Centos7手动创建topic后,使用这个命令启动broker
nohup sh mqbroker -n localhost:9876 -c ../conf/broker.conf &
3.4.2 查看日志命令
tail -f ~/logs/rocketmqlogs/namesrv.log
tail -f ~/logs/rocketmqlogs/broker.log
3.4.3 关闭服务命令
sh mqshutdown namesrv
sh mqshutdown broker
3.4.4 手动在命令行创建topic命令(bin目录下)
./mqadmin updateTopic -n localhost:9876 -b localhost:10911 -t testTopic
3.4.5 查看当前所有的topic
./mqadmin topicList
3.4.6 查看当前开启的服务命令
jps
四、程序代码示例
4.1 代码
代码复制到本地后要自己alt+enter引入一些包,注:请先引入pom依赖
4.1.1 pom依赖
<!-- rocketmq -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-common</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.29</version>
</dependency>
4.1.2 application.properties
#rocketmq
apache.rocketmq.consumer.PushConsumer=PushConsumer
apache.rocketmq.producer.producerGroup=Producer
apache.rocketmq.namesrvAddr=你的阿里云公网IP:9876
4.1.3 RocketController
@RestController
@RequestMapping("/rocket")
public class RocketController {
@Autowired
private ProducerService producer;
@RequestMapping("/push")
public String pushMsg(String msg) {
return producer.send("testTopic", "push", msg);
}
}
4.1.4 ConsumerService
@Component
public class ConsumerService {
@Value("${apache.rocketmq.consumer.PushConsumer}")
private String consumerGroup;
@Value("${apache.rocketmq.namesrvAddr}")
private String namesrvAddr;
@PostConstruct
public void defaultMQPushConsumer() {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerGroup);
consumer.setNamesrvAddr(namesrvAddr);
try {
consumer.subscribe("testTopic", "push");
// 如果是第一次启动,从队列头部开始消费
// 如果不是第一次启动,从上次消费的位置继续消费
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.registerMessageListener((MessageListenerConcurrently) (list, context) -> {
try {
for (MessageExt messageExt : list) {
String messageBody = new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET);
System.out.println("[Consumer] msgID(" + messageExt.getMsgId() + ") msgBody : " + messageBody);
}
} catch (Exception e) {
e.printStackTrace();
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
consumer.start();
System.out.println("[Consumer 已启动]");
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.1.5 ProducerService
@Service
//@Component
public class ProducerService {
@Value("${apache.rocketmq.producer.producerGroup}")
private String producerGroup;
@Value("${apache.rocketmq.namesrvAddr}")
private String namesrvAddr;
private DefaultMQProducer producer;
@PostConstruct
public void initProducer() {
producer = new DefaultMQProducer(producerGroup);
producer.setNamesrvAddr(namesrvAddr);
producer.setRetryTimesWhenSendFailed(3);
try {
producer.start();
System.out.println("[Producer 已启动]");
} catch (Exception e) {
e.printStackTrace();
}
}
public String send(String topic, String tags, String msg) {
SendResult result = null;
try {
Message message = new Message(topic, tags, msg.getBytes(RemotingHelper.DEFAULT_CHARSET));
result = producer.send(message,10000);
System.out.println("[Producer] msgID(" + result.getMsgId() + ") " + result.getSendStatus());
} catch (Exception e) {
e.printStackTrace();
}
// System.out.println(result.toString());
return "{\"MsgId\":\"" + result.getMsgId() + "\"}";
}
@PreDestroy
public void shutDownProducer() {
if (producer != null) {
producer.shutdown();
}
}
4.2 运行
4.2.1 运行程序,会在idea控制台输出信息:
4.2.2 在本地浏览器上访问
http://localhost:8080/rocket/push?msg=hello
4.2.3 会出现如下页面:
4.2.4 同时,idea控制台会输出
五、安装rocketmq的可视化管理工具
5.1下载
1. 进入到rocketmq文件夹
cd /usr/local/rocketmq
2. 克隆
git clone https://github.com/apache/rocketmq-externals
如果你没有安装git,请使用以下命令安装git:
yum install git
5.2 修改配置文件
进入到下面路径
cd /usr/local/rocketmq/rocketmq-externals/rocketmq-console/src/main/resources
使用vim修改application.properties
vim application.properties
修改如下配置
server.port=8082 // 服务端口号
rocketmq.config.namesrvAddr=阿里云服务器的私有IP:9876 // 配置服务地址
rocketmq.config.dataPath=/tmp/rocketmq-console/data // mq数据路径,可以自己修改
使用maven打包
cd /usr/local/rocketmq/rocketmq-externals/rocketmq-console
mvn clean package -Dmaven.test.skip=true
5.3 运行
(需要一直在后台运行,其实也可能不需要)
nohup java -jar rocketmq-console-ng-1.0.1.jar --server.port=8082 --rocketmq.config.namesrvAddr=阿里云私有IP:9876 &
在自己本机的电脑浏览器输入
http:/阿里云外网IP:8082/#/
出现以下界面就妥了
最后:列举我遇到的坑
坑1:需要修改rocketmq的brokerIP
使用vim编辑conf目录下的broker.conf,追加brokerIP1和brokerIP2的定义,马赛克掉的是我阿里云服务器的外网ip(它默认使用了私有ip进行连接,所以程序报错)
修改了brokerIP后,需要重启rocketmq,注意,在启动broker的时候,需要使用如下命令,使用配置文件中的内容进行启动
nohup sh mqbroker -n localhost:9876 -c ../conf/broker.conf &
坑2:这个纯属自己蠢,没有创建阿里云服务器的安全组规则
百读文章说创建两个,一个9876是肯定的,另一个是10911,然而我配置了还是不行,注意!!!请看你的报错信息,报错信息会给出你自己真实需要的端口,比如,我的就是10909我也不知道为什么
坑3:没有办法自己创建topic
这个topic我的不知道为什么就是不能自己创建,加了autoCreateTopicEnable=true也不行,非得手动创建,我去tm的小火箭
坑4:给我报错nullPointer,结果屁事儿没有
只要服务器的rocketmq运行起来了,本地项目端口号对上了,这报错就消失了。嗯。
坑5:关于防火墙,以下是可能会用到的命令
1.卸载firewalld
yum remove firewalld
2.安装iptables
yum install iptables-services
3.查看防火墙状态
service iptables status
4.停止防火墙
service iptables stop
5.启动防火墙
service iptables start
6.设为开机不启动
systemctl disable iptables.service
7.设为开机启动
systemctl enable iptables.service
8.如果要开启防火墙,则需要开放特定端口(以下内容未经过本人测试)
例:开放3306端口
编辑:vi /etc/sysconfig/iptables
添加配置
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
重启防火墙使配置生效
systemctl restart iptables.service
9.其它相关命令
查看防火墙规则
iptables -L
清空防火墙规则
iptables -F
保存使操作生效
/etc/sysconfig/iptables save
停止防火墙
/etc/sysconfig/iptables stop