本文作者:饶子豪-SpringCloudAlibabaCommitter,阿里云智能开发工程师。01Spring生态系统介绍根据JVMEcoSystemReport2021最新数据,Spring框架用户占比超过80%,SpringMVC占比1/3。这个数据也说明Spring生态的相关组件在Java生态中依然占据着绝对的领先地位。国内应用最广泛的Spring生态主要包括SpringFramework、SpringBoot和SpringCloud。Framework起源于2002年,凭借依赖注入和面向切面编程的能力,颠覆了传统厚重的EJB企业级应用框架,逐渐成为当今Java企业级应用开发的主流框架。虽然Spring框架给Java开发带来了诸多优势,但是在使用过程中,人们也逐渐意识到了它配置繁琐等缺陷。2014年,SpringBoot被Spring社区开源。通过一系列习惯性的默认配置,大大简化了SpringFramework在使用中常被诟病的繁琐配置,让SpringFramework不断焕发出勃勃生机。2015年6月,针对分布式微服务应用开发中的常见问题,Spring社区推出了包括分布式配置注册中心、分布式消息传递、限流降级等在内的SpringCloud解决方案,为向微服务的转型起到了重大推动作用。除了以上组件,今天的Spring是一个庞大的生态系统,由七大核心领域的22个核心项目组成:Web应用、微服务、响应式编程、云计算、函数计算、事件驱动和批处理任务。02SpringCloud阿里巴巴目前在Spring生态中使用开源RocketMQ主要有两种方式:第一种是使用RocketMQSpring提供的依赖和注解;另一种是基于SpringCloudAlibaba提供的SpringCloudStream方法。得益于过去十年处理淘宝电商高并发大流量业务积累的技术经验,阿里巴巴积累了包括限流降级、分布式注册与配置中心、分布式消息传递在内的一整套服务、分布式事务等完整的微服务解决方案。2015年6月,SpringCloud第一个正式版发布后,迅速成为微服务技术圈的热点。随后一两年的发展证明,以SpringCloudNetflix为代表的一套基于SpringCloud规范的微服务解决方案,对中小企业的技术发展产生了巨大的影响,加速了企业的转型。大量中小企业从单体应用转向微服务。转换节奏。受到SpringCloudNetflix项目的启发,考虑到SpringCloud生态设计理念虽然很好,但是相关的微服务解决方案还不是很成熟,能力上还有一些欠缺,而恰好阿里已经有一套完整的解决方案。因此,最初参加SpringCloudAlibaba的几位同事一拍即合。2018年7月,他们通过SpringCloudAlibaba,将阿里巴巴经过十余年技术打磨的一整套微服务解决方案贡献给了SpringCloud生态。如上图所示,通过SpringCloudAlibaba支持阿里巴巴提供的一些差异化的存储和监控能力,很多外部用户可以非常方便、低成本地构建微服务应用。03SpringCloudAlibaba与SpringCloud的生态关系上图中圆圈内较深的橙色部分表示SpringCloud,它是一套完整的基于SpringBoot的微服务解决方案标准,由一系列相关的子项目组成。包括OpenFeign和RestTemplate定义的分布式RPC调用能力,SpringCloudComments和SpringCloudConfig子项目抽象出的统一注册和配置中心能力,SpringCloudStream子项目定义的分布式消息集成标准,SpringCloudCircuitBreak子项目定义的统一限流降级能力等SpringCloudAlibaba基于微服务的标准,提供了阿里巴巴内部微服务解决方案的具体实现。不仅将Nacos、RocketMQ、Sentinel等微服务解决方案的实现引入了SpringCloud生态,还集成了部分阿里云平台服务,如短信服务、SMS、分布式任务调度、Schedulex等。SpringCloudNetflex和SpringCloudAlibaba与SpringCloud有着相同的关系,都是基于SpringCloud定义的标准的具体实现,一套微服务。目前SpringCloud生态已经非常庞大和繁荣。除了SpringCloudAlibaba和SpringCloudNetflix,ZooKeeper和Consul以SpringCloudZooKeeper和SpringCloudConsul项目的形式为SpringCloud社区做出了贡献,作为注册和配置中心解决方案的实现。.另外,SpringCloudKubernetes也是云原生时代非常有意思的一个子项目,它基于Kubernetes中的服务理念,使得SpringCloud服务可以直接调用构建在Kubernetes之上的微服务。从上图可以看出,SpringCloudAlibaba和SpringCloudNetflix相得益彰,在SpringCloud的生态完整中起到了重要的作用。此外,该方案的组件在国内用户中的受欢迎程度已经超过了SpringCloud官方默认提供的部分组件,如Nacos、RocketMQ,逐渐成为国内分布式注册配置中心和分布式的事实标准。消息,并广泛应用于大量中小型企业的生产环境中。除了SpringCloudAlibaba还喜欢SpringCloudnetflex。此外,Zookeeper和Consul分别以SpringCloudZookeeper和SpringCloudConsul的形式作为注册和配置中心解决方案的实现为SpringCloud社区做出了贡献。04玩转基于SpringCloudAlibaba的Spring生态中的RocketMQ目前的RocketMQ是阿里巴巴中间件团队于2012年开发并对外开源的第三代分布式消息引擎。其高性能、低时延、抗堆积等特点,稳定支撑了阿里巴巴双十一万亿级数据洪峰业务。2016年,阿里巴巴将RocketMQ项目捐赠给Apache软件基金会。次年,RocketMQ顺利从Apache软件基金会毕业,成为Apache软件基金会的顶级项目。如上图所示,生产环境中的RocketMQ系统由四部分组成:NameServer集群、Broker集群、生产者集群、消费者集群。Broker集群用于存储消息,NameServer集群提供命名服务,帮助消息生产者向特定的Broker集群发送消息,以及订阅来自特定Broker集群的消息。RocketMQ作为支撑淘系电商大促的核心中间件之一,不仅在可靠性和吞吐量上经过考验,而且优势显着。它还提供两种订阅模式,即广播订阅和集群订阅,以及多订阅多种消息发送方式和多种消息类型,包括普通消息、顺序消息、定时消息、延迟消息和事务消息等。这些消息类型可以帮助业务开发者轻松解决特定的业务需求。SpringCloudStream作为SpringCloud定义的分布式消息解决方案,主要由三部分组成:Message、Binder和Bindings。Message定义了统一的消息结构,可以将业务系统中的消息数据通过统一的消息结构传递给具体消息中间件中的Message消息结构。Binder是SpringCloudStream的核心,负责与外部消息的集成。比如与RocketMQ集成需要RocketMQBinder,与Kafka集成需要KafkaBinder。Middleware代表具体的消息中间件,可以是RocketMQ或者Kafka等。在上图中,上半部分是使用SpringCloudStream连接消息中间件的应用。中间的Binder类似于连接器,将应用连接到特定的消息上,从而实现应用与外部消息中间件的解耦。Bindings,由Binder创建,主要负责业务系统与消息中间件的通信,完成消息的发送和接收。Demo演示了两种RocketMQ使用方式的区别。上图为RocketMQSpring项目提供的消息发送API,由RocketMQSpringBoot模块提供。通过Spring相关依赖在业务系统中使用RocketMQ,除了引入RocketMQSpring相关依赖进行一些配置外,还需要通过RocketMQSpring项目提供的API发送消息。接收模块的逻辑类似,但不是API,而是通过RocketMQSpring提供注解。SpringCloudAlibaba基于SpringCloud生态中的SpringCloudStream分布式消息标准运行RocketMQ,实现RocketMQ的部分核心组件。如果一个Spring应用需要通过SpringCloudAlibaba使用RocketMQ,只需要引入SpringCloudAlibaba的模块依赖,然后再引入SpringCloudStream的模块即可。上图是广播消息的生产者连续发送100条消息的代码,消息是通过SpringCloudStream提供的StreamBridgeAPI发送的。消息相关的API不依赖于与具体的消息中间件耦合,而是基于Spring相关的Message对象构造消息。发送消息时,需要进行一些配置,主要是根据Cloud提供的内容来解析配置。上图显示了与消息发送者相关的代码。没有RocketMQ相关的API,只能使用consumer方法从RocketMQ订阅消息,然后通过log.info打印结果。与具体消息的绑定是通过配置文件进行的,不在业务代码中,相关API与具体消息中间件之间没有紧耦合。接下来发送消息,看消费者是否能收到消息。通过RocketMQ相关模块启动NameServer和Broker,启动消息的生产者。上图显示consumer1和consumer2都收到了消息,日志显示消息内容为HelloRocketMQ0到HelloRocketMQ99,共100条消息。综上所述,SpringCloudAlibaba方法的特点是与具体的消息没有绑定关系。业务代码的实现全部基于SpringCloudStream提供的公共API收发消息。优点是代码没有使用RocketMQ相关的类来接收和发送消息,可以很容易地在不同的中间件之间切换。比如从RocketMQ切换到Kafka,只需要将应用中RocketMQ相关的依赖替换成Kafka,然后在不修改业务代码的情况下修改部分配置即可。与RocketMQSpring相比,SpringCloudStream可以将业务系统和具体的消息解耦,使得系统更具扩展性和可维护性,并且可以拥有更长的生命周期。05SpringCloudAlibaba展望经过三年多的发展,SpringCloud一共发布了27个版本,star数达到22.5k,分叉数和用户数分别达到7k和23.7k。项目相关数据。未来,SpringCloudAlibaba社区将从以下两个方面进一步丰富项目能力,推动社区发展。首先,在社区活动方面① 定期举行社区双周例会,讨论过去两周在github上的问题和PR。此外,周会也会组织相关话题的分享,周会信息会同步在SpringCloudAlibaba交流群。② 与中科院、阿里巴巴开源办公室合作举办“开源之夏”、“编程之夏”等活动。活动主要针对在校学生。通过暑假时间,在社区导师的一对一指导下,完成部分功能并贡献给社区,为在校学生接触开源社区提供渠道和更多机会。③ 举办线下或线上聚会,为社区内外的学生提供更多的交流机会。二、SpringCloudAlibaba的发展规划。过去第一阶段的工作是丰富SpringCloud生态,让外部用户轻松拥抱微服务的未来。第二阶段,SpringCloudAlibaba将继续努力让外部用户用好微服务,构建微服务治理和业务高可用相关能力,满足用户在使用微服务过程中的高层次诉求,包括以下三个方面:① 全面支持RocketMQ5.0、Sentinel2.0等中间件,为用户带来更丰富的中间件体验。② 构建SpringCloud生态的微服务治理能力和微服务高可用。③ 构建SpringCloud分布式任务调度等方面的能力。最后,非常欢迎对SpringCloudAlibaba项目感兴趣的同学加入社区,共同参与SpringCloudAlibaba的未来建设。
