转载

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

当大潮退去,才知道谁在裸泳。。关注公众号【 BAT的乌托邦 】开启专栏式学习,拒绝浅尝辄止。本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈、MyBatis、中间件等小而美的专栏供以学习哦。

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

前言

各位小伙伴大家好,我是A哥。北京时间2020-05-15,Spring Boot 2.3.0版本正式发布了,次版本号的升级,一般会有些新特性出来。作为Java Coder的我们有必要一览它的新new Feature,keep下技术节奏嘛。

A哥“第二时间”知道了这个消息,然后在自己本机(请注意:非生产环境)体验了一把,然后再结合Spring Boot官方的 Release Notes ,在这里给你絮叨絮叨。

关于版本号

Spring Boot代码库的版本好采用“国际通用”(我自己yy的)的命名方式: 主版本号.次版本号.修订号 ,所以通过版本号就能感受到它的变化到底大不大,你升级时是否需要倍加注意等等。那么此处我就对这种命名方式版本号的各段进行科普一波:

  • 主版本号:完全不兼容。产品定位变化、核心API大规模不兼容(比如包名变了)、架构方式升级不能向下兼容......

    • 举例:Configuration1.x -> 2.x;Zuul1.x -> 2.x;Spring Boot1.x -> 2.x;Netty4.x -> 5.x
  • 次版本号 :相对兼容。一般是增加新特新,删除掉废弃的API,修改某些API不兼容。总的来说是影响比较小,在可控范围内的,但升级时不可掉以轻心, 必须 做前期调研
  • 修订号 :100%兼容。一般是修复bug、新增无伤大雅的一些特性等,一般想升就升

这次Spring Boot升级到2.3.0版本,属于 次版本号 的升级,因此会带有些新特性,还是值得一看的。

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

正文

Spring Boot v2.2依然是 活跃的 维护的版本,Spring Boot遵循的是 Pivotal OSS 支持策略,从发布日期起支持主要版本 3年 。但是呢,一般来说在主要/次要版本发布时,将会对上个主要版本至少提供12个月的支持(即使超过了3年),以解决关键的bug或者安全问题。

关于其它版本的维护活跃状态和已经EOL的日期,做出如下说明:

  • 2.2.x支持的版本 。2019.10发布,是现在的活跃的主干
  • 2.1.x支持的版本 。2018.10发布,会支持到2020.10月底
  • 2.0.x :生命已终止的版本。2018.3发布,2019.4.3停止维护
  • 1.5.x :生命已终止的版本。2017.1发布,是最后一个1.x分支,2019.8.1停止维护

从官网页面也可以看出,只有支持的版本才会被列出来,对使用者是有一定的引导作用的:

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

简单回忆2.2版本的新特性

很明显,Spring Boot2.2版本不是本文关心的重点,但为了起到衔接作用,本处把它的核心新特性列一下:

  1. Spring Framework 5.2:重大升级,可以看到它为Cloud Native的努力
  2. JUnit 5:从此版本开始, spring-boot-starter-test 默认使用 JUnit 5 作为单元测试框架
  3. 支持Java13
  4. 性能提升 :表现在对所有的自动配置类改为了 @Configuration 的Lite模式,提升性能。
  5. 新增 @ConfigurationPropertiesScan 注解,自动扫描 @ConfigurationProperties 配置类
  6. 支持RSocket

下面我们来了解下本次升级(2.3.0版本)的新特性,分为主要新特性和其它新特性分开阐述。

主要新特性

优雅停机

这个新特性深入人心,是开发者、运维的福音啊。据我了解,很多中小型公司/团队都是使用 kill -9 (当然有些比较“温柔”的团队也用 kill -2 )来停服的,这样暴力“停机”很容易造成业务逻辑执行失败,导致在一些业务场景下出现数据不一致现象。虽然我们可以通过一些手段(自研)来避免这个问题,但并不是每个公司/团队都去做了。这不Spring Boot2.3.0版本就内置了这个功能: 优雅停机

小知识:kill -2类似于你的Ctrl + C,会触发shutDownHook事件(从而关闭Spring容器);kill -9就没啥好说的,杀杀杀

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

注意,注意,注意:默认情况下,优雅关机并 没有开启 (还是立即关机),你仅需添加 server.shutdown=graceful 配置即可开启优雅关机(取值参见2.3.0新增的Shutdown枚举类,默认值参见 AbstractConfigurableWebServerFactory.shutdown 属性值)。

