KOCA Spring Boot 和 Java 升级说明

Spring Boot 2.5 新特性

支持Java17

Spring Boot 2.5.0 支持 Java 16 了,同时向下兼容 Java 11 和 Java 8

Spring Boot 2.5.5 开始正式支持 Java 17,同时向下兼容 Java 11 和 Java 8

最新版本为2.5.6

支持 Gradle 7

Spring Boot Gradle 插件支持 Gradle 7.0.x,并已针对其进行了测试。

支持 Jetty 10

Spring Boot 2.5 现在支持 Jetty 10 内嵌了,因为 Jetty 10 需要依赖 Java 11,所以现在默认还是保持在 Jetty 9。

支持 HTTP/2 over TCP (h2c)

Spring Boot 2.5 所有内置的容器都可以支持 HTTP/2 over TCP (h2c),而无需进行任何手动定制。

新的数据源初始化机制

1、数据源调整

Spring Boot 2.5 中的某些数据源初始化的方法被重新设计了,下面的数据源参数配置也被废除了:

spring.datasource.*

新的数据源参数配置如下:

spring.sql.init.*

2、Flyway 和 Liquibase 调整

这两个是主流的数据库版本管理工具,使用 spring.flyway.url 和 spring.liquibase.url 定义的时候需要加上 username/ password 进行认证。

早期的版本中,这些参数都是从 spring.datasource 中派生的,用户在自定义数据源的时候会存在问题。

另外,如果使用了自定义数据源和 Liquibase 一起使用,现在会使用 SimpleDriverDataSource 数据源类进行配置,之前的版本使用的是池化数据源,会导致数据源初始化效率低下。

环境变量前缀

Spring Boot 2.5 可以为系统环境变量指定前缀了,这样可以方便我们在同一环境中运行多个不同的 Spring Boot 应用,而不用受重名环境变量冲突。

使用方法如下:

SpringApplication application = new SpringApplication(Javastack.class);

application.setEnvironmentPrefix( “javastack”);

application.run(args);

这样设置一下的话,所有 javastack-* 开头的系统环境变量才会被绑定。

比如:

javastack-id

javastack-name

javastack-age

增强 Docker 映像构建

Spring Boot Maven/ Gradle 插件现在都开始支持:

1)都支持自定义构建包;

2)都支持 Docker 构建包时传递卷数据(volume)绑定;

3)都支持打包可执行的 war 文件到 Docker 映像中;

Layered WARs

Spring Boot Maven 和 Gradle 插件现在可以创建分层的 WAR 了,分层 WAR 与 Spring Boot 2.3 版本中提供的分层 JAR 工作方式类似,为了可以更好的与 Docker 映像一起使用,提升构建速度。

这个我后续再更新一篇吧,想学习接收最新推送,请持续关注微信公众号:Java技术栈,公众号第一时间推送。

相关端点和指标变更

1)现在 /info actuator 端点不再默认开放了,如果使用了 Spring Security 的话,这个端点还需要身份认证才能访问,加强 info 端点的安全性;

2)新增了 /quartz 端点,这个端点提供了 Quartz 作业和触发器相关的的详细数据;

3)为 /startup 端点支持 get 请求,与 post 请求不同的是,get 请求的端点不会释放事件缓冲区,而且事件将继续保留在内存中;

4)为 /actuator/prometheus 端点提供标准 Prometheus 以及 OpenMetrics 响应;

5)为 Spring Data repositories 生成 Micrometer 指标;

6)自动生成 MongoDB 连接池、客户端命令相关指标;Spring Boot 2.5 Dependency upgrade

包版本升级

Upgraded a series of dependent Spring Project version :

  • Spring Data 2021.0
  • Spring HATEOAS 1.3
  • Spring Integration 5.5
  • Spring Kafka 2.7
  • Spring Retry 1.3
  • Spring Security 5.5
  • Spring Session 2021.0

