RocketMQ 入门 —— 基于 Spring Boot 使用 RocketMQ

springboot集成rocketmq-spring-boot-starter的坑(避坑指南) rocketmq-spring-boot-starter的版本一开始,使用的是2.2.0版本,一直出现一个问题,那就是调用syncSend方法和asyncSend方法的时候,rocketmq控制台集群那里,生产者生产一条数据,监控那里就会显示两条数据。 阅读详情

上世纪 90 年代末,随着 Java EE(Enterprise Edition)的出现,特别是 Enterprise Java Beans 的使用需要复杂的描述符配置和死板复杂的代码实现,增加了广大开发者的学习曲线和开发成本,由此基于简单的 XML 配置和普通 Java 对象 (Plain Old Java Objects) 的 Spring 技术应运而生,依赖注入 (Dependency Injection), 控制反转(Inversion of Control) 和面向切面编程 (AOP) 的技术更加敏捷地解决了传统 Java 企业及版本的不足。

随着 Spring 的持续演进,基于注解 (Annotation) 的配置逐渐取代了 XML 文件配置, 2014 年 4 月 1 日,Spring Boot 1.0.0 正式发布,它基于 “约定大于配置”(Convention over configuration) 这一理念来快速地开发、测试、运行和部署 Spring 应用,并能通过简单地与各种启动器 (如 spring-boot-web-starter) 结合,让应用直接以命令行的方式运行,不需再部署到独立容器中。这种简便直接快速构建和开发应用的过程,可以使用约定的配置并且简化部署,受到越来越多的开发者的欢迎。

Apache RocketMQ 是业界知名的分布式消息和流处理中间件,简单地理解,它由 Broker 服务器和客户端两部分组成:

其中客户端一个是消息发布者客户端 (Producer),它负责向 Broker 服务器发送消息;

另外一个是消息的消费者客户端 (Consumer),多个消费者可以组成一个消费组,来订阅和拉取消费 Broker 服务器上存储的消息。

为了利用 Spring Boot 的快速开发和让用户能够更灵活地使用 RocketMQ 消息客户端,Apache RocketMQ 社区推出了 spring-boot-starter 实现。随着分布式事务消息功能在 RocketMQ 4.3.0 版本的发布,近期升级了相关的 spring-boot 代码,通过注解方式支持分布式事务的回查和事务消息的发送。

本文将对当前的设计实现做一个简单的介绍,读者可以通过本文了解将 RocketMQ Client 端集成为 spring-boot-starter 框架的开发细节,然后通过一个简单的示例来一步一步的讲解如何使用这个 spring-boot-starter 工具包来配置,发送和消费 RocketMQ 消息。

顺便在这里讨论一下在 Spring 中关于消息的两个主要的框架,即 Spring Messaging 和 Spring Cloud Stream。它们都能够与 Spring Boot 整合并提供了一些参考的实现。和所有的实现框架一样,消息框架的目的是实现轻量级的消息驱动的微服务,可以有效地简化开发人员对消息中间件的使用复杂度,让系统开发人员可以有更多的精力关注于核心业务逻辑的处理。

2.1 Spring Messaging

Spring Messaging 是 Spring Framework 4 中添加的模块,是 Spring 与消息系统集成的一个扩展性的支持。它实现了从基于 JmsTemplate 的简单的使用 JMS 接口到异步接收消息的一整套完整的基础架构,Spring AMQP 提供了该协议所要求的类似的功能集。 在与 Spring Boot 的集成后,它拥有了自动配置能力,能够在测试和运行时与相应的消息传递系统进行集成。

单纯对于客户端而言,Spring Messaging 提供了一套抽象的 API 或者说是约定的标准,对消息发送端和消息接收端的模式进行规定,不同的消息中间件提供商可以在这个模式下提供自己的 Spring 实现:在消息发送端需要实现的是一个 XXXTemplate 形式的 Java Bean,结合 Spring Boot 的自动化配置选项提供多个不同的发送消息方法;在消息的消费端是一个 XXXMessageListener 接口(实现方式通常会使用一个注解来声明一个消息驱动的 POJO),提供回调方法来监听和消费消息,这个接口同样可以使用 Spring Boot 的自动化选项和一些定制化的属性。

如果有兴趣深入的了解 Spring Messaging 及针对不同的消息产品的使用,推荐阅读这个文件。参考 Spring Messaging 的既有实现,RocketMQ 的 spring-boot-starter 中遵循了相关的设计模式并结合 RocketMQ 自身的功能特点提供了相应的 API(如,顺序,异步和事务半消息等)。

