4 年 46 个版本,一文读懂 Spring Cloud 发展历史

作者 | 方剑

责编 | 唐小引

头图 | CSDN 下载自东方 IC

出品 | CSDN(ID:CSDNnews)

Spring Cloud 自 2016 年 1 月发布第一个 Angel.SR5 版本,到目前 2020 年 3 月发布 Hoxton.SR3 版本,已经历经了 4 年时间。这 4 年时间里,Spring Cloud 一共发布了 46 个版本,支持的组件数从 5 个增加到 21 个。Spring Cloud 在 2019 年 12 月对外宣布后续 RoadMap:

  • 下一个版本 Ilford 版本是一个大版本。这个版本基于 Spring Framework 5.3 & Spring Boot 2.4,会在 2020 Q4 左右发布;

  • Ilford 版本会删除处于维护模式的项目。目前处于维护模式的 Netflix 大部分项目都会被删除(spring-cloud-netflix Github 项目已经删除了这些维护模式的项目);

  • 简化 Spring Cloud 发布列车。后续 IaasS 厂商对应的 Spring Cloud 项目会移出 Spring Cloud 组织,各自单独维护(spring-cloud-azure 一直都是单独维护,spring-cloud-alibaba 孵化在 Spring Cloud 组织,毕业后单独维护);

  • API 重构,会带来重大的改变(Spring Cloud Hoxton 版本新增了 Spring Cloud Circuit Breaker 用于统一熔断操作的编程模型和 Spring Cloud LoadBalanacer 用于处理客户端负载均衡并代替 Netflix Ribbon)。

这个 RoadMap 可以说是对 Spring Cloud 有着非常大的变化。

什么是 Spring Cloud?

首先先澄清「Spring Cloud = Spring Cloud Netflix」这个观点是错误的。官方对 Spring Cloud 的定义是提供分布式应用开发的一套共用模式,这个模式也可以理解成一套统一的抽象编程模型,底层的实现可以进行切换,比如可以从 Netflix 切换成 Alibaba,从 Zookeeper 切换成 Consul。

这套共用的模式有哪些呢?(可能比大家想象的要多。大家平时对常用的功能比较关心,实际上 Spring Cloud 整个体系内容非常还是多的。)

  • 服务注册/发现:Service Registry/Discovery。spring-cloud-commons 模块对服务注册/发现模型进行统一;

  • 分布式配置:Configuration Management。spring-core 模块对配置有 Environment 和 PropertySource 抽象,各个配置中心可以添加各自实现的 PropertySource;

  • 服务熔断:Circuit Breaker。spring-cloud-commons 模块对熔断器模式客户端调用模型进行统一(早期有个单独的项目 spring-cloud-circuit-breaker,后来合并到 spring-cloud-commons 模块);

  • 消息总线:Message Bus。spring-cloud-bus 模块定义远程事件,用来连接分布式系统上的各个节点,bus 强依赖 spring-cloud-stream 项目。

  • 分布式消息:Distributed Messaging。spring-cloud-stream 项目对消息编程模型统一;

  • 客户端负载均衡:Client Load Balancing。早期依赖 Netflix Ribbon 项目,目前可选择 spring-cloud-loadbanacer 模块(后续 Netflix Ribbon 不再维护);

  • 服务调用:Service-to-service calls。OpenFeign 提供声明式接口的方式进行服务调用;RestTemplate 提供基于服务名方式的服务调用;

  • 网关:Gateway。早期使用 Netflix Zuul,现在推荐使用 Spring Cloud Gateway;网关总体来说并不算是一个共用的模式,只是一个实现功能的组件;

  • 链路追踪:Tracing。Spring Cloud Sleuth 对 Spring Cloud 各个客户端埋点进行链路追踪,可以跟 Zipkin 整合;

  • 连接器:Spring Cloud Connectors。Connectors 表示跟 IaaS 厂商的连接器,如果本地开发使用本地 Eureka 和 MySQL,部署到云上(Cloud Foundry)这些地址会被自动替换成云上的地址(前期是购买这些服务)。这是 Cloud Foundry 的 Spring Cloud Connectors,当然还有其他 IaaS 厂商的实现比如 IBM、AWS;

  • FaaS:Spring Cloud Function。Spring Cloud 与 Serverless 集成关键的一个项目;

  • 任务调度:Spring Cloud Task 用于任务运行,可以在本地、云端甚至 Kubernetes 上运行;

  • 数据流:Spring Cloud Data Flow 可以配合 Spring Cloud Stream 完成流处理,配合 Spring Cloud Task 完成批处理,使用 Spring Cloud Deployer 进行应用的部署。