Upgraded a series of dependent third-party dependency Libraries :

  • Kotlin 1.5
  • Groovy 3.0
  • Flyway 7.7
  • Liquibase 4.2
  • Jackson 2.12
  • Kafka 2.7
  • Cassandra Driver 4.10
  • Embedded Mongo 3.0
  • Hibernate Validator 6.2
  • Jersey 2.33
  • Mockito 3.7
  • MongoDB 4.2
  • JUnit Jupiter 5.7
  • Elasticsearch 7.12

Spring Boot 2.4 新特性

支持 Java 15

Spring Boot 2.4.0 支持 Java 15 了,同时向下兼容 Java 11 和 Java 8。

配置改进

1、改进配置文件的处理方式

Spring Boot 2.4 改进了处理 application.properties 和 application.yml 配置文件的方式。更新后的逻辑旨在简化和合理化外部配置的加载方式,但有些参数的组合形式却得到了限制,升级请谨慎。

如果你的应用工程只有一个简单的 application.properties 或 application.yml 文件,则可以进行无缝升级到 Spring Boot 2.4.0。

但是,如果你的配置较为复杂,比如说有指定 profile 的参数,或者有基于 profile 激活的参数,要使用新功能就需要进行一些更改。

更多细节可参考:

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide

如果你想继续使用 Spring Boot 2.3 的配置逻辑,也可以通过在 application.properties 或者 application.yml 配置文件中添加以下参数:

spring.config.use-legacy-processing = true

2、导入配置参数改进

通过配置参数 spring.config.location 和 spring.config.import 来指定或者导入配置文件时,如果配置文件不存在,现在不是只能默默地失败了,可以通过添加 optional: 前缀来标识它是可选的。

比如我们从 /etc/config/application.properties 指定配置文件,如果这个文件不存在,系统就会跳过它。

spring.config.location=optional:/etc/config/application.properties

如果你想将所有指定的配置文件都默认为可选的,可以通过 SpringApplication.setDefaultProperties(…) 来设置

spring.config.on-location-not-found=ignore 这个参数,或者将它设置在系统环境变量中。

3、支持导入配置树

新版本的 spring.config.import 属性还可以用于导入配置树,通过与 Kubernetes 一起使用,配置树是提供键/值对的另一种方法,每一个键值/对都在其自己的文件中声明,文件名是键,文件内容就是值。

另外,从配置树导入的参数默认会带一个换行符。

详细的参考:

https://docs.spring.io/spring-boot/docs/2.4.0/reference/html/spring-boot-features.html#boot-features-external-config-files-configtree

新增启动端点

Spring Boot 2.4.0 添加了一个新的启动端点,用来显示应用启动有关的详细信息,比如可以帮助我们来诊断启动时间比预期更长的 Spring Beans。

这个功能建立在 Spring Framwork 5.3 最近添加的应用程序启动跟踪特性的基础上,感兴趣的可以在 Spring 框架文档中阅读有关该功能的更多信息。

https://docs.spring.io/spring-framework/docs/5.3.x/reference/html/core.html#context-functionality-startup

新增起源链(Origin Chains)

Origin 接口更新了,使用了全新的 getParent() 方法,这样就可以提供完整的参数起源链,以准确显示某一项参数的来源。

比如你在 application.properties 配置文件中使用 spring.config.import 来导入第二个配置文件的参数,从第二个配置文件加载的参数的 Origin 将具有一个指向原始导入声明的父级。

Docker 支持升级

1、镜像发布

Spring Boot Maven 插件的 spring-boot:build-image 指令和 Gradle 插件的 bootBuildImage 任务现在可以直接发布 Docker 镜像到 Docker 注册中心了。

2、授权机制

当使用 Spring Boot 构建时,可以为构建器或者运行镜像使用私有授权的 Docker 私有注册中心,支持用户名/密码认证以及基于 Token 机制认证。

更多详细的配置可以参考对应的插件文档:

Maven:

https://docs.spring.io/spring-boot/docs/2.4.0/maven-plugin/reference/htmlsingle/#build-image-example-publish

Gradle:

