一、背景介绍
在微服务架构日益盛行的今天,Spring Cloud 凭借其丰富的功能集、高度的可集成性和对微服务架构的天然支持,自推出以来,就受到软件开发者的热烈追棒和广泛应用。
使用过 Spring Cloud 的同学应该深有感触。Spring Cloud 是一个功能强大的微服务框架,它提供了一套完整的分布式系统解决方案,比如配置管理、服务治理、熔断机制、智能路由、微代理、控制总线等多种功能,可以帮助开发者快速构建和管理微服务应用。无论是大型企业还是初创公司,都可以以非常低的成本搭建一套高效、分布式、容错的云平台。
当项目引入 Spring Cloud 技术之后,一个接口的请求流程可以用如下图来简要描述。
从图中可以看出,与单体应用相比,微服务的接口调用链路和服务部署方式要复杂许多。
二、技术体系
Spring Cloud 的核心技术体系,可以用如下图来简要概括。
在介绍 Spring Cloud 核心组件之前,我们先简单的介绍一下 Netflix 这家公司,因为上图提到的很多核心组件都来自于这家公司。
Netflix 是一家技术实力雄厚的美国流媒体娱乐公司,主要通过互联网向全球观众提供电影、电视剧、纪录片、动画片等在线视频服务,类似于国内的腾讯视频,全球范围内拥有超过 2 亿的订阅用户。
如果要满足这么庞大的用户群体在线访问网站视频内容,常规的网站架构肯定是无法承载的,为了更好的满足海量用户的在线视频服务,Netflix 在微服务架构方面有着深入的研究和实践,并开源了一系列组件。如上文提到的 Eureka、Ribbon、Hystrix、Feign、Zuul 等组件,就是 Netflix OSS 开源项目的一部分。由于其优秀的微服务架构实践和服务特性,Spring Cloud 将其集成到自己的生态圈,并组成微服务的核心。
2.1、第一代 Spring Cloud
初代的 Spring Cloud 核心成员,可以用如下表来概括。
组件 | 来源 | 说明 |
spring-cloud-eureka | 来源于Netflix Eureka | 服务注册中心组件 |
spring-cloud-ribbon | 来源于Netflix Ribbon | 服务负载均衡组件 |
Spring-cloud-hystrix | 来源于Netflix Hystrix | 服务熔断器组件 |
Spring-cloud-feign | 来源于Netflix Feign | 服务远程调用组件 |
Spring-cloud-zuul | 来源于Netflix Zuul | 服务网关组件 |
Spring-cloud-config | 自研 | 服务配置中心组件 |
Spring-cloud-bus | 自研 | 服务消息总线 |
Spring-cloud-sleuth | 自研 | 服务日志跟踪 |
Spring-cloud-zikpin | 来自第三方 | 服务日志全链路监控 |
在此,只列举了一些常用的核心组件,实际上 Spring Cloud 生态圈的核心组件非常的多,比如 Spring Cloud Security、Spring Cloud Data Flow、Spring Cloud Stream、Spring Cloud Task、Spring Cloud Connectors、Spring Cloud CLI 等等,每个组件都有它独特的技能,再次就不一一介绍了,有兴趣的朋友可以访问 Spring Cloud 的官网介绍。
2.1、第二代 Spring Cloud
在 2018 年,由于 Netflix 对 Eureka,Hystrix 等组件不再继续开发和维护了, 因此 Spring Cloud 不断的引入了其它的开源组件,以此来壮大自己的生态圈,同时也陆续推出了自己的一些组件。
Spring Cloud 第一代和第二代的核心组件差异汇总,如下表所示。
核心组件 | 第一代 Spring Cloud | 第二代 Spring Cloud |
服务注册中心 | Eureka, Consul | Nacos |
服务负载均衡 | Ribbon | spring-cloud-loadbalancer |
服务熔断器 | Hystrix | Resilience4j,Sentinel |
服务远程调用 | Feign | Spring Cloud OpenFeign,基于 Feign 的升级版 |
服务网关 | Zuul | Spring Cloud Gateway |
配置中心 | Spring Cloud Config | Nacos,Apollo |
服务日志全链路监控 | zipkin | Skywalking |
因为 Zuul 1.x 性能一般,虽然 Netflix 之后也推出了 Zuul 2.x,相比第一代性能也提升了不少,但当时一直跳票(延迟对外开放)。随后 Spring Cloud 官方推出了自研的 Spring Cloud gateway,类似自研的还有 spring-cloud-loadbalancer,spring-cloud-r4j,Spring-cloud-openfeign 等,相比初代组件,性能和维护方面都有明显的提升。
三、版本选择
如果你翻看过 Spring Cloud 项目源码,你会发现它其实是一个拥有诸多子项目的大型综合项目,同时每个子项目也都维护着自己的发布版本号。这就意味着,每一个 Spring Cloud 的版本都会包含不同的子项目版本。
为了更好的管理子项目版本号,避免主版本名与子项目的发布版本号出现混乱。Spring Cloud 没有采用版本号的方式来命令,而是通过名称的方式来命令。
通常情况下,Spring Cloud 对外发行的版本号,采用的是伦敦地铁站的名字来命令,根据字母表的顺序来进行排序,比如:第一个 Release 版本:Angel,第二个 Release 版本:Brixton,以此类推……
每个大版本也有多个小版本号,比如Angel.SR5
、Brixton.SR6
,其中SR5
、SR6
就是小版本号。
小版本号的名称命令也有讲究,当一个大版本的 Spring Cloud 项目发布内容积累到临界点或者一个严重 bug 解决可用后,就会发布一个“service releases”版本,简称SRX
版本,其中X
是一个递增数字。
Spring Cloud 的版本号与每个子项目的版本号之间的关系,可以用如下表简要概括。
组件 | Angel.SR6 | Brixton.SR5 | 依次类推 |
spring-cloud-aws | 1.0.4.RELEASE | 1.1.1.RELEASE | ... |
spring-cloud-bus | 1.0.3.RELEASE | 1.1.1.RELEASE | ... |
spring-cloud-cli | 1.0.6.RELEASE | 1.1.5.RELEASE | ... |
spring-cloud-commons | 1.0.5.RELEASE | 1.1.1.RELEASE | ... |
spring-cloud-config | 1.0.4.RELEASE | 1.1.3.RELEASE | ... |
spring-cloud-netflix | 1.0.7.RELEASE | 1.1.5.RELEASE | ... |
spring-cloud-security | 1.0.3.RELEASE | 1.1.2.RELEASE | ... |
spring-cloud-starters | 1.0.6.RELEASE | ... | |
spring-cloud-cloudfoundry | 1.0.0.RELEASE | ... | |
spring-cloud-cluster | 1.0.1.RELEASE | ... | |
spring-cloud-consul | 1.0.2.RELEASE | ... | |
spring-cloud-sleuth | 1.0.6.RELEASE | ... | |
spring-cloud-stream | 1.0.2.RELEASE | ... | |
spring-cloud-zookeeper | 1.0.2.RELEASE | ... | |
spring-boot | 1.2.8.RELEASE | 1.3.7.RELEASE | ... |
spring-cloud-task | 1.0.2.RELEASE | ... |
Spring Cloud 的发展势头非常迅猛,截止目前,大版本号已经到Leyton
了。尽管如此,对于初学者而言,了解版本号的定义非常重要,避免后续在基于 Spring Cloud 框架来开发的时候走弯路。
由于 Spring Cloud 子项目特别多,尤其是在现有 Spring Boot 基础上集成的时候,很容易因为版本号不同出现各种不兼容现象,以下是 Spring Cloud 与 Spring Boot 版本匹配关系。
Spring Cloud | Spring Boot |
Angel | 兼容Spring Boot 1.2.x |
Brixton | 兼容Spring Boot 1.3.x,Spring Boot 1.4.x |
Camden | 兼容Spring Boot 1.4.x,Spring Boot 1.5.x |
Dalston | 兼容Spring Boot 1.5.x |
Edgware | 兼容Spring Boot 1.5.x |
Finchley | 兼容Spring Boot 2.0.x |
Greenwich | 兼容Spring Boot 2.1.x |
Hoxton | 兼容Spring Boot 2.2.x,Spring Boot 2.3.x |
Ilford | 兼容Spring Boot 2.4.x,Spring Boot 2.5.x |
Jubilee | 兼容Spring Boot 2.6.x,Spring Boot 2.7.x |
Kilburn | 兼容Spring Boot 3.0.x,Spring Boot 3.1.x |
Leyton | 兼容Spring Boot 3.2.x,Spring Boot 3.3.x |
在实际的微服务开发过程中,当代码编写一切都是正常的,但是运行时各种出错,大概率应该是版本号的选择上出了问题。推荐结合当前使用的 Spring Boot 版本,采用与 Spring Cloud 匹配的稳定版本号来开发,会省去不少的麻烦。
四、小结
最后总结一下,Spring、Spring Boot、Spring Cloud 这三者之间的关系。
Spring -> Spring Boot -> Spring Cloud
关于 Spring Boot,在之前的技术系列文章中我们有所介绍过, 它是一个基于 Spring 框架实现的应用程序快速开发工具,开发者可以使用它来快速的构建一个可独立运行的 Java 应用程序,开箱即用。
对于 Spring Cloud,它是一个基于 Spring Boot 实现的云应用开发工具,通过它可以快速搭建微服务架构项目,比如配置管理、服务治理、熔断机制、智能路由、微代理、控制总线等多种功能,开发者可以以非常低的成本搭建一套高效、分布式、容错的云平台。
因此可见,Spring Cloud 离不开 Spring Boot,两者属于依赖关系。
在之前的技术系列文章中,我们有详细的介绍过 Spring Boot 相关知识,本期将开启 Spring Cloud 技术系列相关知识介绍。
五、参考
1.https://www.didispace.com/spring-cloud/springcloud-version.html
2.http://www.ityouknow.com/springcloud/2017/05/01/simple-springcloud.html