Spring Boot 集成RocketMq

356 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

简介

RocketMQ 是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式的特点。它是一个采用 Java 语言开发的分布式的消息系统,由阿里巴巴团队开发。

特性

  • 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型
  • 支持顺序消息:消息在Broker中是采用队列的FIFO模式存储的,也就是发送是顺序的,只要保证消费的顺序性即可。
  • 支持定时消息和延迟消息:Broker中由定时消息的机制,消息发送到Broker中,不会立即被Consumer消费,会等到一定的时间才被消费。延迟消息也是一样,延迟一定时间之后才会被Consumer消费。
  • 亿级消息的堆积能力,单个队列中的百万级消息的累积容量。
  • 支持分布式事务消息:这里是采用半消息确认和消息回查机制来保证分布式事务消息的,下面会详细描述。
  • 分布式高可用的部署架构,Broker服务器支持多Master多Slave的同步双写以及Master多Slave的异步复制模式,其中同步双写可保证消息不丢失。

基本架构

图片.png

如图所示,RocketMQ包含四个核心组成

  • NameServer :基于高可用设计产生的,用于服务发现和路由。正式应用时通常采用集群部署。
  • Broker:实现队列机制,负责消息存储和转发。正式应用时也采用集群部署。
  • Producer:消息生产者,生成消息并发送到RocketMQ中,生产者通常是我们自己实现的应用程序。
  • Consumer:消息消费者,从RocketMQ中接收消息并进行业务处理。这部分也通常是我们自己实现的。

安装RocketMQ

下载RocketMQ

下载地址:www.apache.org/dyn/closer.…

图片.png

解压RocketMQ

 cd /usr/local
 tag -zxvf rocketmq-all-4.9.2-bin-release.zip
  mv rocketmq-all-4.9.2-bin-release rocketmq

修改启动参数

分别修改runserver.sh和runbroker.sh参数,将启动的内存调整为2G

图片.png

启动NameServer

 cd /usr/local/rocketmq/bin
 sh runserver.sh &

启动BrokerServer

 cd /usr/local/rocketmq/bin
 sh runbroker.sh &

测试

分别启动生产者和消费者,发送测试消息,如果能收到消息则表示rocket启动成功

图片.png

集成步骤

pom.xml添加相关依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
				
  <dependency>
        <groupId>org.apache.rocketmq</groupId>
         <artifactId>rocketmq-spring-boot-starter</artifactId>
         <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-common</artifactId>
            <version>4.8.0</version>
        </dependency>
        
         <dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>${fastjson.version}</version>
    </dependency>

MQ生产者配置

rocketmq:
  name-server: 127.0.0.1:9876
  # 生产者配置 
  producer:
    isOnOff: on
    # 发送同一类消息的设置为同一个group,保证唯一
    group: test-rocketmq-group
    groupName: test-rocketmq-group
    # 服务地址
    namesrvAddr: 127.0.0.1:9876
    # 消息最大长度 默认1024*4(4M)
    maxMessageSize: 2098
    # 发送消息超时时间,默认3000
    sendMsgTimeout: 3000
    # 发送消息失败重试次数,默认2
    retryTimesWhenSendFailed: 3

编写消息生产者

@Component
public class MqProduce
{
    private Logger logger = LoggerFactory.getLogger(getClass());
    
   @Autowired
   private RocketMQTemplate rocketMQTemplate;
   
   /**
    * 发送异步消息
    * @param topic
    * @param msg
    */
   public void sendAsyncMessage(String topic,Object msg)
   {
     rocketMQTemplate.asyncSend("testtopic", MessageBuilder.withPayload(msg).build(),new SendCallback()
    {
        @Override
        public void onSuccess(SendResult result)
        {
            logger.info("发送消息成功");
        }
        
        @Override
        public void onException(Throwable e)
        {
            logger.error("发送消息失败",e);
        }
    });
   }
   
   /**
    * 发送同步消息
    * @param topic
    * @param msg
    */
   public void sendMessage(String topic,Object msg)
   {
     rocketMQTemplate.convertAndSend(topic, msg);
   }
}

消息消费者

@Component
@RocketMQMessageListener(consumerGroup="test-rocketmq-group",topic="testtopic")
public class MqConsumer implements RocketMQListener<Object>
{
    private Logger logger =LoggerFactory.getLogger(getClass());
    public void onMessage(Object o)
    {
        String msg=JSON.toJSONString(o);
        logger.info("send msg content:{}", msg);
    }
}

说明:Spring Boot已经提供了丰富的Api接口 consumerGroup:客户组需要与生产者配置的一致 topic: 消息的主题

示例代码

@RestController
public class MqController
{
    @Autowired
    private MqProduce mqProduce;
    
    private String topic="testtopic";
    
     @RequestMapping("/sendMsg")
     public String sendMsg()
     {
         User user =new User();
         user.setUserName("jswh");
         user.setUserId("jswh");
         mqProduce.sendAsyncMessage(topic, user);
         return "success";
     }
}

测试

启动应用程序,访问http://localhost:9090/sendMsg 结果如下:

图片.png

总结

本文讲解Spring Boot集成RocketMQ发送基本的消息,关于RocketMQ的高可用事务消息、顺序消息等高级特性功能将在后续的文章中进行讲解,如有相关问题,请随时反馈。