RocketMQ 详细教程(Spring Boot & Spring Cloud Alibaba)

1. RocketMQ 简介

RocketMQ 是阿里巴巴开源的一款分布式消息队列,具有高吞吐量、低延迟、可靠性等特点,广泛应用于金融、电商、物联网等领域。

  • RocketMQ 的核心特性:
    • 高可靠性:支持消息存储、重复消费、失败重试等
    • 高可用性:分布式架构,支持主从复制
    • 高性能:高吞吐量、低延迟

2. 引入依赖

首先,在 Spring Boot 项目 中引入 RocketMQ 和 Spring Cloud Alibaba 的依赖。

2.1 配置依赖

pom.xml 中添加以下依赖:

java 复制代码
<dependencies>
    <!-- Spring Boot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    
    <!-- Spring Cloud Alibaba RocketMQ -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-rocketmq</artifactId>
    </dependency>

    <!-- Spring Cloud Alibaba -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba</artifactId>
    </dependency>
</dependencies>

2.2 配置 RocketMQ

application.yml 中配置 RocketMQ 连接信息:

java 复制代码
spring:
  cloud:
    alibaba:
      rocketmq:
        name-server: 127.0.0.1:9876  # RocketMQ NameServer 地址
        producer:
          group: my-producer-group   # 生产者组
        consumer:
          group: my-consumer-group   # 消费者组

3. 生产者代码实现

3.1 创建消息生产者

我们可以通过注解 @RocketMQMessageListener 来创建 RocketMQ 生产者,消息可以通过 @Value 传递或直接通过 Bean 注入。

java 复制代码
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class RocketMQProducer {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    // 发送普通消息
    public void sendMessage(String topic, String message) {
        rocketMQTemplate.convertAndSend(topic, message);
    }
}

3.2 发送消息

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProducerController {

    @Autowired
    private RocketMQProducer rocketMQProducer;

    @GetMapping("/send")
    public String sendMessage() {
        String message = "Hello, RocketMQ!";
        rocketMQProducer.sendMessage("my-topic", message);
        return "Message sent: " + message;
    }
}

访问 http://localhost:8080/send 发送消息,RocketMQ 将开始处理消息。


4. 消费者代码实现

4.1 创建消息消费者

在消费者端,我们需要创建一个消息监听器,利用 @RocketMQMessageListener 注解监听 RocketMQ 消息。

java 复制代码
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.stereotype.Service;

@Service
@RocketMQMessageListener(topic = "my-topic", consumerGroup = "my-consumer-group")
public class RocketMQConsumer {

    @org.springframework.messaging.handler.annotation.MessageMapping
    public void listen(String message) {
        System.out.println("Received message: " + message);
    }
}

4.2 消费消息

每次生产者发送的消息,消费者都会通过 listen 方法进行接收。控制台会打印出收到的消息。


5. 顺序消息

RocketMQ 支持顺序消息,可以通过设置 MessageQueueSelector 来保证消息的顺序性。

5.1 发送顺序消息

java 复制代码
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.apache.rocketmq.spring.support.RocketMQMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderProducer {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    // 发送顺序消息
    public void sendOrderedMessage(String topic, String message, int orderId) {
        rocketMQTemplate.convertAndSend(topic, message, new MessageQueueSelector() {
            @Override
            public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
                // 根据orderId选择队列
                return mqs.get(orderId % mqs.size());
            }
        }, orderId);
    }
}

5.2 接收顺序消息

顺序消息的消费逻辑和普通消息相似,只不过要保证顺序消息的消费顺序。


6. 事务消息

RocketMQ 提供了事务消息功能,能够保证消息在分布式事务中的可靠性。我们通过 @RocketMQTransactionListener 来实现。

6.1 配置事务消息

java 复制代码
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransaction;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@RocketMQTransactionListener
public class TransactionProducer {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    public void sendTransactionMessage(String topic, String message) {
        rocketMQTemplate.sendMessageInTransaction(topic, message, null);
    }

