4 年 46 个版本,一文读懂 Spring Cloud 发展历史
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 整合;
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 生态等相关技术。
☞
☞
点击阅读原文,参与报名!