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 一起使用,配置树是提供键/值对的另一种方法,每一个键值/对都在其自己的文件中声明,文件名是键,文件内容就是值。
另外,从配置树导入的参数默认会带一个换行符。
详细的参考:
新增启动端点
Spring Boot 2.4.0 添加了一个新的启动端点,用来显示应用启动有关的详细信息,比如可以帮助我们来诊断启动时间比预期更长的 Spring Beans。
这个功能建立在 Spring Framwork 5.3 最近添加的应用程序启动跟踪特性的基础上,感兴趣的可以在 Spring 框架文档中阅读有关该功能的更多信息。
新增起源链(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:
Gradle:
移除了 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。
参考:
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)增加了有关单步批处理作业的文档;