RocketMQ第一话 -- Docker安装以及Springboot集成RocketMQ

243 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1.RocketMQ介绍

RocketMQ是一个分布式队列模型的消息中间件,现支持事务消息、顺序消息、批量消息。定时消息

RocketMQ由mqnamesrv和mqbroker组成,内部由group、topic、queue共同工作。

系统架构:

  • producer生产者
  • Consume消费者
  • Broker 中转服务者
  • Namesrv 消息服务
  • Group 消息分组
  • Topic 消息主题
  • Tag 消息标签,同一个主题下面区分不同类型的消息
  • Queue 消息队列

全局顺序:一个Topic内所有的消息都发布到到同一个Queue按先进先出的顺序进行消费

2.RocketMQ安装

基于liunx centos7,docker-compose,apache/rocketmq:4.9.3

2.1 首先准备broker.conf配置

brokerClusterName=DefaultCluster
#容器化部署 这里需要填写 宿主机IP
brokerIP1=192.168.0.221 
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true

2.2 yaml文件

version: '3.7'
services:
  rocket-namesrv:
    image: apache/rocketmq:4.9.3
    container_name: rocket-namesrv
    ports:
    - "9876:9876"
    volumes:
    - /root/local/rocketmq/logs:/root/logs
    networks:
    - my-net
    command: sh mqnamesrv
  rocket-broker:
    image: apache/rocketmq:4.9.3
    container_name: rocket-broker
    ports:
      - 10909:10909
      - 10911:10911
      - 10912:10912
    volumes:
    - /root/local/rocketmq/broker.conf:/home/rocketmq/rocketmq-4.9.3/conf/broker.conf
    networks:
    - my-net
    command: sh mqbroker -n rocket-namesrv:9876 -c /home/rocketmq/rocketmq-4.9.3/conf/broker.conf
    depends_on:
      - rocket-namesrv
  #web控制台 
  rocket-console:
    image: styletang/rocketmq-console-ng
    container_name: rocket-console
    ports:
    - "8100:8080"
    environment:
      JAVA_OPTS: -Drocketmq.config.namesrvAddr=rocket-namesrv:9876 -Drocketmq.config.isVIPChannel=false
    networks:
    - my-net
  depends_on:
      - rocket-namesrv  
networks:
  my-net:
    external: true

2.3 启动容器

[root@m ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                                                                      NAMES
4e076d69b867        styletang/rocketmq-console-ng   "sh -c 'java $JAVA_O…"   2 hours ago         Up 2 hours          0.0.0.0:8100->8080/tcp                                                     rocket-console
2bf702304170        apache/rocketmq:4.9.3           "sh mqbroker -n rock…"   2 hours ago         Up 2 hours          0.0.0.0:10909->10909/tcp, 9876/tcp, 0.0.0.0:10911-10912->10911-10912/tcp   rocket-broker
2e9fa82ef3b2        apache/rocketmq:4.9.3           "sh mqnamesrv"           2 hours ago         Up 2 hours          10909/tcp, 0.0.0.0:9876->9876/tcp, 10911-10912/tcp                         rocket-namesrv

都为up状态即表示启动成功,访问一下web控制台:192.168.0.221:8100

2.4 控制台界面

已经测试发送过消息了,页面图可能不同 在这里插入图片描述

3.Springboot集成RocketMQ

基于springboot 2.6.8

3.1 rocketmq依赖如下

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

3.2 yaml配置文件

rocketmq:
  name-server: 192.168.0.221:9876
  producer:
    group: test_group
    #默认3000 过短会报timeout错误
    send-message-timeout: 10000

3.3 生产者代码

@Autowired
RocketMQTemplate rocketMQTemplate;

@GetMapping("/send")
public String send() {
    JSONObject object = new JSONObject();
    object.put("hello", "123456789");
    try {
        //send
       SendResult sendResult = rocketMQTemplate.syncSend("test_topic", object.toJSONString()); 
         log.info("消息推送成功,{},{}", sendResult, new Date().getTime());
    } catch (Exception e) {
        log.info("消息发送异常" + e);
    }
    return "success";
}

3.4 消费者代码

@Slf4j
@Component
@RocketMQMessageListener(topic = "test_topic", consumerGroup = "test_group")
public class RocketmqConsume implements RocketMQListener<String> {

    @Override
    public void onMessage(String s) {
        log.info("收到消息:{},{}", s,new Date().getTime());
        //默认自动确认 如报异常则会丢回队列 重新消费
//        throw new RuntimeException("1234");
    }
}

3.5 测试日志

c.e.r.controller.RocketmqController: 消息推送成功,SendResult [sendStatus=SEND_OK, msgId=7F0000010D5018B4AAC278D1ECC40000, offsetMsgId=C0A800DD00002A9F0000000000001AF4, messageQueue=MessageQueue [topic=test_topic, brokerName=broker-a, queueId=1], queueOffset=3],1656039823574
c.e.rocketmq.consume.RocketmqConsume: 收到消息:{"hello":"123456789"},1656039823587

4.总结

记录一下报错的点: 1.启动broker时需要指向namesrv服务的地址加端口 2.配置中一定要填的宿主机ip地址,不是容器名称 3.出现broker连接不上一般都是namesrv地址不对

以上就是本章的全部内容了。

上一篇:RabbitMQ第三话 -- RabbitMQ高可用集群搭建 下一篇:RocketMQ第二话 -- RocketMQ事务消息、延时消息实现

旧书不厌百回读,熟读精思子自知