(七)Spring Cloud Alibaba 2023.x:RocketMQ 消息队列配置与实现

目录

前言

准备

安装RocketMq服务

下载rocketmq服务

[下载rocketmq 控制台](#下载rocketmq 控制台)

项目集成

引入依赖

生产者服务配置

消费者服务配置

发送队列消息


前言

在微服务架构中,异步消息通信是实现系统解耦、提高性能和增强系统可靠性的重要手段。在 Spring Cloud Alibaba 生态中,RocketMQ 与 Spring Boot 深度集成,提供了开箱即用的消息通信解决方案,极大地简化了开发流程,提升了系统的扩展性和可维护性 。

准备

  • jdk17+
  • maven3.9.4+
  • idea2023
  • spring cloud: 2023.0.1.0
  • spring cloud alibaba: 2023.0.1

源码获取:GitHub - RemainderTime/spring-cloud-alibaba-base-demo: 基于spring cloud alibaba生态快速构建微服务脚手架

安装RocketMq服务

本地window系统安装rocketmq服务

下载rocketmq服务

当前博文版本使用的是:5.2

官方下载地址:下载 | RocketMQ

百度网盘地址:百度网盘 请输入提取码 提取码: 92h6

下载完成解压

在window系统中本地启动rocketmq服务需要配置环境变量,步骤和配置与jdk配置相似

Path变量中添加环境变量

配置完成后进入本地rocketmq的bin文件夹中

首先双击mqnamesrv.cmd启动NameServer服务: 它的作用是提供服务发现、路由信息管理、Broker注册和客户端查询等功能

NameServer服务启动成功后,启动Broker服务:它的作用是消息的存储和传递

当前文件夹cmd执行命令: mqbroker -n localhost:9876

下载rocketmq 控制台

当前博文版本使用的是:2.0.1

官方下载地址:Releases · apache/rocketmq-dashboard

百度网盘地址:百度网盘 请输入提取码 提取码: 92h6

下载完成解压

需要我们自行对项目打包获取jar包

在当前文件夹中cmd执行命令打包:

bash 复制代码
mvn clean package -Dmaven.test.skip=true

在target文件中找到生成的jar

执行命令启动

java -jar rocketmq-dashboard-2.0.1.jar

浏览器访问地址:http://localhost:8080

注:如果rocketmq的服务地址或者端口进行过调整,那么在打包前自行到项目的application.yml配置文件中更改后再打包

项目集成

根据前面的博文,目前我们已经创建了三个微服务

引入依赖

分别在子模块生产者和消费者服务的pom.xml文件中引入依赖

XML 复制代码
<!-- 引入消息队列 stream rocketmq -->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>

生产者服务配置

yml文件配置

bash 复制代码
spring:
  application:
    name: http-cloud-producer
  cloud:
    stream: #消息中间件
      rocketmq:
        binder:
          name-server: localhost:9876
        bindings:
          producer-out-0:
            producer:
              group: output_1
      bindings:
        producer-out-0:
          destination: topic0
        producer-out-1:
          destination: topic1

相关参数/值解释:

output_1 :自定义的消费者组名称

producer-out-0 :自定义的生产者通道名称

topic0 :自定义队列名称

生成者发送消息服务类实现

java 复制代码
@Service
public class MessageProducer {

    // 自动注入配置文件中绑定的通道
    @Autowired
    private StreamBridge streamBridge;

    // 消息通道
    public void sendMessageToOutput0(String messageContent) {
        Map<String, Object> headers = new HashMap<>();
        headers.put(MessageConst.PROPERTY_TAGS, "tag0");
        Message<String> msg = new GenericMessage<>(messageContent, headers);
        streamBridge.send("producer-out-0", msg);
    }

    public void sendMessageToOutput1(String messageContent) {
        Map<String, Object> headers = new HashMap<>();
        headers.put(MessageConst.PROPERTY_TAGS, "tag1");
        Message<String> msg = new GenericMessage<>(messageContent, headers);
        streamBridge.send("producer-out-1", msg);
    }
}

定义控制层接口

java 复制代码
@RestController
public class DemoController {

    @Autowired
    private MessageProducer messageProducer;

    /**
     * 发送消息队列 topic0
     * @param message
     * @return
     */
    @GetMapping(value = "/test/mq/topic0")
    String sendMqTopic0(@RequestParam("message") String message) {
        messageProducer.sendMessageToOutput0(message);
        return "topic0消息发送成功了~~~";
    }

    /**
     * 发送消息队列 topic1
     * @param message
     * @return
     */
    @GetMapping(value = "/test/mq/topic1")
    String sendMqTopic1(@RequestParam("message") String message) {
        messageProducer.sendMessageToOutput1(message);
        return "topic1消息发送成功了~~~";
    }
}

消费者服务配置

配置yml文件

bash 复制代码
spring:
  application:
    name: http-cloud-consumer
  cloud:
    stream: #消息中间件
      rocketmq:
        binder:
          name-server: localhost:9876
        bindings:
          consumer0-in-0:
            consumer:
              messageModel: CLUSTERING
          consumer1-in-0:
            consumer:
              messageModel: CLUSTERING
      bindings:
        consumer0-in-0:
          destination: topic0
          group: clustering-consumer
        consumer1-in-0:
          destination: topic1
          group: clustering-consumer

相关配置解释:

consumer0-in-0:自定义的消费者通道名称

messageModel:消费者消费模式(集群或者是广播)。本文配置的是集群模式。

topic0 :需要监听的消费者队列名称

clustering-consumer :自定义的消费者组名称

实现消费者mq消费类

java 复制代码
@Component
public class MessageConsumer {

    /**
     *  通过方法名称自动绑定到符合条件的消费者通道
     *  (注:当前遇到的难点是一个消费者服务只能实现一个消费方法,实现多个消费方法会使消费功能失效)
     * @return
     */
    @Bean
    public Consumer<Message<String>> consumer1() {
        return msg -> {
            System.out.println(Thread.currentThread().getName() + " Consumer1 Receive New Messages: " + msg);
        };
    }
}

注:从配置可以看到,消费者监听了2个队列,但上面的MessageConsumer 类只有一个消费方法,目前版本mq会自动将配置在第一个的队列和上面的方法绑定,但是如果需要监听对多队列并进行消费,目前版本博主还未找到实现方案,后续有方案再补上。

发送队列消息

请求接口给队列topic0发送消息

查看消费者服务控制台打印成功

查看rocketMq控制台消息记录


至此Spring Cloud Alibaba集成RocketMq消息队列完成了。

相关推荐
掘金者阿豪29 分钟前
SQL Server数据迁移完成后,凌晨的数据库告警该怎么查?
前端·后端
鶴哥只手遮天40 分钟前
AFSIM 2.9.0 深度解析·进阶卷第 1 章 插件源码精读:16 个 WSF 插件的架构与实现
后端
愚农搬码1 小时前
低代码表单与在线问卷不是一回事:产品定位和技术边界
后端
武子康1 小时前
固定时间步已经开了,为什么游戏回放还会走出不同位置?
人工智能·后端·agent
70后写java的老码农1 小时前
换模型只改三行配置:LangChain4j + Spring Boot 3.5 实战,一次分别接入 9 家模型服务
后端·ai编程
愚农搬码1 小时前
2026 年开源表单设计器选型:哪个更好用?
后端
vipxieliang2 小时前
ValidX 正则表达式预编译优化:Pattern 复用策略
java·spring boot·后端
vipxieliang2 小时前
OpenTelemetry 生产实践:Skyscanner 24 集群管理经验与 Mastodon 小团队方案
后端
明月_清风2 小时前
为什么 Skill 很难商业化?Bot 才是 AI 时代真正的商业机会
人工智能·后端·agent
苍何2 小时前
DeepSeek 的 Super-agent 设计,和我们的工程实践
后端