关于版本号
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 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停止维护
从官网页面也可以看出,只有支持的版本才会被列出来,对使用者是有一定的引导作用的:
简单回忆2.2版本的新特性
很明显,Spring Boot2.2版本不是本文关心的重点,但为了起到衔接作用,本处把它的核心新特性列一下:
- Spring Framework 5.2:重大升级,可以看到它为Cloud Native的努力
- JUnit 5:从此版本开始,spring-boot-starter-test默认使用JUnit 5作为单元测试框架
- 支持Java13
- 性能提升:表现在对所有的自动配置类改为了@Configuration的Lite模式,提升性能。
- 新增@ConfigurationPropertiesScan注解,自动扫描@ConfigurationProperties配置类
- 支持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
日志说够明确了吧。有了这个好帮手,妈妈就不用再担心辣么多的配置项需要自己一个个去核对喽,按照指示一个个的修改即可。
官方说明:完成迁移后,请确保从项目的依赖项中删除properties-migrator这个模块。
顺道说一下:升级到2.3.0版本号,属性变化主要是这个:spring.http. -> server.servlet.encoding.、spring.mvc.、spring.codec.