当然还有其他没有涉及到的模块比如 Spring Cloud Contract、Spring Cloud Open Service Broker、Spring Cloud Skipper、Spring Cloud Security 大家可以自行翻看资料了解。

这些功能也是 Spring Cloud 这 4 年发展迭代起来的。最早期 Spring Cloud 在统一编程模型上只有服务注册/发现以及配置管理。后续陆续添加了 Spring Cloud Circuit Breaker 统一熔断器编程模型,Spring Cloud Stream/Bus 消息编程模型统一,Spring Cloud OpenFeign 以声明式接口进行服务调用,Spring Cloud LoadBalancer 客户端负载均衡。

Spring Cloud 现状

回顾 Spring Cloud 的发展历史,Spring Cloud 一度泛指 Spring Cloud Netflix,无论是 Spring 的母公司 Pivotal(VMWare) 对应的商业化产品 Cloud Foundry 内部的 Spring Cloud Services(Spring Cloud 商业化服务) 支持 Netflix Eureka,Netflix Hystrix,还是 Pivotal 官网 blog 上与 Netflix 相互背书,或者是 Spring Cloud 服务注册/发现模型借鉴 Netflix Eureka;可见两者关系十分紧密。

随着 Netflix 宣布 Eureka 2.0 不再开发,Hystrix、Ribbon、Archaius 不再维护,Zuul 被 Spring Cloud Gateway 代替。Spring Cloud 也宣布这些模块对应的在 spring-cloud-netflix 项目里的模块也不再维护,并且在 RoadMap 中宣布 Ilford 版本发布的时候删除这些维护模块。Netflix 在 Spring Cloud 历史中会逐渐消失。

不过不用太担心。这 4 年的发展让 Spring Cloud 规范目前的实现者也不单单只有 Netflix 这一套。目前有 Spring Cloud Alibaba、Spring Cloud Consul、Spring Cloud Zookeeper、Spring Cloud Kubernetes,甚至 Spring Cloud 官方也有对应的实现组件比如 Spring Cloud Config 集成了 Git、SVN 或 Database 提供配置服务、Spring Cloud Stream RabbitMQ/Kafka 提供消息抽象的实现者。

这是目前 Spring Cloud 各个实现的总览:

目前非常不建议大家继续使用 Spring Cloud Netflix 这套实现。因为目前 spring-cloud-netflix 项目里的维护项目已经在 Github 上已经被删除。这意味着 Spring Cloud Netflix "删库" 动作已经开始执行了。

Spring Cloud Hoxton 版本介绍

Spring Cloud Hoxton 版本在 2019 年 11 月发布,这是目前 Spring Cloud 最新的大版本。主要的特性包括:

  • 基于 Spring Boot 2.2.1.RELEASE(全局懒加载、性能、CP 构造器……);

  • 全新的熔断编程模型:Spring Cloud Circuit Breaker;

  • 新客户端负载均衡组件:Spring Cloud LoadBalancer;

  • 继续对 Reactive 支持,服务发现支持 ReactiveDiscoveryClient,全新的熔断编程模型支持 ReactiveCircuitBreaker,新客户端负载均衡使用 ReactiveLoadBalancer。

Spring Cloud Circuit Breaker 统一了熔断器编程模型,这是一段使用 Sentinel CircuitBreaker 进行保护的代码:

CircuitBreaker circuitBreaker = factory.create("sentinel");
return circuitBreaker.run(() -> {return restTemplate.getForObject("https://httpbin.org/status/500", String.class);
}, throwable -> {if(throwable instanceof DegradeException) {return "degrade by sentinel";}return "biz/system error: " + throwable.getMessage();
});

run() 方法第一个参数是一个 Supplier,里面可以执行业务逻辑;第二个参数是一个 Function,入参类型是 Throwable,出参类型跟 Supplier 里的泛型一致,表示业务逻辑返回的结果:

