在 Spring 生态中玩转 RocketMQ
本文作者:饶子昊 - Spring Cloud Alibaba Committer,阿里云智能开发工程师。
01 Spring 生态介绍
根据 JVM EcoSystem Report 2021 最新数据显示,Spring 框架的使用者占比超过统计人数的80%,Spring MVC 达1/3。该数据也说明了 Spring 生态的相关组件在 Java 生态中仍然占据着绝对领先的地位。
国内使用最广泛的 Spring 生态主要有 Spring Framework、Spring Boot 和 Spring Cloud 。
Framework 起源于 2002 年,凭借着提供的依赖注入、面向切面编程等能力,颠覆了传统厚重的EJB企业级应用框架,并逐渐成为当今 Java 企业级应用开发的主流框架。虽然 Spring Framework 为 Java 开发带来了很多优势,但在使用的过程中,人们也逐渐意识到了它配置繁琐等缺陷。
2014 年 Spring Boot 被 Spring 社区开源,通过一系列约定俗成的默认配置极大简化了 Spring Framework 在使用中常被诟病的配置繁琐等问题,让 Spring Framework 继续焕发生机。
2015 年 6 月,针对分布式微服务应用开发中的常见问题,Spring 社区推出了包括分布式配置注册中心、分布式消息、限流降级等能力在内的 Spring Cloud 解决方案,对企业从单体应用向微服务转型起到了重大的推动作用。
除了上图组件,如今的 Spring 是由 Web 应用、微服务、响应式编程、云计算、函数计算、事件驱动和批处理任务七大核心领域 22 个核心项目组成的庞大生态。
02 Spring Cloud Alibaba
目前在 Spring 生态中使用开源 RocketMQ 主要有两种方式:第一种是使用就是 RocketMQ Spring 提供的依赖和注解实现;另一种是基于 Spring Cloud Alibaba 提供的 Spring Cloud Stream 方式。
得益于过往十年处理淘系电商高并发、大流量业务积累的技术经验,阿里巴巴内部沉淀了一套包括限流降级、分布式注册配置中心、分布式消息、分布式事务等在内的完整的微服务解决方案。
2015 年 6 月,Spring Cloud 的第一个正式版本发布后,迅速成为了微服务技术圈的热点。随后一两年的发展证明,以 Spring Cloud Netflix 为代表的基于 Spring Cloud 规范的一整套微服务解决方案,对中小企业技术发展产生了巨大影响,加速了大量中小企业从单体应用向微服务的转型节奏。
当受 Spring Cloud Netflix 项目的启发,考虑到虽然 Spring Cloud 生态的设计理念非常好,但相关的微服务解决方案并不是十分成熟,还存在一些能力缺失,而正好阿里内部早已经有一套完整的解决方案。因此最早参与 Spring Cloud Alibaba 的几个同事就一拍即合,在 2018 年 7 月将阿里内部经过十多年技术打磨的一整套微服务解决方案通过 Spring Cloud Alibaba 的方式贡献给 Spring Cloud 生态。
如上图所示,通过 Spring Cloud Alibaba 配套一些阿里对外提供的差异化存储、监控等能力,很多外部用户可以非常方便、低成本地构建微服务应用。
03 Spring Cloud Alibaba与Spring Cloud生态关系
上图圆圈内部颜色较深的橙色部分表示 Spring Cloud ,它是在 SpringBoot 的基础上提供的一套完整的微服务解决方案标准,由一系列相关子项目组成,包括 OpenFeign 和 RestTemplate 定义的分布式 RPC 调用能力、Spring Cloud Comments 和 Spring Cloud Config 子项目抽象的统一注册配置中心能力、Spring Cloud Stream 子项目定义的分布式消息集成标准和 Spring Cloud CircuitBreak 子项目定义的统一限流降级能力等。
基于微服务中的标准,Spring Cloud Alibaba 为来自阿里巴巴内部的微服务解决方案提供了具体实现,不仅给 Spring Cloud 生态带来 Nacos、RocketMQ、Sentinel 等微服务解决方案的实现,还集成了一些阿里云平台服务,比如短信服务、SMS、分布式任务调度、Schedulex 等。
Spring Cloud Netflex 和 Spring Cloud Alibaba 与 Spring Cloud 的关系一样,都是基于 Spring Cloud 这一整套微服务所定义标准的具体实现。
目前 Spring Cloud 生态已经非常庞大繁荣,除了 Spring Cloud Alibaba 、Spring Cloud Netflix 以外,ZooKeeper 和 Consul 都分别以 Spring Cloud ZooKeeper 和 Spring Cloud Consul 项目的形式贡献给 Spring Cloud 社区作为其中注册和配置中心解决方案的实现。
另外, Spring Cloud Kubernetes 也是云原生时代非常有意思的子项目,它使 Spring Cloud 服务可以直接基于 Kubernetes 中的服务 service 概念去调用基于 Kubernetes 构建的微服务。
从上图可知, Spring Cloud Alibaba 和 Spring Cloud Netflix 互为补充,在 Spring Cloud 生态完整度方面起到重要作用。
另外,此方案的组件在国内用户中的受欢迎程度已经超过 Spring Cloud 官方默认提供的一些组件,比如 Nacos 和 RocketMQ 已经逐渐成为国内分布式注册配置中心和分布式消息的事实标准,广泛应用于大量中小企业的生产环境中。
除了 Spring Cloud Alibaba 像 Spring Cloudnetflex 还有。另外像Zookeeper 和 Consul 都分别以 Spring Cloud Zookeeper 和 Spring Cloud Consul 的项目形式贡献给了 Spring Cloud 社区作为注册和配置中心解决方案的实现。
04 基于Spring Cloud Alibaba在Spring生态玩转RocketMQ
现在的 RocketMQ 是阿里巴巴中间件团队于 2012 年研发并对外开源的第三代分布式消息引擎,其高性能、低延迟、抗堆积特性稳定支撑了历年阿里巴巴双十一万亿级数据洪峰业务。2016 年,阿里巴巴向阿帕奇软件基金会捐献了 RocketMQ 项目。次年,RocketMQ 顺利从阿帕奇软件基金会毕业,成为阿帕奇软件基金会中的一个顶级项目。
如上图所示,一个生产环境中的 RocketMQ 系统由 Name Server 集群、 Broker 集群、生产者集群和消费者集群四个部分组成。其中 Broker 集群用于存储消息, Name Server 集群提供命名服务,帮助消息生产者将消息发送到特定 Broker 集群以及从特定 Broker 集群中订阅消息。
RocketMQ 作为支撑淘系电商大促的核心中间件之一,不仅在可靠性和吞吐量方面经过实战考验,优势显著,它还提供了两种订阅模式,分别是广播订阅和集群订阅,以及多种消息发送方式和多种消息类型,包括普通消息、顺序消息、定时消息、延迟消息和事务消息等,这些消息类型能够帮助业务开发人员轻松解决特定的业务诉求。
Spring Cloud Stream 作为 Spring Cloud 定义的分布式消息解决方案,主要由 Message、Binder 和 Bindings 三部分组成。Message 定义了统一的消息结构,能够将业务系统中的消息数据通过统一的消息结构传递给特定消息中间件中的 Message 消息结构。Binder 是 Spring Cloud Stream 中的核心,负责与外部消息集成,比如与 RocketMQ 集成需要有 RocketMQ Binder ,与 Kafka 集成需要有 Kafka Binder 。Middleware 表示具体的消息中间件,可以是 RocketMQ 也可以是 Kafka 等。
上图中,上半部分是使用 Spring Cloud Stream 连接消息中间件的应用程序,中间的 Binder 类似于连接器,连接应用程序与具体的消息中间,从而实现应用与外部消息中间件解耦。
Bindings 由 Binder 创建,主要负责业务系统与消息中间件通信,完成消息的发送和接收。
Demo 演示两种方式使用 RocketMQ 的区别
上图为 RocketMQ Spring 项目提供的用于消息发送的API,由 RocketMQ SpringBoot 模块提供。通过 Spring 相关依赖在业务系统使用 RocketMQ ,除了要引入 RocketMQ Spring 相关依赖做一些配置以外,还要通过 RocketMQ Spring 项目提供的 API 进行消息的发送。接收模块的逻辑类似,但不是通过 API ,而是通过RocketMQ Spring 提供注解。
Spring Cloud Alibaba 操作 RocketMQ 是基于 Spring Cloud 生态中的 Spring Cloud Stream 分布式消息的标准来实现了 RocketMQ 的一些核心组件,如果 Spring 应用需要通过 Spring Cloud Alibaba 使用 RocketMQ ,只需引入 SpringCloud Alibaba 的模块依赖,再引入 Spring Cloud Stream 的模块即可。
上图为广播消息的生产者持续发送 100 条消息的代码,是通过 Spring Cloud Stream 提供的 StreamBridge API 进行消息的发送。Message 相关 API 也不依赖于与具体的消息中间件进行耦合,而是基于 Spring 相关的 Message 对象进行消息的构造。
发送消息的时候还需要做一些配置,主要是基于 Cloud 提供的内容去解析配置。
上图为消息的发送者相关代码。没有 RocketMQ 相关的 API ,只需 consumer 方法即可从 RocketMQ 中订阅消息,再通过 log.info 打印结果。与具体消息绑定在一起是通过配置文件,不在业务代码中,没有相关 API 与具体的消息中间件的紧耦合。
接下来发送消息,查看消费者能否收到消息。通过 RocketMQ 相关模块启动 NameServer 和 Broker,启动消息的生产者。
上图显示 consumer1 和 consumer2 都已经收到消息,查看日志,显示消息内容为Hello RocketMQ 0 到 Hello RocketMQ 99 共 100 条消息。
综上,Spring Cloud Alibaba 方式的特点为与具体的消息中间没有绑定关系。业务代码的实现全部基于 Spring Cloud Stream 提供的公共 API 进行消息的发送和接收。其优点在于,代码里面没有使用与 RocketMQ 相关的类进行消息的接收和发送,能够很方便地在不同中间件之间进行切换。比如从 RocketMQ 切换至 Kafka,只需要把应用中的 RocketMQ 相关的依赖替换成 Kafka 的,再修改一些配置即可,无需修改业务代码。
相比于 RocketMQ Spring , Spring Cloud Stream 能让业务系统和具体的消息中间解耦,让系统具有较好的可扩展性和可维护性,能够拥有较长远的生命周期。
05 Spring Cloud Alibaba展望
经过三年多的发展发展,Spring Cloud 一共发布了 27 个版本, star 数目达 22.5k ,fork 数目和用户数目分别达到 7k 和 23.7k ,领先于国内外甚至 Spring Cloud 官方的子项目相关数据。
未来, Spring Cloud Alibaba 社区会从以下两个方面进一步丰富项目能力,促进社区发展。
第一,社区活动方面
① 举办定期社区双周会,讨论 github 上过往两周的 issue 和 PR 情况。另外,周会中也会组织相关主题内容的分享,周会信息将在 Spring Cloud Alibaba 交流群中进行同步。
② 联合中科院和阿里巴巴开源办公室举办“开源之夏”和“编程之夏”等活动。活动主要针对在校生,通过暑期时间,在社区导师一对一的带领下完成某些 feature 并贡献给社区,为广大在校生接触开源社区提供渠道和更多机会。
③ 线下或线上举办 Meetup,为社区内外的同学提供更多交流机会。
第二,发展规划
Spring Cloud Alibaba 过去第一阶段的工作是丰富 Spring Cloud 生态,让广大外部用户能够轻松地拥抱微服务未来。第二阶段,Spring Cloud Alibaba将继续努力,让外部用户用好微服务,构建微服务治理和业务高可用相关的能力,满足用户在微服务使用过程中的高层次诉求,包括以下三个方面:
① 全面支持 RocketMQ 5.0 和 Sentinel 2.0 等中间件,为用户带来更丰富的中间件使用体验。
② 构建 Spring Cloud 生态的微服务治理能力、微服务高可用等能力。
③ 构建 Spring Cloud 分布式任务调度等方面的能力。
最后,非常欢迎对 Spring Cloud Alibaba 项目感兴趣的同学加入社区,一起参与 Spring Cloud Alibaba 未来的建设。
在 Spring 生态中玩转 RocketMQ的更多相关文章
- Spring生态研习【一】:定时任务Spring-task
本系列具体研究一下spring生态中的重要或者常用的功能套件,今天从定时任务开始,主要是spring-task.至于quartz,下次找个时间再总结. 我的验证环境,是SpringCloud体系下,基 ...
- Spring生态简介
目录 概述 项目说明 主要项目 社区项目 保留项目 最后总结 概述 做Java开发的人一提起Spring,首先在脑海中浮现出的就是"IoC","AOP",&qu ...
- 204. jetcache:在Spring Boot中怎么玩?
[视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源 ...
- 201. Spring Boot JNDI:Spring Boot中怎么玩JNDI
[视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源 ...
- 玩转spring mvc(四)---在spring MVC中整合JPA
关于在Spring MVC中整合JPA是在我的上一篇关于spring mvc基本配置基础上进行的,所以大家先参考一下我的上一篇文章:http://blog.csdn.net/u012116457/ar ...
- Spring生态研习【二】:SpEL(Spring Expression Language)
1. SpEL功能简介 它是spring生态里面的一个功能强大的描述语言,支在在运行期间对象图里面的数据查询和数据操作.语法和标准的EL一样,但是支持一些额外的功能特性,最显著的就是方法调用以及基本字 ...
- spring事务中隔离级别和spring的事务传播机制
Transaction 也就是所谓的事务了,通俗理解就是一件事情.从小,父母就教育我们,做事情要有始有终,不能半途而废. 事务也是这样,不能做一般就不做了,要么做完,要 么就不做.也就是说,事务必须是 ...
- spring boot 中 Cache 的使用
参考:https://blog.csdn.net/qq_38974634/article/details/80650810 一.JSR107 Java Caching 定义5个核心的接口,分别是Cac ...
- 再也不担心写出臃肿的Flink流处理程序啦,发现一款将Flink与Spring生态完美融合的脚手架工程-懒松鼠Flink-Boot
目录 你可能面临如下苦恼: 接口缓存 重试机制 Bean校验 等等...... 它为流计算开发工程师解决了 有了它你的代码就像这样子: 仓库地址:懒松鼠Flink-Boot 1. 组织结构 2. 技术 ...
- 懒松鼠Flink-Boot(Flink+Spring):一款将Flink与Spring生态完美融合的脚手架工程
目录 你可能面临如下苦恼: 接口缓存 重试机制 Bean校验 等等...... 它为流计算开发工程师解决了 有了它你的代码就像这样子: 仓库地址:懒松鼠Flink-Boot 1. 组织结构 2. 技术 ...
随机推荐
- Mac_mysql_密码重置
1 通过Mac 的设置 stop mysql 2 跳过权限认证 // 进入数据库指令文件 cd /usr/local/mysql/bin // 跳过权限认证 sudo ./mysqld_safe -- ...
- 优化器Optimal
未完成!!!!!! 神经网络的训练主要是通过优化损失函数来更新参数,而面对庞大数量的参数的更新,优化函数的设计就显得尤为重要,下面介绍一下几种常用的优化器及其演变过程: [先说明一下要用到符号的含义] ...
- Java开发学习(三十四)----Maven私服(二)本地仓库访问私服配置与私服资源上传下载
一.本地仓库访问私服配置 我们通过IDEA将开发的模块上传到私服,中间是要经过本地Maven的 本地Maven需要知道私服的访问地址以及私服访问的用户名和密码 私服中的仓库很多,Maven最终要把资源 ...
- 在UniApp的H5项目中,生成二维码和扫描二维码的操作处理
在我们基于UniApp的H5项目中,需要生成一些二维码进行展示,另外也需要让用户可以扫码进行一定的快捷操作,本篇随笔介绍一下二维码的生成处理和基于H5的扫码进行操作.二维码的生成,使用了JS文件wea ...
- 第六章:Django 综合篇 - 11:分页 Paginator
分页功能是几乎所有的网站上都需要提供的功能,当你要展示的条目比较多时,必须进行分页,不但能减小数据库读取数据压力,也有利于用户浏览. Django又很贴心的为我们提供了一个Paginator分页工具, ...
- kvm使用桥接的方法
什么是桥接 桥接就是把物理机的网卡模拟成交换机,虚拟机的网卡直接连在虚拟的网桥即交换机上.这样kvm虚拟机分配的IP地址,就应该和物理机在同一网段,可以对外进行服务. 在KVM下运行的VM默认的网卡采 ...
- Prometheus 通过 consul 分布式集群实现自动服务发现
转载自:https://cloud.tencent.com/developer/article/1611091 1.Consul 介绍 Consul 是基于 GO 语言开发的开源工具,主要面向分布式, ...
- day03-MySQL基础知识02
MySQL基础知识02 4.CRUD 数据库CRUD语句:增(create).删(delete).改(update).查(Retrieve) Insert 语句 (添加数据) Update 语句(更新 ...
- HDU2196 Computer (树形DP-换根)
dp[u][0]表示u向下走的最大距离: dp[u][1]表示u向下走的次大距离: dp[u][2]表示u向上走的最大距离: 最后的答案就是每个点的max(dp[u][0],dp[u][2]); 求解 ...
- 使用docker-compose安装Prometheus
Prometheus监控 一. 总览 主要组件: Prometheus server: 用于收集和存储时间序列数据 exporter: 客户端生成监控指标 Alertmanager: 处理警报 Gra ...