https://docs.spring.io/spring-boot/docs/2.4.0/gradle-plugin/reference/htmlsingle/#build-image-example-publish

移除了 JUnit 5’s Vintage 引擎

Spring Boot 2.4.0 从 spring-boot-starter-test 中移除了 JUnit 5 Vintage 引擎,JUnit 5 可以通过 vintage 引擎来运行 JUnit 4 编写的测试用例,说白了就是兼容 JUnit 4 呗。

如果你不想迁移测试用例到 JUnit 5 而继续使用 JUnit 4,添加以下 Maven 依赖即可:

<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

以下为对应的 Gradle 配置:

testImplementation("org.junit.vintage:junit-vintage-engine") {
    exclude group: "org.hamcrest", module: "hamcrest-core"
}

包版本升级

Spring Boot 2.4.0 升级了一些主要的 Spring 项目:

  • Spring AMQP 2.3
  • Spring Batch 4.3
  • Spring Data 2020.0
  • Spring Framework 5.3
  • Spring HATEOAS 1.2
  • Spring Integration 5.4
  • Spring Kafka 2.6
  • Spring Retry 1.3
  • Spring Security 5.4
  • Spring Session 2020.0

另外,还尽可能升级了一些第三方库到最新稳定版本:

  • Artemis 2.13
  • AssertJ 3.18
  • Cassandra Driver 4.7
  • Elasticsearch 7.9
  • Flyway 7
  • Jersey 2.31
  • JUnit 5.7
  • Liquibase 3.10
  • Lettuce 6.0
  • Micrometer 1.6
  • Mockito 3.4
  • MongoDB 4.1
  • Oracle Database 19.7
  • Reactor 2020.0
  • RSocket 1.1
  • Undertow 2.2
  • ……

八、其他更新

Spring Boot 2.4.0 发布更新说明中还包括了许多其他的更新和改进,比如说在 Spring Boot 2.4.0 中标识了在下个版本中计划废弃的不推荐使用的类和方法等。

以上就是 Spring Boot 2.4.0 的主要变更内容,当然还有许多发布细节,感兴趣的可以研究下这个更新说明:

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.4-Release-Notes

Spring Boot 2.3 新特性

依赖升级

Spring Boot 2.3升级了一些主要的 Spring 项目:

  • Spring Data Neumann
  • Spring HATEOAS 1.1
  • Spring Integration 5.3
  • Spring Kafka 2.5
  • Spring Security 5.3
  • Spring Session Dragonfruit

另外,还尽可能升级了一些第三方库到最新稳定版本:

  • Cassandra Driver 4.6
  • Couchbase Client 3.0
  • Elasticsearch 7.6
  • Kafka 2.5
  • Micrometer 1.5
  • MongoDB 4.0

Java 14 support

Spring Boot 2.3 支持Java14 同时保留对java11和java8的兼容性。

Docker支持

在Maven和Gradle插件中添加了对构建包含分层内容的jar文件的支持。分层根据jar内容的更改频率来分隔它们。这种分离允许更有效地构建Docker映像。未更改的现有层可以与已更改的层一起放在顶部进行重用。

Fat Jar支持优化

用Maven和Gradle构建的Fat jar现在包括一个索引文件。当jar被分解时,这个索引文件用于确保类路径的顺序与直接执行jar时相同。

优雅停机

SB所有四个嵌入式web服务器(Jetty、Reactor Netty、Tomcat和Undertow)以及响应性和基于servlet的web应用都支持优雅的关闭。在关闭时,web服务器将不再允许新的请求,并将等待完成的请求给个宽限期让它完成。当然这个宽限期是可以设置的:可以使用spring.lifecycle.timeout-per-shutdown-phase=xxx来配置,默认值是30s。

活性探测器

Spring Boot现在内置了关于应用程序可用性的探测的能力,可以跟踪应用程序是否处于活动状态以及是否准备好处理流量。如果你配置了management.health.probes.enabled=true,那么健康检查端点就可以查看你应用的活性和就绪列表,这在在Kubernetes上运行时,这是自动完成的。