public interface CircuitBreaker {default <T> T run(Supplier<T> toRun) {return run(toRun, throwable -> {throw new NoFallbackAvailableException("No fallback available.", throwable);});};<T> T run(Supplier<T> toRun, Function<Throwable, T> fallback)
}

下面是一个 Hystrix CircuitBreaker 进行保护的代码(两者唯一的区别是对于熔断发生后异常处理逻辑不一致):

CircuitBreaker circuitBreaker = factory.create("hystrix");
return circuitBreaker.run(() -> {return restTemplate.getForObject("https://httpbin.org/status/500", String.class);
}, throwable -> {if (throwable instanceof RuntimeException && throwable.getMessage().toLowerCase().contains("open")) {return "degrade by hystrix: " + throwable.getMessage();}return "biz/system error: " + throwable.getMessage();
});

Netflix Ribbon 已经不再维护,新组件 Spring Cloud LoadBalancer 同样可以完成客户端负载均衡:

Spring Cloud LoadBalancer 目前还比较简单,支持的负载均衡策略有限,建议大家暂时还是使用 Ribbon,后续再观察。相信 Spring Cloud LoadBalancer 后续会越来越完善。

Spring Cloud Alibaba

与 Netflix 的“删库”不同,Spring Cloud Alibaba 是阿里中间件团队主导的一个新生项目,正处于高速迭代中。

其次,对于中国用户来说,Spring Cloud Alibaba 还有一个非常特殊的意义:它将曾经红极一时的 Dubbo,以及阿里巴巴的强力消息中间件 RocketMQ 融入 Spring Cloud 体系。还在纠结于如何让这些共存的团队,你们所面临过的各种困难与问题,马上就会迎刃而解。不用再烦恼是不是要扩展 Dubbo 的注册中心,还是自己为 RocketMQ 实现一套的 Spring Cloud Stream 的 Binder 等等问题。

再次,对于 Spring Cloud Alibaba 的上手学习成本很低。如果您已经是 Spring Cloud 的用户,那么恭喜您,在 Spring Cloud Common 的抽象和 Spring Cloud Alibaba 团队的努力下,你会非常容易、甚至不需要改变多少编码模式,就能适应它。

今年 Spring Cloud Alibaba 会继续跟 Spring Cloud 加强合作。目前 Spring Cloud Alibaba 官网在 Spring 官网已经上线,且对应的 Spring Cloud Circuit Breaker Sentinel、Spring Cloud Stream RocketMQ Binder 模块也在 Spring Cloud Circuit Breaker 和 Spring Cloud Stream 项目主页被推荐使用。

最近 Spring Cloud Alibaba 也已经在 Spring Initializr 上线:

但是,生成的工程中骨架中,只有组件坐标信息,缺少对应的使用方法和 demo 代码;于是,开发者还是需要去寻找相关使用教程,或者样例代码;如果找的不对,或者是版本不匹匹配,还需要花费不少时间去排查和解决问题;这些问题都在无形中增加用户的工作量。

我们将对软件工程的抽象层次自上而下进行切分,会得到如下的几个层级:行业、解决方案、应用、功能、组件;明显的,start.spring.io 目前只能提供组件级别的支持。再将组件这层展开,会发现这样一个生命周期:组件引入、组件配置、功能开发、线上运维。start.spring.io 也只实现了“组件引入”这一功能。

我们的目标是“让阿里云成为广大 java 开发者最好用的云”。要实现这个目标,是否可以再向前走几步,在解决“组件引入”问题的基础上,将组件的典型使用方法、样例代码、使用说明也加入到工程中呢?基于这种思考,我们上线了自己的 bootstrap 站点:start.aliyun.com。

当然,本着不重复造轮子的原则,我们不再构建一套工程生成底层框架,而是使用 Spring Initializr 来实现这部分功能。在此之上专注于增加新特性,实现服务广大开发者的目标。

在 start.aliyun.com 中,我们为广大开发者带来了如下便利特性:

  • 为每个组件提供了单独的 DemoCode 和对应的配置样例(本次已发布);

  • 工程内置说明,减少用户查找文档的困难(部分实现);

  • 开发者只需要做减法,而非加法的使用方式(部分实现);

  • 提供多组件集成的解决方案(开发中);

  • 定期跟进 start.spring.io 的更新,方便大家使用到 spring 的最新功能。

