Spring Boot 2.3版本新特性
1. 正常(優雅)停機
什麼是正常(優雅)停機?
官網翻譯:
所有四個嵌入式Web服務器(Jetty,Reactor Netty,Tomcat和Undertow)以及響應式和基於Servlet的Web應用程序均支持正常關機。它作爲關閉應用程序上下文的一部分發生,並在停止
SmartLifecycle
bean 的最早階段執行。此停止處理使用一個超時,該超時提供一個寬限期,在此寬限期內,現有請求將被允許完成,但新請求將不被允許。不允許新請求的確切方式因所使用的Web服務器而異。Jetty,Reactor Netty和Tomcat將停止在網絡層接受請求。Undertow將接受請求,但會立即以服務不可用(503)響應進行響應。當我們流量請求到此接口執行業務邏輯的時候,若服務端此時執行關機 (kill),spring boot 默認情況會直接關閉容器(tomcat 等),導致此業務邏輯執行失敗。在一些業務場景下:會出現數據不一致的情況,事務邏輯不會回滾。
使用Tomcat正常關機需要Tomcat 9.0.33或更高版本。
在最新的 spring boot 2.3 版本,內置此功能,不需要再自行擴展容器線程池來處理, 目前 spring boot 嵌入式支持的 web 服務器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及反應式和基於 Servlet 的 web 應用程序都支持優雅停機功能。 我們來看下如何使用:
1.1使用方式
要啓用正常關機,請配置
server.shutdown=graceful
啓用時(默認是immediate
),在 web 容器關閉時,web 服務器將不再接收新請求,並將等待活動請求完成的緩衝期。如以下示例所示:
配置applicationyml
文件中開啓
server.shutdown=graceful
要配置超時時間,請配置
spring.lifecycle.timeout-per-shutdown-phase
屬性,默認值,等待30秒,無論線程業務是否執行完畢都會停機!
如以下示例所示:
spring.lifecycle.timeout-per-shutdown-phase=20s
2. 分層jar
包 (主要配合docker)
官網翻譯:
重新打包的jar 分別在
BOOT-INF/classes
和中包含應用程序的類和依賴項BOOT-INF/lib
。對於需要從jar的內容中構建docker映像的情況,能夠進一步分隔這些目錄,以便可以將它們寫入不同的層是很有用的。
分層其實只是邏輯上的抽象而已。打出的 jar 包結構如下(jar包其實就是個壓縮包,可以解壓縮查看目錄結構)
Buildpacks 打鏡像包會使用緩存的,如果這一層沒變那就不用重新打這一層,只需要重新打包修改過的層,這樣一來,如果你只修改了 application 中的內容,比如新加了 Controller 或者配置文件等,那麼只需要重新打包這一層,也就是幾 K,幾十K 不會很大,這樣一來打包速度就很快了,要不然一個上百兆的鏡像包也得需要一段時間。
分層的jar使用與常規重新打包的jar相同的佈局,但是包括一個描述每個圖層的附加元數據文件。要使用此功能,必須啓用分層功能:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.1.RELEASE</version>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
</plugin>
</plugins>
</build>
</project>
默認情況下,定義了以下層:
dependencies
對於版本不包含的任何依賴項SNAPSHOT
。spring-boot-loader
用於jar加載程序類。snapshot-dependencies
對於其版本包含的任何依賴項SNAPSHOT
。application
應用程序類和資源。
層順序很重要,因爲它確定了部分應用程序更改時可以緩存先前的層的可能性。默認順序爲dependencies
,spring-boot-loader
,snapshot-dependencies
,application
。應該首先添加最不可能更改的內容,然後添加更可能更改的層。
作者:古時的風箏
參考來源鏈接:https://juejin.im/post/5ef956d06fb9a07e5c182f21
來源:掘金
1