(七)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消息队列完成了。

相关推荐
WeiXiao_Hyy9 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇15 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
long31626 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
rannn_1111 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
短剑重铸之日1 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
Volunteer Technology2 小时前
sentinel基本操作
spring cloud·sentinel
Dragon Wu2 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
一个有梦有戏的人2 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
爬山算法3 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
独断万古他化3 小时前
【Spring 原理】Bean 的作用域与生命周期
java·后端·spring