未来,我们还需要在助力开发者这条路上继续发力,不仅仅是做好组件集成的工作,还要需要继续向上支持,提供更多功能、服务、应用层级的快速构建能力。

作者简介:方剑,Spring Cloud Alibaba PMC,阿里巴巴云原生应用平台高级开发工程师,目前主要负责 Spring Cloud Alibaba 开源相关工作。平时关注分布式系统、高可用、Spring 生态等相关技术。

同时,欢迎所有开发者扫描下方二维码填写《开发者与AI大调研》,只需2分钟,便可收获价值299元的「AI开发者万人大会」在线直播门票!

推荐阅读:

  • 从未如此简单:10分钟带你逆袭Kafka!

  • 大麦云原生边缘计算探索,让观众剧院看戏也能实现个性化

  • 华为集齐 AI 龙珠,“召唤神龙”为期不远

  • 互联网之父确诊新冠,一代传奇:任谷歌副总裁、NASA 访问科学家

  • 京东商城背后的AI技术能力揭秘 - 基于关键词自动生成摘要

  • 韩国新法案提出禁止加密资产抵押借贷,DeFi平台或遭禁

真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让开发部署提速 8 倍,我参与贡献这款 IDE 插件的全过程

如何像参与开源那样&#xff0c;去参与一款 IDE 插件的设计&#xff1f; 作为一款 IDE 插件的使用者&#xff0c;我是否能决定下一个版本的功能&#xff1f; 自从产品经理银时小伙和他的开发小哥们在去年12月发布 Cloud Toolkit&#xff08;一款 IDE 插件&#xff09;以来&am…

这难道是原子、比特and供应链的新内涵?京东如是说……

本文为CSDN博主「L-JingJing」的原创文章 原文链接&#xff1a;https://blog.csdn.net/sch881226/article/details/105301572 从遍览采茶风光到感受入口醇香&#xff0c;如今我们真的可以做到高效追溯每一片茶叶的“记忆”了吗&#xff1f;答案显然是肯定的&#xff0c;据了解…

干货!看云原生时代阿里云的四个“最”

云原生已经成为 IT 领域最热的词之一。到底有多火&#xff0c;大家感受一下&#xff1a; 2015 年在旧金山召开的首届 KubeCon 只有 200 余参会者&#xff0c;而今年第二次在中国举办的KubeCon迎来了3000现场观众&#xff0c;遍布全球的线上关注开者则更是不计其数。Gartner最近…

深入解读 Knative Eventing 0.7 版本新特性

前言 Knative Eventing 0.7 版本已经于 6 月 26 号正式发布。本次发布主要围绕重构 Channel 特性展开。本篇文章重点解读了这些特性&#xff0c;并且以此展望一下 Knative Eventing 后续版本的发展。 新特性 重构 Channel 作为 Eventing v0.7 版本最大的特性&#xff0c; 重…

Java-异常01 Error和Exception

异常 捕获异常 https://www.bilibili.com/video/BV12J41137hu?p77&spm_id_frompageDriver

OpenKruise - 云原生应用自动化引擎正式开源

在本次 KubeCon 上&#xff0c;阿里云将为全球用户分享阿里巴巴超大规模云原生落地实践、云原生前沿技术与应用包括OpenKruise 开源项目、开放云原生应用中心&#xff08;Cloud Native App Hub&#xff09;&#xff0c;同时将重磅发布边缘容器、云原生应用管理与交付体系等产品…

过去15年间,到底是什么真正推动了云计算的革命?

来源 | Ohad Maislish译者 | 孙薇 责编 | 徐威龙封图| CSDN下载于视觉中国虚拟机的兴起我还记得&#xff0c;我第一次听说虚拟机是在2002年&#xff0c;我们需要一种能够在Windows OS上运行Linux的方法。当头一次看到在VMware Workstation上运行的虚拟机时&#xff0c;我非常震…

支付宝的商业与技术创新双轮驱动 创造数字时代普惠金融“奇迹”

2019年6月28日&#xff0c;在中国国际软件博览会上&#xff0c;蚂蚁金服金融科技产品技术总监杨冰发表主题演讲&#xff0c;分享了蚂蚁金服在过去的十多年里&#xff0c;是如何通过商业创新与技术创新的双轮驱动&#xff0c;创造出数字时代的普惠金融“奇迹”。 蚂蚁金服金融科…