Actuator增强

主要是对端点做了些输出、显示上的优化。如:

  • /actuator/metrics/:按字母顺序排列
  • DataSource的HealthIndicator健康指示器,现在进行无查询判断,而Connection仅做连接可用性验证而已

Spring Cloud 2020.0版本升级

1、Spring Boot 依赖版本

新版本需要依赖 Spring Boot 2.4.1

2、修复大量 bug

正常维护,这个版本修复了大量的 bug。

参考:

https://github.com/spring-cloud

3、项目、模块移除

1)spring-cloud-netflix 模块移除

下面的模块已经从 spring-cloud-netflix 中移除了:

  • spring-cloud-netflix-archaius
  • spring-cloud-netflix-concurrency-limits
  • spring-cloud-netflix-core
  • spring-cloud-netflix-dependencies
  • spring-cloud-netflix-hystrix
  • spring-cloud-netflix-hystrix-contract
  • spring-cloud-netflix-hystrix-dashboard
  • spring-cloud-netflix-hystrix-stream
  • spring-cloud-netflix-ribbon
  • spring-cloud-netflix-sidecar
  • spring-cloud-netflix-turbine
  • spring-cloud-netflix-turbine-stream
  • spring-cloud-netflix-zuul
  • spring-cloud-starter-netflix-archaius
  • spring-cloud-starter-netflix-hystrix
  • spring-cloud-starter-netflix-hystrix-dashboard
  • spring-cloud-starter-netflix-ribbon
  • spring-cloud-starter-netflix-turbine
  • spring-cloud-starter-netflix-turbine-stream
  • spring-cloud-starter-netflix-zuul

2)移除了对 ribbon、hystrix 和 zuul 的支持

在已发布的项目中已经移除了对 ribbon、hystrix 和 zuul 的支持。

hystrix 和 zuul 已经被废除,之前我有在Java技术栈分享过,但是,ribbon 怎么都移除了??

查了下资料,发现 spring-cloud-loadbalancer 已经取代了 ribbon!

3)移除了 Spring Cloud Security 项目

Spring Cloud Security 这个项目删除了,其代码已经移到了 Spring Cloud 各个子项目中了。

4、Spring Cloud Commons

注意:Bootstrap 已经被改为默认禁用状态。

Config Client, Consul, Vault, 和 Zookeeper 增加了 Spring Boot 2.4 中的新的导入配置的方式,即过 spring.config.import 参数导入配置,具体使用的细节请看对应的文档

如果你想回到老版本的 bootstrap 功能,可以通过两种方式开启它:

1)通过参数开启

spring.cloud.bootstrap.enabled=true

或者:

spring.config.use-legacy-processing=true

这个参数需要设置在环境变量或者系统级参数,或者命令行参数。

2)通过添加依赖开启

添加这个依赖:

org.springframework.cloud:spring-cloud-starter-bootstrap

  • 增加了 Spring Cloud LoadBalancer 服务器统计功能;
  • 通常的安全功能已从现已终止的 Spring Cloud Security 项目移至此处;
  • 增加了使用 spring.config.import 进行解密的支持;

5、Spring Cloud Contract

记录了如何在 Windows 上克隆项目。

6、Spring Cloud Kubernetes

1)增加了基于 Kubernetes Java 客户端的响应式客户端发现实现;

2)增加了基于 Kubernetes Java 客户端的 Spring Cloud Loadbalancer 实现;

7、Spring Cloud Openfeign

1)支持在 Spring Cloud CircuitBreakers 中包装 feign 客户端;

2)Spring Cloud OpenFeign 安全部分的代码,从 Spring Cloud Security 移到了 Spring Cloud OpenFeign;

3)增加了 LoadBalancer 统计功能;

8、Spring Cloud Gateway

增加了 LoadBalancer 统计功能。

9、Spring Cloud Netflix

1)移除了若干模块,见上面的第3点说明;

