1. 程式人生 > >Spring Boot 2.3.0正式釋出:優雅停機、配置檔案位置萬用字元新特性一覽

Spring Boot 2.3.0正式釋出:優雅停機、配置檔案位置萬用字元新特性一覽

> 當大潮退去,才知道誰在裸泳。。關注公眾號【**BAT的烏托邦**】開啟專欄式學習,拒絕淺嘗輒止。本文 [https://www.yourbatman.cn](https://www.yourbatman.cn) 已收錄,裡面一併有Spring技術棧、MyBatis、中介軟體等小而美的專欄供以學習哦。 [TOC] ![](https://img-blog.csdnimg.cn/2020071316585881.png) # 前言 各位小夥伴大家好,我是A哥。北京時間2020-05-15,Spring Boot 2.3.0版本正式釋出了,次版本號的升級,一般會有些新特性出來。作為Java Coder的我們有必要一覽它的新new Feature,keep下技術節奏嘛。 A哥“第二時間”知道了這個訊息,然後在自己本機(請注意:非生產環境)體驗了一把,然後再結合Spring Boot官方的[Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-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版本,屬於**次版本號**的升級,因此會帶有些新特性,還是值得一看的。 ![](https://img-blog.csdnimg.cn/20200523202933979.png) # 正文 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停止維護 從官網頁面也可以看出,只有支援的版本才會被列出來,對使用者是有一定的引導作用的: ![](https://img-blog.csdnimg.cn/20200523204026164.png) --- ## 簡單回憶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: ```xml org.springframework.boot
spring-boot-properties-migrator runtime
``` 然後**升級你的Spring Boot版本號為2.3.0**,重新啟動工程。本處以你配置檔案裡的`spring.http.encoding.enabled=true`為例,由於使用了SB的最新版本,因此可以在控制檯看到如下日誌輸出: ```java Property source 'applicationConfig: [classpath:/application.properties]': Key: spring.http.encoding.enabled Line: 3 Replacement: server.servlet.encoding.enabled ``` ![](https://img-blog.csdnimg.cn/20200523162357514.png) 日誌說夠明確了吧。有了這個好幫手,媽媽就不用再擔心辣麼多的配置項需要自己一個個去核對嘍,按照指示一個個的修改即可。 >
官方說明:完成遷移後,請確保從專案的依賴項中刪除`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配置的話,你就可以把他們分開來放置,隔離性更好目錄也更加清晰了: - mysql:`/config/mysql/application.properties` - redis:`/config/redis/application.properties` 工程目錄如下截圖: ![](https://img-blog.csdnimg.cn/20200523212126237.png) 執行程式: ```java 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(); } ``` 結果輸出: ```java mysql redis ``` 但如果你把檔案放在jar包內,形如這樣,是**沒有效果的**: ![](https://img-blog.csdnimg.cn/20200523212434591.png) 輸出為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`依賴: ```xml org.springframework.boot spring-boot-starter-validation ``` 關於`spring-boot-starter-web`啟動器新、老版本的區別截圖: ![](https://img-blog.csdnimg.cn/20200523185845525.png) ![](https://img-blog.csdnimg.cn/20200523190109536.png) --- ### 移除一些maven外掛 移除了對`exec-maven-plugin`和`maven-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.threads`,`server.tomcat.threads`,`server.undertow.threads`。當然嘍,舊的配置屬性目前**依然保留著**,但被標記為`@Deprecated`不再推薦使用了~ ![](https://img-blog.csdnimg.cn/20200523191327508.png) --- ### WebFlux基礎路徑配置 現在可以配置WebFlux應用程式的所有web處理程式的基本路徑。使用`pring.webflux.base-path = xxx`配置。 --- ### 活性探測器 Spring Boot現在內建了關於應用程式可用性的探測的能力,可以**跟蹤應用程式是否處於活動狀態**以及是否準備好處理流量。如果你配置了`management.health.probes.enabled=true`,那麼健康檢查端點就可以檢視你應用的活性和就緒列表,這在在Kubernetes上執行時,這是自動完成的。 ![](https://img-blog.csdnimg.cn/2020052321424955.png) --- ### 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`版本釋出時間點: ![](https://img-blog.csdnimg.cn/20200523215452630.png) Spring Cloud里程碑地址:[https://github.com/spring-cloud/spring-cloud-release/milestones](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版本了,你會“渾身不舒服”的。你品下,是不是這麼個道理呢?