Java-异常02 捕获和抛出异常

ArithmeticException 算术异常 public class Test {public static void main(String[] args) {int a 1;int b 0;try { // try监控区域System.out.println(a/b);} catch (ArithmeticException e){System.out.println("程序出现异常&#xff0c;变量B不能为0");} fi…

基于Tablestore Tunnel的数据复制实战

前言 数据复制主要指通过互联的网络在多台机器上保存相同数据的副本&#xff0c;通过数据复制方案&#xff0c;人们通常希望达到以下目的&#xff1a;1&#xff09;使数据在地理位置上更接近用户&#xff0c;进而降低访问延迟&#xff1b;2&#xff09;当部分组件出现故障时&a…

今天,我要教妹子学会Spring:Aware、异步编程、计划任务

来源 | 沉默王二教妹子学 Spring&#xff0c;没见过这么放肆的标题吧&#xff1f;作者我有一个漂亮如花的妹妹&#xff08;见封面图&#xff0c;别问我怎么又变了&#xff1f;还不能一天做个梦了&#xff1f;&#xff09;&#xff0c;她叫什么呢&#xff1f;我想聪明的读者能猜…

Java-异常03 自定义异常

// 自定义的异常类 public class MyException extends Exception{// 传递数字 > 10private int detail;public MyException(int a) {this.detail a;}// toString: 异常的打印信息Overridepublic String toString() {return "MyException{" detail };} }public …

SLS机器学习最佳实战:批量时序异常检测

0.文章系列链接 SLS机器学习介绍&#xff08;01&#xff09;&#xff1a;时序统计建模SLS机器学习介绍&#xff08;02&#xff09;&#xff1a;时序聚类建模SLS机器学习介绍&#xff08;03&#xff09;&#xff1a;时序异常检测建模SLS机器学习介绍&#xff08;04&#xff09;…

一张900w的数据表,怎么把原先要花费17s执行的SQL优化到300ms?

来源 | 程序员乔戈里 封图| CSDN下载于视觉中国有一张财务流水表&#xff0c;未分库分表&#xff0c;目前的数据量为9555695&#xff0c;分页查询使用到了limit&#xff0c;优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: 107 ms)&#xff0c;按照下文的方…

浅析基于 Serverless 的前后端一体化框架

概述 Serverless 是一种“无服务器架构”模式&#xff0c;它无需关心程序运行环境、资源及数量&#xff0c;只需要将精力聚焦到业务逻辑上的技术。基于 Serverless 开发 web 应用&#xff0c;架构师总是试图把传统的解决方案移植到 Serverless 上&#xff0c;虽然可以做到既拥…

Java-总结

常用类 集合框架 IO流 多线程 网络编程 GUI 注解与反射 https://www.bilibili.com/video/BV12J41137hu?p80

一文告诉你,如何在 Kubernetes 的容器引擎中运行 KVM 和 VMware VM!

作者 | Gilson Melo译者 | 天道酬勤 责编 | 徐威龙封图| CSDN下载于视觉中国随着微服务的出现&#xff0c;人们通常会问&#xff1a;“是否有可能通过Kubernetes上的微服务在基于内核的虚拟机&#xff08;KVM&#xff09;或VMware 中运行我的旧虚拟机&#xff0c;还是需要将它们…

性能压测工具选型对比

本文是《Performance Test Together》&#xff08;简称PTT&#xff09;系列专题分享的第二期&#xff0c;该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解&#xff0c;以帮助大家构建完整的性能压测的理论体系&…

adb-基础命令

查看连接 adb devices --查看连接的手机安装APP adb install -r apk在电脑路径 -- 安装APP adb install -r 替换已存在的应用程序&#xff0c;也就是说强制安装 adb install -g 为应用程序授予所有运行时的权限 -l 锁定该应用程序 -r 替换已存在的应用程序&…

大数据架构如何做到流批一体?

阿里妹导读&#xff1a;大数据与现有的科技手段结合&#xff0c;对大多数产业而言都能产生巨大的经济及社会价值。这也是当下许多企业&#xff0c;在大数据上深耕的原因。大数据分析场景需要解决哪些技术挑战&#xff1f;目前&#xff0c;有哪些主流大数据架构模式及其发展&…