2)基于 Eureka Client 的 RestTemplate 已支持 TLS 属性;

10、Spring Cloud Task

1)增加了有关单步批处理作业的文档;

2 个赞

KOCA 升级 spring boot 2.5.6 验证结果

接口修改

org.springframework.boot:spring-boot-autoconfigure:2.2.10.RELEASE org.springframework.boot:spring-boot-autoconfigure:2.5.6
AbstractErrorController.getErrorAttributes(javax.servlet.http.HttpServletRequest request, boolean includeStackTrace) 原接口移除,添加新接口:AbstractErrorController.getErrorAttributes(HttpServletRequest request, ErrorAttributeOptions options)

影响模块: koca-support: GlobalErrorController (已修改)

io.github.openfeign:feign-core:10.4.0 io.github.openfeign:feign-core:10.12
Request.create(Request.HttpMethod httpMethod, String url, Map <String ,Collection > headers, Request.Body body) 原接口移除,添加新接口:Request.create(Request.HttpMethod httpMethod, String url, Map<String, Collection> headers, Request.Body body, RequestTemplate requestTemplate)
Request.requestBody() Body.create(byte[] body)

影响模块: koca-client: ServiceLoadBalanceClient (已修改)

org.springframework.cloud:spring-cloud-config-client:2.2.0.RELEASE org.springframework.cloud:spring-cloud-config-client:3.0.5
ConfigClientHealthProperties.getTimeToLive() → long 接口返回值类型修改:ConfigClientHealthProperties.getTimeToLive() → Duration

​ 影响模块:Koca-config-client (已修改)

org.springframework.kafka:spring-kafka:2.3.11.RELEASE org.springframework.kafka:spring-kafka:2.7.7
KafkaAdmin.getConfig() 原接口废弃并移除,添加新接口:KafkaAdmin.getConfigurationProperties()

​ 影响模块:koca-kafka (已修改)

org.springframework.boot:spring-boot-loader org.springframework.boot:spring-boot-loader:2.5.6
Launcher.getClassPathArchives() → List 原接口废弃并移除,添加新接口:Launcher.getClassPathArchivesIterator() → Iterator
Archive. getNestedArchives(EntryFilter filter) → List 原接口废弃并移除,添加新接口:Archive.getNestedArchives(EntryFilter searchFilter, EntryFilter includeFilter) → Iterator

影响模块:koca-boot-loader

模块修改

  1. Netflix ribbon移除,替换为Spring Cloud Loadbalancer

    影响模块: koca-auth-common(无用依赖), koca-client, koca-cloud-discovery

  • org.springframework.cloud.sleuth.sampler.ProbabilityBasedSampler 移除

  • org.springframework.cloud.sleuth.sampler.SamplerProperties 移除

  • org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration 移除

影响模块:koca-tracing

  1. jackson-dataformat-xml:2.10.5 → jackson-dataformat-xml:2.12.5
    需要手动引入jackson-databind:2.12.5
    影响模块:koca-client

  2. junit4 → junit 5

    单元测试中junit4的功能需修改到junit5类似的功能上:

    • @Before@BeforeEach,
    • @Test, @Rule@ExtendWith,
    • Assert → Assertions,

配置修改

  1. 配置中心修改,在spring-boot 2.4 之后配置中心不再使用bootstrap.yml加载,而是在application.yml中添加字段

    spring.config.import来添加,第三方库可以通过扩展org.springframework.boot.context.config 中的ConfigDataLocationResolverConfigDataLoader 接口来适配,具体实现查阅这两个接口的javadoc

1 个赞

Spring Boot 2.5 Release Notes

Spring Cloud 2020.0 Release Notes

Java 17 相关升级

根据JEP 403,为提高安全性和可维护性在Java 17 中将会对JDK内部类进行强封装,KOCA内部如果有访问Java 内部API需要在环境变量中显式的列举内部包。
例子:

--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.util=ALL-UNNAMED
--add-opens java.base/java.lang.reflect=ALL-UNNAMED