2.2 Spring Cloud Stream

Spring Cloud Stream 结合了 Spring Integration 的注解和功能,它的应用模型如下:

Spring Cloud Stream 框架中提供一个独立的应用内核,它通过输入 (@Input) 和输出 (@Output) 通道与外部世界进行通信,消息源端 (Source) 通过输入通道发送消息,消费目标端 (Sink) 通过监听输出通道来获取消费的消息。这些通道通过专用的 Binder 实现与外部代理连接。开发人员的代码只需要针对应用内核提供的固定的接口和注解方式进行编程,而不需要关心运行时具体的 Binder 绑定的消息中间件。在运行时,Spring Cloud Stream 能够自动探测并使用在 classpath 下找到的 Binder。

这样开发人员可以轻松地在相同的代码中使用不同类型的中间件:仅仅需要在构建时包含进不同的 Binder。在更加复杂的使用场景中,也可以在应用中打包多个 Binder 并让它自己选择 Binder,甚至在运行时为不同的通道使用不同的 Binder。

Binder 抽象使得 Spring Cloud Stream 应用可以灵活的连接到中间件,加之 Spring Cloud Stream 使用利用了 Spring Boot 的灵活配置配置能力,这样的配置可以通过外部配置的属性和 Spring Boo 支持的任何形式来提供(包括应用启动参数、环境变量和 application.yml 或者 application.properties 文件),部署人员可以在运行时动态选择通道连接 destination(例如,Kafka 的 topic 或者 RabbitMQ 的 exchange)。

Binder SPI 的方式来让消息中间件产品使用可扩展的 API 来编写相应的 Binder,并集成到 Spring Cloud Steam 环境,目前 RocketMQ 还没有提供相关的 Binder,我们计划在下一步将完善这一功能,也希望社区里有这方面经验的同学积极尝试,贡献 PR 或建议。

在开始的时候我们已经知道,spring boot starter 构造的启动器对于使用者是非常方便的,使用者只要在 pom.xml 引入 starter 的依赖定义,相应的编译,运行和部署功能就全部自动引入。因此常用的开源组件都会为 Spring 的用户提供一个 spring-boot-starter 封装给开发者,让开发者非常方便集成和使用,这里我们详细的介绍一下 RocketMQ(客户端)的 starter 实现过程。

3.1 spring-boot-starter 的实现步骤

对于一个 spring-boot-starter 实现需要包含如下几个部分:

1. 在 pom.xml 的定义

  • 定义最终要生成的 starter 组件信息
<groupId>org.apache.rocketmq</groupId>
<artifactId>spring-boot-starter-rocketmq</artifactId>
<version>1.0.0-SNAPSHOT</version>


  • 定义依赖包,

    它分为两个部分: A、Spring 自身的依赖包; B、RocketMQ 的依赖包

<dependencies>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>


    
    <dependency>
        <groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-client</artifactId>
        <version>${rocketmq-version}</version>
    </dependency>
</dependencies>
    <dependencyManagement>
    <dependencies>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>


2. 配置文件类

定义应用属性配置文件类 RocketMQProperties, 这个 Bean 定义一组默认的属性值。用户在使用最终的 starter 时,可以根据这个类定义的属性来修改取值,当然不是直接修改这个类的配置,而是 spring-boot 应用中对应的配置文件:src/main/resources/application.properties.

3. 定义自动加载类

定义 src/resources/META-INF/spring.factories 文件中的自动加载类, 其目的是让 spring boot 更具文中中所指定的自动化配置类来自动初始化相关的 Bean,Component 或 Service,它的内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.apache.rocketmq.spring.starter.RocketMQAutoConfiguration


在 RocketMQAutoConfiguration 类的具体实现中,定义开放给用户直接使用的 Bean 对象. 包括:

  • RocketMQProperties 加载应用属性配置文件的处理类;
  • RocketMQTemplate 发送端用户发送消息的发送模板类;
  • ListenerContainerConfiguration 容器 Bean 负责发现和注册消费端消费实现接口类,这个类要求:由 @RocketMQMessageListener 注解标注;实现 RocketMQListener 泛化接口。

4. 最后具体的 RocketMQ 相关的封装

在发送端(producer)和消费端 (consumer) 客户端分别进行封装,在当前的实现版本提供了对 Spring Messaging 接口的兼容方式。

