一、RocketMQ部署
1.下载RocketMQ
地址:https://rocketmq.apache.org/release-notes/2023/03/26/4.9.5
注意:下载版本要和springcloudalibaba版本一致
版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub
2.将压缩文件通过Xftp7上传到linux上面
3.在linux中解压文件
[root@localhost RockedMQ]# unzip rocketmq-all-4.9.5-bin-release.zip
4.修改配置文件
修改一:
[root@localhost bin]# vim runserver.sh
改成:(if else里面都需要改)
# JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
修改二:
[root@localhost bin]# vim runbroker.sh
改成:
# JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
修改三:
[root@localhost bin]# vim tools.sh
改成:
# JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"
开启自动创建Topic功能
[root@localhost conf]# vim broker.conf
末尾添加:autoCreateTopicEnable=true
5、启动RocketMQ
5.1 启动NameServer
## 创建日志目录
cd bin
mkdir logs
## 启动NameServer
[root@localhost bin]# nohup ./mqnamesrv > logs/mqnamesrv.out 2>1 &
## 查看日志
[root@localhost bin]# tail -f logs/mqnamesrv.out
## 看到以下表示启动成功
The Name Server boot success. serializeType=JSON
5.2 启动Broker
## 启动命令,并且常驻内存:注意ip地址要配置成为服务的ip地址,保证地址以及端口能够访问
## nohup ./mqbroker -n 192.168.169.128:9876 & :属于后台以静默⽅式启动
## sh ./mqbroker -n 192.168.169.128:9876 :属于终端启动,直接输出日志信息,按 ctrl+c 可直接关闭退出
[root@localhost bin]# nohup ./mqbroker -n 192.168.169.128:9876 > logs/mqbroker.out 2>1 &
## 查看启动状态
[root@localhost bin]# tail -f logs/mqbroker.out
## 看到以下表示启动成功
The broker[linux1, 192.168.169.128:10911] boot success. serializeType=JSON and name server is 192.168.169.128:9876
## 如果查看启动状态一直没反应
cd /root/store
rm -rf *
再重新启动borker
6、测试RocketMQ
6.1 测试消息发送
[root@localhost bin]# export NAMESRV_ADDR=localhost:9876
[root@localhost bin]# cd ../
[root@localhost rocketmq-all-4.9.5-bin-release]# sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
[2.007s][warning][gc,ergo] NewSize was set larger than initial heap size, will use initial heap size.
[2.007s][warning][gc,ergo] MaxNewSize (262144k) is equal to or greater than the entire heap (262144k). A new max generation size of 262080k will be used.
SendResult [sendStatus=SEND_OK, msgId=7F0000011705277050DC98CE3C990000, offsetMsgId=C0A8A98000002A9F0000000000000940, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=0], queueOffset=0]
SendResult [sendStatus=SEND_OK, msgId=7F0000011705277050DC98CE3D0A0001, offsetMsgId=C0A8A98000002A9F00000000000009FE, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=1], queueOffset=0]
………………
SendResult [sendStatus=SEND_OK, msgId=7F0000011705277050DC98CE4E5703E7, offsetMsgId=C0A8A98000002A9F000000000002F612, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=3], queueOffset=249]
16:07:37.541 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[127.0.0.1:9876] result: true
16:07:37.549 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[192.168.169.128:10911] result: true
6.2 测试消息接受
[root@localhost bin]# sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
OpenJDK 64-Bit Server VM warning: MaxNewSize (262144k) is equal to or greater than the entire heap (262144k). A new max generation size of 261632k will be used.
16:21:15.395 [main] DEBUG i.n.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework
Consumer Started.
ConsumeMessageThread_3 Receive New Messages: [MessageExt [brokerName=linux1, queueId=2, storeSize=201, queueOffset=1, sysFlag=0, bornTimestamp=1659601146477, bornHost=/192.168.0.101:48216, storeTimestamp=1659601146478, storeHost=/172.17.0.1:10911, msgId=AC11000100002A9F000000000000057F, commitLogOffset=1407, bodyCRC=988340972, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=250, CONSUME_START_TIME=1659601275866, UNIQ_KEY=AC11000176396FF3C5B512F37A6D0007, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 55], transactionId='null'}]]
ConsumeMessageThread_4 Receive New Messages: [MessageExt [brokerName=linux1, queueId=2, storeSize=202, queueOffset=2, sysFlag=0, bornTimestamp=1659601146500, bornHost=/192.168.0.101:48216, storeTimestamp=1659601146501, storeHost=/172.17.0.1:10911, msgId=AC11000100002A9F00000000000008A4, commitLogOffset=2212, bodyCRC=2088767104, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=250, CONSUME_START_TIME=1659601275867, UNIQ_KEY=AC11000176396FF3C5B512F37A84000B, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 49, 49], transactionId='null'}]]
二、springboot集成rocketmq
1、订单微服务 发送消息
1.1 pom.xml文件添加依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
1.2 application.yml配置文件
rocketmq:
name-server: 192.168.169.128:9876
producer:
group: order-group # 消息分组
1.3 发送消息服务
@RestController
@RequestMapping("/mq")
public class RocketMQController {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@GetMapping("/send")
public void send(){
rocketMQTemplate.convertAndSend("order-topic", "hello world from repository!!");
}
}
2、用户微服务 订阅消息
2.1 pom.xml文件添加依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
2.2 bootstrap.yml配置文件
rocketmq:
name-server: 192.168.169.128:9876
2.3 订阅消息服务
@Service
@RocketMQMessageListener(consumerGroup = "order-group", topic = "order-topic")
public class SmsService implements RocketMQListener<String> {
private Logger logger = LoggerFactory.getLogger("user-server");
@Override
public void onMessage(String s) {
logger.info("收到一个订单信息{},接下来发送短信"+s);
}
}