阿里云服务器部署rocketMQ消息队列

 

一、下载安装

下载rocketMQ


本文以4.4.0 RELEASE(点击跳转下载)版本为例,下载rocketmq-all-4.4.0-bin-release.zip压缩包。

解压

将压缩包通过xshell工具上传到阿里云服务器

解压到/home/rocketmq目录下

启动服务

修改配置

因为我的服务器性能比较低,按照默认配置无法启动成功,所以需要先修改一下rocketmq的配置,需修改的配置文件如下:

# namesrv脚本配置
/home/rocketmq/rocketmq-all-4.4.0-bin-release/bin/runserver.sh
# broker脚本配置
/home/rocketmq/rocketmq-all-4.4.0-bin-release/bin/runbroker.sh
# 测试脚本配置,如果不需要执行测试脚本,则可以不用修改
/home/rocketmq/rocketmq-all-4.4.0-bin-release/bin/tools.sh

找到JAVA_OPT的位置,调整jvm运行配置Xms、Xmx、Xmn三个参数,根据服务器性能来调整,我的服务器是1核2g,调整后内容如下:

runserver.sh

runbroker.sh

tools.sh

启动namesrv

进到目录/home/rocketmq/rocketmq-all-4.4.0-bin-release下,执行下面脚本

# 启动命令
nohup sh bin/mqnamesrv &
#查看启动日志
tail -f ~/logs/rocketmqlogs/namesrv.log

namesrv.log中出现boot success,说明namesrv启动成功了

启动broker

按照官方默认的启动,启动后外网是无法访问的,如果需要外网访问rocketMQ,需要通过自定义配置来启动,在conf目录中新增文件,default-broker.properties

# 默认启动时ip是localhost,如果要支持外网访问,需改为阿里云的外网ip
namesrvAddr=阿里云实际IP地址:9876
messageIndexSafe=true
autoCreateTopicEnable=true
waitTimeMillsInSendQueue=5000
sendMessageThreadPoolNums=64
useReentrantLockWhenPutMessage=true
defaultReadQueueNums = 16
defaultWriteQueueNums = 16
# 需改为阿里云的外网ip
brokerIP1=阿里云实际IP地址
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
# 监听端口,默认用10911
listenPort=10911
# 存储路径
# storePathRootDir=/usr/local/rocketmq/store
# storePathCommitLog= /usr/local/rocketmq/store/commitlog
# storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
# storePathIndex=/usr/local/rocketmq/store/index

增加配置后,进到目录/home/rocketmq/rocketmq-all-4.4.0-bin-release下,执行启动脚本

# 启动脚本
nohup sh bin/mqbroker -c conf/default-broker.properties &
# 查看日志
tail -f ~/logs/rocketmqlogs/broker.log

broker.log日志中出现boot success,说明broker启动成功了

四、测试服务

测试脚本

官方提供了一个tools脚本,用于测试数据的发送和接收是否成功

发送测试

执行如下脚本

# 设置环境变量
export NAMESRV_ADDR=localhost:9876
# 发送消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

执行后出现如下数据,说明消息发送成功

接收测试

执行如下脚本

# 消费消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

执行后出现如下数据,说明消息消费成功

五、可视化界面

截止步骤四,rocketMQ搭建服务就完成了,为了方便查看MQ中的数据,可以搭建rocketMQ-console,就可以通过前端界面查看MQ中的数据了。

为了方便,这里通过docker进行搭建,没有安装docker的可以自行查找相关的安装命令,不安装可视化界面也不影响后续代码对接。

拉取镜像

docket pull styletang/rocketmq-console-ng

启动容器

# namesrv.addr中的IP,是服务器docker0网卡的地址,容器通过docker0网卡地址,访问服务器主机的rocketMQ服务
# 可通过命令“ip addr”查看名字为docker0的网卡地址
docker run -d -e "JAVA_OPTS=-Drocketmq.namesrv.addr=172.17.0.1:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8080:8080 -t styletang/rocketmq-console-ng

查看docker0的ip

验证

通过查看运行中的容器,可以看到,rocketmq-console-ng正在运行。

通过浏览器访问8080端口,如果正常显示数据,说明创建成功。

六、代码接入

通过springboot项目,和rocketmq进行简单整合

引入maven依赖

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.0.2</version>
</dependency>

 

添加配置信息

# application.yml
rocketmq:
  name-server: IP:9876  #IP为部署rocketmq的服务器地址
  producer:
    group: test-producer-group

 

消息发送

创建单元测试类RocketMQSendTest,注入RocketMQTemplate操作类。

发送同步消息

执行完成后,通过rocketMQ-console界面,可以查看到刚才发送的消息,说明消息发送成功。

发送异步消息

发送单向消息

消息消费

创建RocketMQConsumer测试类,实现 RocketMQListener接口,并监听“test-topic”主题,将该测试类加到spring容器中,项目启动后,就可以正常消费“test-topic”中的消息了。

七、异常排查

1、在服务器上执行发送测试时,出现"No name server address, please set it"

org.apache.rocketmq.client.exception.MQClientException: No name server address, please set it.
See http://rocketmq.apache.org/docs/faq/ for further details.
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:653)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1279)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1225)
    at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:283)
    at org.apache.rocketmq.example.quickstart.Producer.main(Producer.java:67)

解决:export配置的环境变量,只对当前登录生效,退出后就失效了,所以重新配置环境变量,再执行发送测试的脚本即可。

export NAMESRV_ADDR=localhost:9876

 

2、通过代码往mq发送消息时,出现“sendDefaultImpl call timeout”

org.springframework.messaging.MessagingException: sendDefaultImpl call timeout; nested exception is org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout
    at org.apache.rocketmq.spring.core.RocketMQTemplate.syncSend(RocketMQTemplate.java:154)
    at org.apache.rocketmq.spring.core.RocketMQTemplate.syncSend(RocketMQTemplate.java:123)
    at org.apache.rocketmq.spring.core.RocketMQTemplate.syncSend(RocketMQTemplate.java:179)
    at org.apache.rocketmq.spring.core.RocketMQTemplate.syncSend(RocketMQTemplate.java:166)
    at com.kea.springbootdemo.test.RocketMQSendTest.testSyncSend(RocketMQSendTest.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:73)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:634)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1279)
    at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:301)
    at org.apache.rocketmq.spring.core.RocketMQTemplate.syncSend(RocketMQTemplate.java:148)
    ... 35 more

 

解决:检查一下阿里云的安全组配置是否开放了rocketMQ需要访问的3个端口:9876,10909,10911

八、参考文档

1、http://rocketmq.apache.org/docs/quick-start/

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值