Spring Boot 2.3版本新特性(正常(優雅)停機與分層jar包)

Spring Boot 2.3版本新特性

1. 正常(優雅)停機

什麼是正常(優雅)停機?

官網翻譯:

所有四個嵌入式Web服務器(Jetty,Reactor Netty,Tomcat和Undertow)以及響應式和基於Servlet的Web應用程序均支持正常關機。它作爲關閉應用程序上下文的一部分發生,並在停止SmartLifecyclebean 的最早階段執行。此停止處理使用一個超時,該超時提供一個寬限期,在此寬限期內,現有請求將被允許完成,但新請求將不被允許。不允許新請求的確切方式因所使用的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 應用程序類和資源。

層順序很重要,因爲它確定了部分應用程序更改時可以緩存先前的層的可能性。默認順序爲dependenciesspring-boot-loadersnapshot-dependenciesapplication。應該首先添加最不可能更改的內容,然後添加更可能更改的層。

作者:古時的風箏
參考來源鏈接:https://juejin.im/post/5ef956d06fb9a07e5c182f21
來源:掘金

1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章