开篇:在Spring生态中玩转RocketMQ

简介: 开篇:在Spring生态中玩转RocketMQjava

Apache RocketMQ 做为阿里开源的业务消息的首选,经过双11业务打磨,在消息和流处理领域被普遍应用。而微服务生态Spring框架也是业务开发中最受开发者欢迎的框架之一,二者的完美契合使得RocketMQ成为Spring Messaing实现中最受欢迎的消息实现。spring

 

在Spring生态中使用RocketMQ到底有多少种方式?他们各自适用于什么场景?各自有什么优劣势?编程

如何开始实战?本书将一一解答。架构

 

咱们先会带领各位开发者:app

  • 回顾罗美琪(RocketMQ)和春波特(SpringBoot)故事开始的时候,rocketmq-spring通过6个多月的孵化,做为Apache RocketMQ的子项目正式毕业。
  • 回顾rocketmq-spring毕业后的两年,是如何成为Spring 生态中最受欢迎的 messaging 实现的?

 

最后将经过图文实操地方式带来给位开发者玩转在Spring生态中使用RocketMQ的三种主流方式。框架

全部动手实操的部分你们能够登陆start.aliyun.com知行动手实验室免费体验。less

 

开卷有益,但愿各位开发者经过阅读本书、动手实操有所收获。异步

 

 

RocketMQ与Spring的碰撞

 

在介绍RocketMQ与Spring故事以前,不得不提到Spring中的两个关于消息的框架,Spring Messaging和Spring Cloud Stream。它们都可以与Spring Boot整合并提供了一些参考的实现。和全部的实现框架同样,消息框架的目的是实现轻量级的消息驱动的微服务,能够有效地简化开发人员对消息中间件的使用复杂度,让系统开发人员能够有更多的精力关注于核心业务逻辑的处理。分布式

 

Spring Messaging

 

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

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

 

 

在Apache RocketMQ生态中,RocketMQ-Spring-Boot-Starter(下文简称RocketMQ-Spring)就是一个支持Spring Messaging API标准的项目。该项目把RocketMQ的客户端使用Spring Boot的方式进行了封装,可让用户经过简单的annotation和标准的Spring Messaging API编写代码来进行消息的发送和消费,也支持扩展出RocketMQ原生API来支持更加丰富的消息类型。在RocketMQ-Spring毕业初期,RocketMQ社区同窗请Spring社区的同窗对RocketMQ-Spring代码进行review,引出一段罗美琪(RocketMQ)和春波特(Spring Boot)故事的佳话[1],著名Spring布道师Josh Long向国外同窗介绍如何使用RocketMQ-Spring收发消息[2]。RocketMQ-Spring也在短短两年时间超越Spring-Kafka和Spring-AMQP(注:二者均由Spring社区维护),成为Spring Messaging生态中最活跃的消息项目。

 

 

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 Boot支持的任何形式来提供(包括应用启动参数、环境变量和application.yml或者application.properties文件),部署人员能够在运行时动态选择通道链接destination(例如,RocketMQ的topic或者RabbitMQ的exchange)。

 

Spring Cloud Stream 屏蔽了底层消息中间件的实现细节,但愿以统一的一套 API 来进行消息的发送/消费,底层消息中间件的实现细节由各消息中间件的 Binder 完成。Spring官方实现了Rabbit binder和Kafka Binder。Spring Cloud Alibaba实现了RocketMQ Binder[3],其主要实现原理是把发送消息最终代理给了RocketMQ-Spring的RocketMQTemplate,在消费端则内部会启动RocketMQ-Spring Consumer Container 来接收消息。以此为基础,Spring Cloud Alibaba还实现了Spring Cloud Bus RocketMQ, 用户可使用RocketMQ做为Spring Cloud 体系内的消息总线,来链接分布式系统的全部节点。经过Spring Cloud Stream RocketMQ Binder,RocketMQ能够与Spring Cloud生态更好的结合。好比与 Spring Cloud Data Flow、Spring Cloud Funtion结合,让RocketMQ能够在Spring流计算生态、Serverless(FaaS)项目中被使用。

 

现在Spring Cloud Stream RocketMQ Binder和Spring Cloud Bus RocketMQ作为Spring Cloud Alibaba的实现已登录Spring的官网[4],Spring Cloud Alibaba也成为Spring Cloud 最活跃的实现。

 

如何在Spring生态中选择RocketMQ实现?

 

经过介绍Spring中的消息框架,介绍了以RocketMQ为基础与Spring消息框架结合的几个项目,主要是RocketMQ-Spring、Spring Cloud Stream RocketMQ Binder、Spring Cloud Bus RocketMQ、Spring Data Flow和Spring Cloud Function。它们之间的关系能够以下图表示。

 

 

如何在实际业务开发中选择相应项目进行使用?下表列出了每一个项目的特色和使用场景。

 

项目

特色

使用场景

RocketMQ-Spring

1.做为起步依赖,简单引入一个包就能在Spring生态用到RocketMQ客户端的全部功能。

 

2.利用了大量自动配置和注解简化了编程模型,而且支持Spring Messaging API

 

3.与RocketMQ 原生Java SDK的功能彻底对齐

适合在Spring Boot中使用RocketMQ的用户,但愿能用到RocketMQ原生java客户端的全部功能,并经过Spring注解和自动配置简化编程模型。

Spring Cloud Stream RocketMQ Binder

1.屏蔽底层 MQ 实现细节,上层 Spring Cloud Stream 的 API 是统一的。若是想从 Kafka 切到 RocketMQ,直接改个配置便可。

 

2.与 Spring Cloud 生态整合更加方便。好比 Spring Cloud Data Flow,这上面的流计算都是基于 Spring Cloud Stream;Spring Cloud Bus 消息总线内部也是用的 Spring Cloud Stream。

 

3.Spring Cloud Stream 提供的注解,编程体验都是很是棒。

在代码层面能彻底屏蔽底层消息中间件的用户,而且但愿能项目能更好的接入Spring Cloud 生态(Spring Cloud Data Flow、Spring Cloud Funtcion等)。

Spring Cloud Bus RocketMQ

将RocketMQ 做为事件的“传输器”,经过发送事件(消息)到消息队列上,从而广播到订阅该事件(消息)的全部节点上。完成事件的分发和通知。

在Spring生态中但愿用RocketMQ作消息总线的用户,能够用在应用间事件的通讯,配置中心客户端刷新等场景

Spring Cloud Data Flow

以 Source/Processor/Sink 组件进行流式任务处理。RocketMQ 做为流处理过程当中的中间存储组件

流处理,大数据处理场景

Spring Cloud Function

消息的消费/生产/处理都是一次函数调用,融合 Java 生态的 Function 模型

Serverless 场景

 

RocketMQ做为业务消息的首选,在消息和流处理领域被普遍应用。而微服务生态Spring框架也是业务开发中最被,二者的完美契合使得RocketMQ成为Spring Messaing实现中最受欢迎的消息实现。书的后半部分讲给各位开发者详细讲述在Spring生态中使用RocketMQ的三种主流的方式。

本文为阿里云原创内容,未经容许不得转载。

相关文章
相关标签/搜索