3.2 消息发送端实现

1. 普通发送端

发送端的代码封装在 RocketMQTemplate POJO 中,下图是发送端的相关代码的调用关系图:

为了与 Spring Messaging 的发送模板兼容,在 RocketMQTemplate 集成了 AbstractMessageSendingTemplate 抽象类,来支持相关的消息转换和发送方法,这些方法最终会代理给 doSend() 方法;doSend() 以及 RocoketMQ 所特有的一些方法如异步,单向和顺序等方法直接添加到 RoketMQTempalte 中,这些方法直接代理调用到 RocketMQ 的 Producer API 来进行消息的发送。

2. 事务消息发送端

对于事务消息的处理,在消息发送端进行了部分的扩展,参考下图的调用关系类图:

RocketMQTemplate 里加入了一个发送事务消息的方法 sendMessageInTransaction(), 并且最终这个方法会代理到 RocketMQ 的 TransactionProducer 进行调用,在这个 Producer 上会注册其关联的 TransactionListener 实现类,以便在发送消息后能够对 TransactionListener 里的方法实现进行调用。

3.3. 消息消费端实现

在消费端 Spring-Boot 应用启动后,会扫描所有包含 @RocketMQMessageListener 注解的类 (这些类需要集成 RocketMQListener 接口,并实现 onMessage() 方法),这个 Listener 会一对一的被放置到 DefaultRocketMQListenerContainer 容器对象中,容器对象会根据消费的方式 (并发或顺序),将 RocketMQListener 封装到具体的 RocketMQ 内部的并发或者顺序接口实现。在容器中创建 RocketMQ Consumer 对象,启动并监听定制的 Topic 消息,如果有消费消息,则回调到 Listener 的 onMessage() 方法。

上面的一章介绍了 RocketMQ 在 spring-boot-starter 方式的实现,这里通过一个最简单的消息发送和消费的例子来介绍如何使这个 rocketmq-spring-boot-starter。

4.1 RocketMQ 服务端的准备

1. 启动 NameServer 和 Broker

要验证 RocketMQ 的 Spring-Boot 客户端,首先要确保 RocketMQ 服务正确的下载并启动。可以参考 RocketMQ 主站的快速开始来进行操作。确保启动 NameServer 和 Broker 已经正确启动。

2. 创建实例中所需要的 Topics

在执行启动命令的目录下执行下面的命令行操作

bash bin/mqadmin updateTopic -c DefaultCluster -t string-topic


4.2. 编译 rocketmq-spring-boot-starter

目前的 spring-boot-starter 依赖还没有提交的 Maven 的中心库,用户使用前需要自行下载 git 源码,然后执行 mvn clean install 安装到本地仓库。

git clone https://github.com/apache/rocketmq-externals.git cd rocketmq-spring-boot-starter mvn clean install


4.3. 编写客户端代码

用户如果使用它,需要在消息的发布和消费客户端的 maven 配置文件 pom.xml 中添加如下的依赖:

<properties>
    <spring-boot-starter-rocketmq-version>1.0.0-SNAPSHOT</spring-boot-starter-rocketmq-version>
</properties>

<dependency>
   <groupId>org.apache.rocketmq</groupId>
   <artifactId>spring-boot-starter-rocketmq</artifactId>
   <version>${spring-boot-starter-rocketmq-version}</version>
</dependency>


属性 spring-boot-starter-rocketmq-version 的取值为:1.0.0-SNAPSHOT, 这与上一步骤中执行安装到本地仓库的版本一致。

1. 消息发送端的代码

发送端的配置文件 application.properties

# 定义name-server地址
spring.rocketmq.name-server=localhost:9876
# 定义发布者组名
spring.rocketmq.producer.group=my-group1
# 定义要发送的topic
spring.rocketmq.topic=string-topic


发送端的 Java 代码

import org.apache.rocketmq.spring.starter.core.RocketMQTemplate;
...

@SpringBootApplication
public class ProducerApplication implements CommandLineRunner {
    
    @Resource
    private RocketMQTemplate rocketMQTemplate;

    
    @Value("${spring.rocketmq.springTopic}")
    private String springTopic;

    public static void main(String[] args){
        SpringApplication.run(ProducerApplication.class, args);
    }

    public void run(String... args) throws Exception {
        
        SendResult sendResult = rocketMQTemplate.syncSend(springTopic, "Hello, World!");
        
        System.out.printf("string-topic syncSend1 sendResult=%s %n", sendResult);
    }
}


