由于公司项目要从阿里云上迁到腾讯云,原ons等服务均不再使用,故选择将RocketMQ部署服务器来替代ons.在此记录部署过程.
Apache RocketMQ官网: http://rocketmq.apache.org/docs/quick-start/
预先装好jdk1.8以上,并配置好环境变量.
开始正式下载安装:
mkdir rocketMQ
cd rocketMQ
wget http://mirrors.hust.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip
unzip rocketmq-all-4.2.0-bin-release.zip
因为下载下来的RocketMQ默认在线上环境使用,所以配置要求很高,测试环境中应该先修改jvm相关配置:
cd bin/
vim runbroker.sh
vim runserver.sh
vim tools.sh
将其中的
JAVA_OPT="${JAVA_OPT} -server –Xms*g –Xmx*g–Xmn*g -XX:PermSize=*g -XX:MaxPermSize=*g"
所需内存修改为合适大小
RocketMQ可以集群主从部署Name Server,这里先示例单机部署
nohup sh mqnamesrv &
查看启动日志:
tail -f ~/logs/rocketmqlogs/namesrv.log
tail –f nohup.out
查看是否启动:
jps
RocketMQ可以集群主从部署broker,这里先示例单机部署
nohup sh mqbroker &
查看启动日志:
tail -f ~/logs/rocketmqlogs/broker.log
tail –f nohup.out
1) 导出默认配置文件:
sh mqbroker -m >broker.p
注意,有的版本导出的文件内容每一行前面会有logger时间及class名等信息,需要去除.
2) 修改配置文件
因为我是将RocketMQ部署在腾讯云服务器上,而测试是在本机进行,所以连接地址要改为腾讯云的公网ip.正式线上可以不开放公网.
另外,测试中可以自动创建topic及订阅组,线上环境建议关闭.
broker.p :
namesrvAddr=140.143.168.123:9876
brokerIP1=140.143.168.123
brokerName= brokerName1
brokerClusterName=DefaultCluster
brokerId=0
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
rejectTransactionMessage=false
fetchNamesrvAddrByAddressServer=false
storePathRootDir=/root/store
storePathCommitLog=/root/store/commitlog
flushIntervalCommitLog=500
commitIntervalCommitLog=200
flushCommitLogTimed=false
deleteWhen=04
fileReservedTime=72
maxTransferBytesOnMessageInMemory=262144
maxTransferCountOnMessageInMemory=32
maxTransferBytesOnMessageInDisk=65536
maxTransferCountOnMessageInDisk=8
accessMessageInMemoryMaxRatio=40
messageIndexEnable=true
messageIndexSafe=false
haMasterAddress=
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
cleanFileForciblyEnable=true
transientStorePoolEnable=false
3)使用修改后的配置文件启动broker
nohup sh mqbroker -c broker.p &
./mqshutdown broker
./mqshutdown namesrv
mqadmin是RocketMQ的管理控制台,可以查看各种运行信息,增减topic等操作
使用前要先配NAMESRV_ADDR环境变量
export NAMESRV_ADDR="localhost:9876"
mqadmin使用方法:
./mqadmin
可以使用 ./mqadmin 查看帮助说明.
举个例子,查看当前所有topic:
./mqadmin topicList
mqadmin使用比较麻烦,后面会讲一个可视化的控制台.
在项目中使用消费者生产者收发,首先导入依赖包
com.alibaba.rocketmq
rocketmq-client
3.2.6
具体代码官网上讲解的非常清楚了,这里直接上例子,具体看注释.
消费者:
publicclass MQConsumerTest {
publicstatic Logger logger = LoggerFactory.getLogger(MQConsumerTest.class);
static String consumerId = "CID_DEVCENT_LXY";
static String topic = "topic-a";
static String tag = "tag-a";
static String namesrvAddr = "140.143.168.123:9876";
publicstaticvoid main(String[] args) throws MQClientException {
// 定义消息消费者
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerId);
// 定义nameServer地址
consumer.setNamesrvAddr(namesrvAddr);
// 订阅主题及tag
consumer.subscribe(topic, tag);
// 注册一个监听器
consumer.registerMessageListener(new MessageListenerOrderly() {// 有序信息
/**
* 接受到消息时回调方法
*/
@Override
public ConsumeOrderlyStatusconsumeMessage(List msgs, ConsumeOrderlyContext context) {
logger.info(Thread.currentThread().getName()+ "Receive New Messages: " + msgs);
// 返回消费状态
// CONSUME_SUCCESS 消费成功
// RECONSUME_LATER 消费失败,需要稍后重新消费
return ConsumeOrderlyStatus.SUCCESS;
}
});
// 启动consumer
consumer.start();
logger.info("Consumer Started");
}
}
生产者:
publicclass MQProducerTest {
publicstatic Logger logger = LoggerFactory.getLogger(MQProducerTest.class);
privatestatic String producerId = "PID_devCenterTest";
privatestatic String topic = "topic-a";
privatestatic String tag = " tag-a";
privatestatic String namesrvAddr = "140.143.168.123:9876";
publicstaticvoid main(String[] args) throws MQClientException {
// 定义消息生产者
DefaultMQProducer producer = new DefaultMQProducer(producerId);
// 定义nameServer地址
producer.setNamesrvAddr(namesrvAddr);
// 发送超时时间
producer.setSendMsgTimeout(3000);
// 在发送消息前,必须调用 start 方法来启动 Producer,只需调用一次即可
producer.start();
// 循环发送消息
for (inti = 0; i < 10; i++) {
String msgText = "Hello MQ " + i;
Message msg = new Message(
// Message 所属的 Topic
topic,
// Message Tag 可理解为 Gmail 中的标签,对消息进行再归类,方便 Consumer 指定过滤条件在 MQ 服务器过滤
tag,
// Message Body 可以是任何二进制形式的数据, MQ 不做任何干预,
// 需要 Producer 与 Consumer 协商好一致的序列化和反序列化方式
msgText.getBytes());
try {
SendResult sendResult = producer.send(msg);
// 同步发送消息,只要不抛异常就是成功
if (sendResult != null) {
logger.info(new Date() + " Send mq message success. Topicis:" + msg.getTopic() + " msgId is: "
+ sendResult.getMsgId());
}
} catch (Exception e) {
// 消息发送失败,需要进行重试处理,可重新发送这条消息或持久化这条数据进行补偿处理
logger.error(new Date() + " Send mq message failed. Topicis:" + msg.getTopic());
e.printStackTrace();
}
}
// 在应用退出前,销毁 Producer 对象
// 注意:如果不销毁也没有问题
producer.shutdown();
}
}
先启动消费者
再启动生产者
bingo!
apache有一个对RocketMQ 的扩展项目 RocketMQ Externals ,里面有个可视化控制台子项目,可以方便地管理RocketMQ.
github地址:
https://github.com/apache/rocketmq-externals
进入到rocketmq-console文件夹,执行命令
mvn package
该项目使用springboot写的,打包后在target下生成rocketmq-console-ng-1.0.0.jar文件.
将jar文件拷贝到服务器,执行java命令
nohup java -jar rocketmq-console-ng-1.0.0.jar -Xms128m --server.port=12580 --rocketmq.config.namesrvAddr=203.195.209.94:9876\;203.195.209.95 &
server.port是运行访问这个项目的端口
namesrvAddr写上你的Rocker命名服务地址
打开浏览器,输入地址,进入控制台界面:
http://localhost:12580
可以选择中文和英文两种语言.