旅游网站域名应该如何设计,重庆网站建设快速建站,wordpress里验证谷歌站长,网站设计报价怎么做简介#xff1a; 本文将 rocktmq-spring-boot 的设计实现做一个简单的介绍#xff0c;读者可以通过本文了解将 RocketMQ Client 端集成为 spring-boot-starter 框架的开发细节#xff0c;然后通过一个简单的示例来一步一步的讲解如何使用这个 spring-boot-starter 工具包来配…简介 本文将 rocktmq-spring-boot 的设计实现做一个简单的介绍读者可以通过本文了解将 RocketMQ Client 端集成为 spring-boot-starter 框架的开发细节然后通过一个简单的示例来一步一步的讲解如何使用这个 spring-boot-starter 工具包来配置发送和消费 RocketMQ 消息。 作者 | 辽天 来源 | 阿里巴巴云原生公众号
导读本文将 rocktmq-spring-boot 的设计实现做一个简单的介绍读者可以通过本文了解将 RocketMQ Client 端集成为 spring-boot-starter 框架的开发细节然后通过一个简单的示例来一步一步的讲解如何使用这个 spring-boot-starter 工具包来配置发送和消费 RocketMQ 消息。
在 Spring 生态中玩转 RocketMQ 系列文章
《如何在 Spring 生态中玩转 RocketMQ》《罗美琪和春波特的故事...》《RocketMQ-Spring 毕业两周年为什么能成为 Spring 生态中最受欢迎的 messaging 实现》
本文配套可交互教程已登录阿里云知行动手实验室PC 端登录 start.aliyun.com 在浏览器中立即体验。 通过本文您将了解到
Spring 的消息框架介绍rocketmq-spring-boot 具体实现使用示例
前言
上世纪 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 中关于消息的两个主要的框架即 Spring Messaging 和 Spring Cloud Stream。它们都能够与 Spring Boot 整合并提供了一些参考的实现。和所有的实现框架一样消息框架的目的是实现轻量级的消息驱动的微服务可以有效地简化开发人员对消息中间件的使用复杂度让系统开发人员可以有更多的精力关注于核心业务逻辑的处理。
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. Spring Cloud Stream
Spring Cloud Stream 结合了 Spring Integration 的注解和功能它的应用模型如下 该图片引自 spring cloud stream
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 Boot 支持的任何形式来提供包括应用启动参数、环境变量和 application.yml 或者 application.properties 文件部署人员可以在运行时动态选择通道连接 destination例如Kafka 的 topic 或者 RabbitMQ 的 exchange。
Binder SPI 的方式来让消息中间件产品使用可扩展的 API 来编写相应的 Binder并集成到 Spring Cloud Steam 环境目前 RocketMQ 还没有提供相关的 Binder我们计划在下一步将完善这一功能也希望社区里有这方面经验的同学积极尝试贡献 PR 或建议。
spring-boot-starter的实现
在开始的时候我们已经知道spring boot starter 构造的启动器对于使用者是非常方便的使用者只要在 pom.xml引入starter 的依赖定义相应的编译运行和部署功能就全部自动引入。因此常用的开源组件都会为 Spring 的用户提供一个 spring-boot-starter 封装给开发者让开发者非常方便集成和使用这里我们详细的介绍一下 RocketMQ客户端的 starter 实现过程。
1. spring-boot-starter 的实现步骤
对于一个 spring-boot-starter 实现需要包含如下几个部分
1在 pom.xml 的定义
定义最终要生成的 starter 组件信息
groupIdorg.apache.rocketmq/groupId
artifactIdspring-boot-starter-rocketmq/artifactId
version1.0.0-SNAPSHOT/version
定义依赖包
它分为两个部分Spring 自身的依赖包和 RocketMQ 的依赖包。 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最后具体地进行 RpcketMQ 相关的封装
在发送端producer和消费端consumer客户端分别进行封装在当前的实现版本提供了对 Spring Messaging 接口的兼容方式。
2. 消息发送端实现
1普通发送端
发送端的代码封装在 RocketMQTemplate POJO 中下图是发送端的相关代码的调用关系图 为了与 Spring Messaging 的发送模板兼容在 RocketMQTemplate 集成了 AbstractMessageSendingTemplate 抽象类来支持相关的消息转换和发送方法这些方法最终会代理给 doSend() 方法、doSend() 以及 RocoketMQ 所特有的一些方法如异步单向和顺序等方法直接添加到 RoketMQTempalte 中这些方法直接代理调用到 RocketMQ 的 Producer API 来进行消息的发送。
2事务消息发送端
对于事务消息的处理在消息发送端进行了部分的扩展参考上面的调用关系类图。
RocketMQTemplate 里加入了一个发送事务消息的方法 sendMessageInTransaction()并且最终这个方法会代理到 RocketMQ 的 TransactionProducer 进行调用在这个 Producer 上会注册其关联的 TransactionListener 实现类以便在发送消息后能够对 TransactionListener 里的方法实现进行调用。
3. 消息消费端实现 在消费端 Spring-Boot 应用启动后会扫描所有包含 RocketMQMessageListener 注解的类这些类需要集成 RocketMQListener 接口并实现 onMessage()方法这个 Listener 会一对一的被放置到。
DefaultRocketMQListenerContainer 容器对象中容器对象会根据消费的方式并发或顺序将 RocketMQListener 封装到具体的 RocketMQ 内部的并发或者顺序接口实现。在容器中创建 RocketMQ Consumer 对象启动并监听定制的 Topic 消息如果有消费消息则回调到 Listener 的 onMessage() 方法。
使用示例
上面的一章介绍了 RocketMQ 在 spring-boot-starter 方式的实现这里通过一个最简单的消息发送和消费的例子来介绍如何使这个 rocketmq-spring-boot-starter。
1. RocketMQ 服务端的准备
1启动 NameServer 和 Broker
要验证 RocketMQ 的 Spring-Boot 客户端首先要确保 RocketMQ 服务正确的下载并启动。可以参考 RocketMQ 主站的快速开始来进行操作。确保启动 NameServer 和 Broker 已经正确启动。
2创建实例中所需要的 Topics
在执行启动命令的目录下执行下面的命令行操作
bash bin/mqadmin updateTopic -c DefaultCluster -t string-topic
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
3. 编写客户端代码
用户如果使用它需要在消息的发布和消费客户端的 maven 配置文件 pom.xml 中添加如下的依赖 属性 spring-boot-starter-rocketmq-version 的取值为1.0.0-SNAPSHOT 这与上一步骤中执行安装到本地仓库的版本一致。
1消息发送端的代码
发送端的配置文件 application.properties 发送端的 Java 代码 2消息消费端代码
消费端的配置文件 application.properties 消费端的 Java 代码 这里只是简单的介绍了使用 spring-boot 来编写最基本的消息发送和接收的代码如果需要了解更多的调用方式如: 异步发送对象消息体指定 tag 标签以及指定事务消息请参看 github 的说明文档和详细的代码。我们后续还会对这些高级功能进行陆续的介绍。
作者简介
辽天阿里巴巴技术专家Apache RocketMQ 内核控拥有多年分布式系统研发经验对 Microservice、Messaging 和 Storage 等领域有深刻理解 目前专注 RocketMQ 内核优化以及 Messaging 生态建设。
原文链接
本文为阿里云原创内容未经允许不得转载。