2. 消息消费端代码

消费端的配置文件 application.properties

# 定义name-server地址
spring.rocketmq.name-server=localhost:9876
# 定义发布者组名
spring.rocketmq.consumer.group=my-customer-group1
# 定义要发送的topic
spring.rocketmq.topic=string-topic


消费端的 Java 代码

@SpringBootApplication
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}



@Service
@RocketMQMessageListener(topic = "${spring.rocketmq.topic}", consumerGroup = "${spring.rocketmq.consumer.group}")
class StringConsumer implements RocketMQListener<String> {
    @Override
    public void onMessage(String message) {
        System.out.printf("------- StringConsumer received: %s %f", message);
    }
}


这里只是简单的介绍了使用 spring-boot 来编写最基本的消息发送和接收的代码,如果需要了解更多的调用方式,如: 异步发送,对象消息体,指定 tag 标签以及指定事务消息,请参看 github 的说明文档和详细的代码。我们后续还会对这些高级功能进行陆续的介绍。

  1. Spring Boot features-Messaging
  2. Enterprise Integration Pattern - 组成简介
  3. Spring Cloud Stream Reference Guide
  4. https://dzone.com/articles/creating-custom-springboot-starter-for-twitter4j
RocketMQ最佳实践(三)开发spring-boot-starter-rocketmq实现与spring boot项目的整合 不要以为这只是spring bootRocketMQ的简单整合,本篇文章还为各位看官呈现以下知识点的最佳实践: 自定义一个spring boot 的starter使用spring的事件传播机制实现bean与bean之间基于事件驱动的通信自定义注解、组合注解 先来撩点故事背景^_^ 最近在使用spring boot/spring cloud搭建做微服务架构,发现spring boot 阅读详情

相关推荐

RocketMq 系列】springboot RocketMq 入门教程

Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的业务场景。

Huangjiazhen711的博客 2631

RocketMQ整合SpringBoot

SpringBoot整合RocketMQ pom.xml <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>${rocketmq.version}</version> </d

weixin_47638656的博客 1265

RocketMQ+ SpringBoot快速入门案例(附代码+代码详细讲解)

SpringBoot +RocketMQ入门案例, 附带免费代码. 附带代码讲解. 进行了同步消息, 异步消息, 延迟消息, 单向消息的 案例.

null 2227

Spring Boot 集成 RocketMQ(1)

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来目录:部分内容截图:《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!图片转存中…(img-WA9JcG8Z-1713294600876)]

2401_84048671的博客 1207

Spring Boot 消息队列 RocketMQ 入门

1. 概述 如果胖友还没了解过分布式消息队列Apache RocketMQ,建议先阅读下艿艿写的《芋道 RocketMQ 极简入门》文章。虽然这篇文章标题是安装部署,实际可以理解成《一文带你快速入门 RocketMQ》,哈哈哈。 考虑这是 RocketMQ 如何在 Spring Boot 整合与使用的文章,所以还是简单介绍下 RocketMQ 是什么? FROM《消息中间件 Apache RocketMQRocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延...

weixin_42073629的博客 1172

芋道 Spring Boot 消息队列 RocketMQ 入门

点击上方“芋道源码”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2020 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络...

芋艿V 909

Spring Boot 整合 RocketMQ入门到精通

本文全面介绍了RocketMQ消息中间件及其与SpringBoot的集成方案。主要内容包括:1)RocketMQ核心价值与应用场景;2)单机与集群环境搭建步骤;3)SpringBoot集成配置与消息生产消费实现;4)高级特性(事务消息、顺序消息、延迟消息等);5)消息过滤与路由机制;6)监控与高可用配置;7)性能优化实践。重点阐述了RocketMQ在分布式系统中的解耦、异步处理、流量削峰等核心功能,以及如何通过合理配置实现高性能、高可用的消息系统。文章提供了从基础到高级的完整技术方案,包括代码示例和最佳实践

油墨香^-^的博客 672

RocketMQ快速入门Spring Boot整合实践

RocketMQ是一款阿里巴巴开源的分布式消息中间件,具有高吞吐量、高可用性和低延迟特性,适用于电商、金融等场景。本文介绍了RocketMQ的核心组件(生产者、消费者、Topic等)和消息类型(普通消息、顺序消息等),并详细展示了Spring Boot整合RocketMQ的实现方案,包括Maven/Gradle依赖配置和application.yml配置示例,帮助开发者快速掌握RocketMQ使用