配置属性的调整

这个版本中,一些配置属性已 被重命名或弃用 (这会导致不向下兼容,需要特别引起注意),需要你做出调整。

那么如何知道我现在用的哪些属性存在不兼容情况呢???官方给了一个很好的解决方案,这里我用个使用示例教你可以这么处理:

现状:在Spring Boot2.2.x环境中你有很多配置,痛点是不知道哪些配置需要配替换成2.3.x中新的。此时你可以在工程下加入这个jar:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-properties-migrator</artifactId>
    <scope>runtime</scope>
</dependency>

然后 升级你的Spring Boot版本号为2.3.0 ,重新启动工程。本处以你配置文件里的 spring.http.encoding.enabled=true 为例,由于使用了SB的最新版本,因此可以在控制台看到如下日志输出:

Property source 'applicationConfig: [classpath:/application.properties]':
    Key: spring.http.encoding.enabled
        Line: 3
        Replacement: server.servlet.encoding.enabled

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

日志说够明确了吧。有了这个好帮手,妈妈就不用再担心辣么多的配置项需要自己一个个去核对喽,按照指示一个个的修改即可。

官方说明:完成迁移后,请确保从项目的依赖项中删除 properties-migrator 这个模块。

顺道说一下:升级到2.3.0版本号,属性变化主要是这个: spring.http. -> server.servlet.encoding.、spring.mvc.、spring.codec.

删除不推荐使用的类/方法/属性

在该版本中,Spring Boot删除了2.2版本中 不推荐使用 的大多数类,方法和属性。请确保升级之前没有再调用不推荐使用的方法。针对于此,下面我举例那些在2.2版本中还“活着”但被弃用(标记有 @Deprecated 注解),但在2.3版本中已 完全删除 的类、方法、属性:

  1. 方法BindResult#orElseCreate
  2. 属性LoggingApplicationListener#LOGFILE_BEAN_NAME
  3. 类JodaDateTimeJacksonConfiguration
  4. 类JestAutoConfiguration

即使如此,有些虽然在2.2就已被弃用,但在2.3.0还存在的,如: ConfigurationBeanFactoryMetadata、CompositeHealthIndicator

配置文件位置支持通配符

