Spring Cloud 微服务项目更新升级到版本2020.0.0以后

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,此处并未列出):

  1. spring-cloud-netflix-archaius
  2. spring-cloud-netflix-hystrix-contract
  3. spring-cloud-netflix-hystrix-dashboard
  4. spring-cloud-netflix-hystrix-stream
  5. spring-cloud-netflix-hystrix
  6. spring-cloud-netflix-ribbon
  7. spring-cloud-netflix-turbine-stream
  8. spring-cloud-netflix-turbine
  9. 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上下文,有两种办法可以实现:

  1. 设置值spring.cloud.bootstrap.enabled=true或者 spring.config.use-legacy-processing=true即可。注意:这些个属性值必须确保其能放进环境里才能生效。比如靠谱的方式是:系统属性、环境变量、命令行等
  2. 引入一个Jar:org.springframework.cloud:spring-cloud-starter-bootstrap,然后什么都不用做了
    1. 说明:这个jar里面有且仅有一个Marker类,作用你懂的,此处不做过多解释

说明:手动开启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   有状态集群
以上的比较并不充分体现两者的差异,也不完全准确,仅供参考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章