Spring Cloud 微服务项目更新升级到版本2020.0.0以后
与Spring Boot版本对应关系
Spring Boot的出现和流行大大缓解了上述些情况,但使用起Spring Cloud时它和Spring Boot的版本对应关系依旧是需要特别关注的。为此我帮你总结出了这个表格:https://my.oschina.net/zengfr
Release Train | 发布时间 | Spring Boot版本 | SC Commons版本 |
---|---|---|---|
2020.0.x | 2020-12 | 2.4.x | 3.0.0 |
Hoxton | 2019-07 | 2.2.x, 2.3.x (从SR5起) | 2.2.x |
Greenwich | 2018-11 | 2.1.x | 2.1.x |
Finchley | 2017-10 | 2.0.x | 2.0.x |
Edgware | 2017-08 | 1.5.x | 1.3.x |
Dalston | 2017-05 | 1.5.x | 1.2.x |
Brixton | 2016-09 | 1.3.x | 1.1.x |
Angel | 2016-05 | 1.2.x | 1.0.x |
阻断式升级(不向下兼容)
差不多在去年(2019年)的这个时候,Spring Cloud在其Roadmap(之前文章有介绍过)里就宣布将要终结的一些库/版本,其中最重要的就是指Spring Cloud Netflix项目进入维护模式,然后计划在2020年完全移除。
Spring Cloud做出这样的决定其实也是“被迫的”。我们知道Spring Cloud一直以来把Netflix OSS
套件作为其官方默认的一站式解决方案,那时的Netflix OSS套件恨不得可以跟Spring Cloud划等号。奈何呀,Netflix公司在2018年前后宣布其核心组件Hystrix、Ribbon、Zuul、Archaius等均进入维护状态。
虽然有Zuul 2.x,Archaius 2.x,但它们均不能向下兼容,无法平滑升级,因此几乎等于无法使用
从2018年至今处于维护状态的模块有(包括其对应的starter,此处并未列出):
- spring-cloud-netflix-archaius
- spring-cloud-netflix-hystrix-contract
- spring-cloud-netflix-hystrix-dashboard
- spring-cloud-netflix-hystrix-stream
- spring-cloud-netflix-hystrix
- spring-cloud-netflix-ribbon
- spring-cloud-netflix-turbine-stream
- spring-cloud-netflix-turbine
- spring-cloud-netflix-zuul
Netflix组件替代方案
Spring Cloud既然把Netflix OSS套件大刀阔斧的砍掉了,那总归得有替代方案吧。那是必然的,Spring Cloud团队给我们推荐了用于替代的产品:
Netflix | 推荐替代品 | 说明 |
---|---|---|
Hystrix | Resilience4j | Hystrix自己也推荐你使用它代替自己 |
Hystrix Dashboard / Turbine | Micrometer + Monitoring System | 说白了,监控这件事交给更专业的组件去做 |
Ribbon | Spring Cloud Loadbalancer | 忍不住了,Spring终究亲自出手 |
Zuul 1 | Spring Cloud Gateway | 忍不住了,Spring终究亲自出手 |
Archaius 1 | Spring Boot外部化配置 + Spring Cloud配置 | 比Netflix实现的更好、更强大 |
spring-cloud-netflix-dependencies
没有消失哦,它依旧存在,版本号跟随大部队升级为3.0.x版本- 旧版本的
spring-cloud-netflix-dependencies
管理着Netflix所有组件,包括Hystrix、Ribbon、Zuul、Eureka等。而自2020.0版本起,它有且只管理Eureka(包括Server和Client)
Bootstrap上下文默认不再启动
知晓原理的同学知道,Spring Cloud容器是靠Bootstrap Context
引导上下文来启动的,对应的类是BootstrapApplicationListener
。
这在2020.0版本发生了改变,新版本的Spring Cloud不再依赖于此上下文而启动。因此默认情况下,将不再启动Bootstrap上下文。代码层面的改变发生在这里:
BootstrapApplicationListener: @Override public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) { ConfigurableEnvironment environment = event.getEnvironment(); // 在方法开头加了这么个判断 if (!bootstrapEnabled(environment) && !useLegacyProcessing(environment)) { return; } ... } PropertyUtils: // BOOTSTRAP_ENABLED_PROPERTY = spring.cloud.bootstrap.enabled public static boolean bootstrapEnabled(Environment environment) { return environment.getProperty(BOOTSTRAP_ENABLED_PROPERTY, Boolean.class, false) || MARKER_CLASS_EXISTS; } // USE_LEGACY_PROCESSING_PROPERTY = spring.config.use-legacy-processing public static boolean useLegacyProcessing(Environment environment) { return environment.getProperty(USE_LEGACY_PROCESSING_PROPERTY, Boolean.class, false); }
开启方式
若你需要开启Bootstrap上下文,有两种办法可以实现:
- 设置值
spring.cloud.bootstrap.enabled=true
或者spring.config.use-legacy-processing=true
即可。注意:这些个属性值必须确保其能放进环境里才能生效。比如靠谱的方式是:系统属性、环境变量、命令行等 - 引入一个Jar:
org.springframework.cloud:spring-cloud-starter-bootstrap
,然后什么都不用做了- 说明:这个jar里面有且仅有一个
Marker
类,作用你懂的,此处不做过多解释
- 说明:这个jar里面有且仅有一个
说明:手动开启Bootstrap上下文,证明你fallback到老的方式去加载SC,那么一切请按照老方式做即可
3、全新的配置方式
得益于Spring Boot 2.4.x支持全新的配置文件书写方式,自此可以使用spring.config.import
俩导入其它组建的配置。如:
- spring.config.import=configserver:xxx
- spring.config.import=zookeeper:
- ...
这么做更具模块化,更符合云原生环境的要求。
最新 Maven 依赖管理方式:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
...
</dependencies>
https://github.com/spring-cloud/spring-cloud-release/wiki/Spring-Cloud-2020.0-Release-Notes
https://docs.spring.io/spring-cloud/docs/current/reference/html/
k8s
究竟是何方神圣?下面我就拿 K8S
以及 Istio
的概念和 Spring Cloud
对比一下:
k8s概念 | spring cloud概念 | 功能 |
---|---|---|
pod | container | 部署的基本单位 |
service | eureka | 服务注册与发现 |
ingress | zuul | 网关路由、反向代理 |
dns server | feign | 负载均衡 |
config map | config | 配置管理 |
istio envoy | hystrix | 熔断降级 |
istio envoy | seluth & zipkin | 链路追踪 |
deployment | 灾备扩容 | |
StatefullSet | 有状态集群 |
以上的比较并不充分体现两者的差异,也不完全准确,仅供参考。