J_liaty的博客 1212

RocketMQ消息队列:从入门Spring Boot实战

RocketMQ是阿里巴巴在2012年开源的一款分布式消息中间件,后于2016年捐赠给Apache软件基金会,并于2017年成为Apache顶级项目。它专为大规模分布式系统中的消息处理而设计,具有高吞吐量、低延迟、海量堆积、顺序收发等特点。RocketMQ的诞生,旨在解决阿里巴巴在“双十一”等高并发场景下,消息传递的性能、可靠性、实时性以及可扩展性等挑战。

weixin_56018532的博客 773

第四部分:Spring Boot +RocketMQ 开发手册 | Apache RocketMQ 5.3 从入门到实战

i++) {同步发送可靠性最高(关键业务),异步发送兼顾性能与可靠性,单向发送仅适用于非关键场景;延迟消息依赖预设等级,批量消息需控制大小,事务消息保证分布式事务一致性;生产者需单例化,命名规范需符合业务域规则。

寓教于乐。教己助人 661

Spring Boot 3 整合 RocketMQ 事务消息一致性方案实战:从入门到放弃再到真香

如果你们项目也在用类似技术,欢迎交流实践经验。环境要求:JDK 17+技术栈标签:RocketMQ, 事务消息, 分布式事务。

csdn_ljl的博客 23

ros 消息队列与缓冲区_Spring Boot消息队列系统:RocketMQ入门

前言来啦老铁!笔者学习Spring Boot有一段时间了,截至目前已实践、总结了26篇Spring Boot系列学习文章,感兴趣的同学可以关注专题一起学习吧!Spring Boot全家桶在上一篇文章中,我们一起敲开了消息队列的大门,今天继续造!生命有限,今天我们先学习RocketMQRocketMQ学习路径RocketMQ简介;RocketMQ下载;RocketMQ安装;安装RocketMQ可视...

weixin_42542669的博客 421

rocketmq一个消费者有多个服务器_RocketMQ入门案例

RocketMQ入门案例发布时间:2019-03-29 11:27,浏览次数:1369, 标签:RocketMQ学习RocketMQ,先写一个Demo演示一下看看效果。一、服务端部署因为只是简单的为了演示效果,服务端仅部署单Master模式 —— 一个Name Server节点,一个Broker节点。主要有以下步骤。* 下载RocketMQ源码、编译(也可以网上下载编译好的文件),这里使用最新的4...

weixin_42298727的博客 948

RocketMQ 】API 入门教程 (延迟消息,顺序消息,广播消息)

延迟消息,顺序消息,广播消息,延迟消息,批量发送消息,MQ基本JAVA API使用

Vincent Vic 887

RocketMQ的windos/linux/docker超详细安装及简单入门

MQ介绍,RocketMQ简介、安装、入门

Poldroc的博客 2024

rocketMQ-基本使用和原理简介

Apache RocketMQ是阿里开发的分布式消息队列系统,具有高性能、高可靠等特点。文章介绍了RocketMQ的安装步骤,包括下载二进制包和配置JVM内存。通过搭建单节点集群(nameserver和broker)演示了基本部署流程,并提供了Java生产者/消费者代码示例。生产者使用DefaultMQProducer发送同步消息,消费者通过DefaultMQPushConsumer订阅消息并处理。文末展示了消息发送成功的JSON格式返回结果,验证了消息投递功能。该教程适合初学者快速了解RocketMQ的基

qq_44818304的博客 875

Springboot2整合RocketMQ4.x实战消费消息

1、在线创建springboot工程 官网:https://start.spring.io/ 注意:不要选择SNAPSHOT 点击GENERATE,下载zip包。解压zip包,导入IDEA. 2、将项目导入IDEA 2.1配置maven仓库 打开Settings 选择你本地的maven仓库 配置好后,点击Apply,OK. 2.2配置JDK 点击Project Structure 点击Project,配置jdk 点击Modules, 点击SDKs 配置好后,点击Apply , OK. ID

婉君 1376

RocketMQ快速入门

RocketMQ基本入门

qq_45243783的博客 1706
上一篇: Spring Boot 中使用 Spring Security 进行安全控制
下一篇: 详解 Eureka 缓存机制
苏木力格
博客等级 码龄10年 58粉丝 41原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值