    public RocketMQLocalTransaction executeLocalTransaction(String message, Object arg) {
        // 事务操作
        try {
            // 业务操作
            return RocketMQLocalTransaction.SUCCESS;
        } catch (Exception e) {
            return RocketMQLocalTransaction.ROLLBACK;
        }
    }
}

6.2 事务回查

RocketMQ 支持事务回查机制,如果事务消息发送后没有明确的提交或回滚,RocketMQ 会通过回查接口查询事务状态。


7. Spring Cloud Alibaba 集成

7.1 配置 Spring Cloud RocketMQ

application.yml 配置 Spring Cloud Alibaba 与 RocketMQ 集成。

java 复制代码
spring:
  cloud:
    alibaba:
      rocketmq:
        name-server: 127.0.0.1:9876
        producer:
          group: my-producer-group
        consumer:
          group: my-consumer-group

7.2 集成 OpenFeign 与 RocketMQ

通过 OpenFeign 实现远程服务调用,可以和 RocketMQ 一起工作。例如,将 RocketMQ 生产者集成到一个微服务中,使用 OpenFeign 调用。

java 复制代码
@FeignClient("rocketmq-producer-service")
public interface RocketMQFeignClient {

    @PostMapping("/send")
    void sendMessage(@RequestBody String message);
}

通过 Feign 客户端发送请求并触发 RocketMQ 生产者的消息发送。


8. 总结

功能总结

功能 说明
消息生产 使用 RocketMQTemplate 发送消息
消息消费 使用 @RocketMQMessageListener 监听消息
顺序消息 使用 MessageQueueSelector 保证消息顺序
事务消息 使用 RocketMQTransactionListener 保证事务一致性
集成 Spring Cloud 结合 Spring Cloud Alibaba RocketMQ 进行分布式消息通信

集成 RocketMQ 的好处

  • 提高系统解耦,避免直接调用远程服务。
  • 支持异步、可靠的消息传递。
  • 通过顺序消息保证业务流程的顺序性。
  • 事务消息保证分布式事务的一致性。

这篇教程将帮助你实现 Spring Boot 和 Spring Cloud Alibaba 集成 RocketMQ 的基本功能,之后可以根据业务需求进行扩展。如果这篇教程对你有帮助,记得点赞、收藏哦! 🚀

相关推荐
bing_1584 分钟前
在 Spring Boot 项目中怎么识别和优化慢 SQL ?
spring boot·优化慢sql·识别慢sql
csdn_HPL25 分钟前
SpringBoot + Vue 实现云端图片上传与回显(基于OSS等云存储)
vue.js·spring boot·后端
RainbowSea35 分钟前
通用型产品发布解决方案(基于分布式微服务技术栈:SpringBoot+SpringCloud+Spring CloudAlibaba+Vue+ElementUI
java·spring boot·后端
苹果酱05671 小时前
Vue3 源码解析(六):响应式原理与 reactive
java·vue.js·spring boot·mysql·课程设计
栗筝i2 小时前
Spring Boot 核心模块全解析:12 个模块详解及作用说明
java·spring boot·后端
MacroZheng3 小时前
斩获10k star!这款开源的项目管理工具,能让你的开发效率翻倍!
java·spring boot·后端
Code哈哈笑3 小时前
【Spring Boot基础】MyBatis的基础操作:日志、增删查改、列名和属性名匹配 -- 注解实现
java·spring boot·后端·spring·mybatis
MiniFlyZt3 小时前
分布式数据库TiDB:架构、核心特性与生产实践(分库分表)
java·数据库·分布式·spring cloud·微服务·tidb
虎头金猫4 小时前
北理工宫某的瓜ppt下载地址
运维·微服务·云原生·容器·服务发现
风象南4 小时前
SpringBoot中5种动态代理实现
spring boot·后端