Spring Boot现在在加载配置文件时 支持通配符位置 。默认情况下,jar外部的 config/*/ 位置是被支持的。当配置属性有 多个源时 ,比如在 Kubernetes 这样的环境中非常有用。

特点说明:jar包外,jar包外,jar包外,放在内部(比如resource目录下是没有此特针的),下面有示例证明

简单的说,如果你有MySql的配置和Redis配置的话,你就可以把他们分开来放置,隔离性更好目录也更加清晰了:

/config/mysql/application.properties
/config/redis/application.properties

工程目录如下截图:

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

运行程序:

public static void main(String[] args) {
    ConfigurableApplicationContext context = SpringApplication.run(Boot23Demo1Application.class, args);

    ConfigurableEnvironment environment = context.getEnvironment();
    System.out.println(environment.getProperty("mysql.name"));
    System.out.println(environment.getProperty("redis.name"));

    context.close();
}

结果输出:

mysql
redis

但如果你把文件放在jar包内,形如这样,是 没有效果的

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

输出为null null,因此使用时需要稍加注意哈~

web下的日期转换支持配置

现在时间/日期的转换现在 可以通过 属性进行配置了,这补充了对格式化日期值的现有支持。比如对于MVC和WebFlux来说,它们的配置项分别如下:

  • spring.mvc.format.date
  • spring.mvc.format.date-time
  • spring.mvc.format.time
  • spring.webflux.format.date
  • spring.webflux.format.date-time
  • spring.webflux.format.time

这个怎么用,相信大家都会,一看就知道什么含义。但是,但是,但是: 请一定做好充分测试 ,并且充分考虑兼容性,因为你这动的是接口层的东西~

其它新特性

更改某些依赖最低版本要求

主要体现在如下两处:

  1. 如果你使用Gradle构建,支持 Gradle 6.3+ 。当然喽 5.6.x 也支持,只是标记为@Deprecated不推荐使用了
  2. 如果你使用Jetty嵌入式容器,版本要求是 Jetty 9.4.22+

核心依赖升级

Spring Boot 2.3迁移到几个Spring项目的新版本:

  • Spring Data Neumann:你可以理解为它就是之前的Spirng Data工程的升级版
  • Spring HATEOAS 1.1
  • Spring Integration 5.3
  • Spring Kafka 2.5
  • Spring Security 5.3
  • Spring Session Dragonfruit

Spring Boot 2.3的构建与Spring Boot 2.2基于 相同的 Spring Framework和Reactor。

说明:spirng-core么有升级,还是5.2.6版本(SB的2.2.7版本依赖的spring-core也是这个版本)

三方库依赖升级

  • AssertJ 3.16
  • Cassandra Driver 4.6
  • Elasticsearch 7.6
  • Hibernate Validator 6.1
  • JUnit Jupiter 5.6
  • Kafka 2.5
  • Lettuce 5.3
  • Micrometer 1.5
  • MongoDB 4.0

Spring Data Neumann升级带来的变化

  • Cassandra :升级到v4版本,带来了一些变化,如 ClusterBuilderCustomizer 就木有了~
  • Couchbase :升级到v3版本
  • Elasticsearch :已废弃的原生Elasticsearch transport直接被删除了,并且还移除了对Jest的支持。从此版本开始,默认支持 Elasticsearch7.5+
  • MongoDB :升级到v4版本

关于Validation

从此版本开始, spring-boot-starter-web 不会再把validation带进来,所以若使用到,你需要自己添加这个 spring-boot-starter-validation 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

关于 spring-boot-starter-web 启动器新、老版本的区别截图:

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

移除一些maven插件

移除了对 exec-maven-pluginmaven-site-plugin 这两个插件的管理,所以如果你的工程依赖于这两个插件,那么你得显示的导入(指定版本号)。

支持Java14

Spring Boot 2.3增加了对Java 14的支持。当然Java 8和Java 11也还是被支持的。

Docker支持

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

根据您的应用程序,您可能需要调整层的创建方式并添加新层。这可以通过描述如何将jar分成层以及这些层的顺序的配置来完成。

Fat Jar支持优化

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

嵌入式Servlet Web Server线程配置

用于配置嵌入式Servlet web服务器使用的线程的配置属性(包括Jetty, Tomcat, 和Undertow)别移动到了专注于threads的组: erver.jetty.threadsserver.tomcat.threadsserver.undertow.threads 。当然喽,旧的配置属性目前 依然保留着 ,但被标记为 @Deprecated 不再推荐使用了~

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

WebFlux基础路径配置

现在可以配置WebFlux应用程序的所有web处理程序的基本路径。使用 pring.webflux.base-path = xxx 配置。

活性探测器

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

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

Actuator增强

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

  • /actuator/metrics/ :按字母顺序排列,这样你找起来就更方便了
  • DataSource的 HealthIndicator 健康指示器,现在进行无查询判断,而 Connection 仅做连接可用性验证而已
  • ...

好基友Spring Cloud什么时候跟上?

作为Spring Boot的好基友,按照以往的惯例,他俩的步调不一般都保持基本一致。戒指到当前,Spring Cloud的最新版本是 Hoxton SR4 ,那它是否支持最新的Spring Boot2.3.0呢???答案是: 不支持,不支持,不支持 。对于Spring Boot这种跨版本升级,一般是有阻断性变化,所以它的机油SC适配上还需要时间。

这不,官方就公布了Spring Cloud支持 Spring Boot 2.3.x 的里程碑时间点,也就是它的 Hoxton.SR5 版本发布时间点:

Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览

Spring Cloud里程碑地址: https://github.com/spring-cloud/spring-cloud-release/milestones

升级建议:等等

至少要等到2020-5-26号发布后嘛,至少要等到Spring Boot2.3.x跑一段时间之后嘛, 坐在第二排看戏 ,才是最舒服最稳妥的。

总结

这是A哥奉给大家的,对Spring Boot2.3.0版本新特性的介绍,希望对你有些帮助。有些人可能会这么说:反正我现在也不用这个版本,没有必要去了解它。其实非也,如果你2.3.0不去了解,2.4.0不去了解,倘若某一天你突然要从2.0.0版本过度过来使用2.5.x版本了,你会“浑身不舒服”的。你品下,是不是这么个道理呢?

关注A哥

原文  https://segmentfault.com/a/1190000023209330
正文到此结束
Loading...