如何關(guān)閉SpringBoot應(yīng)用

這篇文章主要講解了“如何關(guān)閉 Spring Boot 應(yīng)用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何關(guān)閉 Spring Boot 應(yīng)用”吧!

嫩江ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

前言

隨著線上應(yīng)用逐步采用 SpringBoot 構(gòu)建,SpringBoot應(yīng)用實(shí)例越來多,當(dāng)線上某個應(yīng)用需要升級部署時(shí),常常簡單粗暴地使用 kill 命令,這種停止應(yīng)用的方式會讓應(yīng)用將所有處理中的請求丟棄,響應(yīng)失敗。這樣的響應(yīng)失敗尤其是在處理重要業(yè)務(wù)邏輯時(shí)需要極力避免的,那么有什么更好的方式來平滑地關(guān)閉 SpringBoot 應(yīng)用呢?那就通過本文一起來探究吧。(本文主要針對基于Spring Boot 內(nèi)嵌 Tomcat 容器作為 Web 服務(wù)的應(yīng)用)

本文示例代碼可以通過下面?zhèn)}庫地址獲?。?/p>

  • springboot-shutdown:https://github.com/wrcj12138aaa/springboot-shutdown

環(huán)境支持:

  • JDK 8

  • SpringBoot 2.1.4

  • Maven 3.6.0

定制 Tomcat Connector 行為

要平滑關(guān)閉 Spring Boot 應(yīng)用的前提就是首先要關(guān)閉其內(nèi)置的 Web 容器,不再處理外部新進(jìn)入的請求。為了能讓應(yīng)用接受關(guān)閉事件通知的時(shí)候,保證當(dāng)前 Tomcat 處理所有已經(jīng)進(jìn)入的請求,我們需要實(shí)現(xiàn) TomcatConnectorCustomizer 接口,這個接口的源碼十分簡單,從注釋可以看出這是實(shí)現(xiàn)自定義 Tomcat Connector 行為的回調(diào)接口:

如何關(guān)閉 Spring Boot 應(yīng)用

這里如果小伙伴對 Connector 不太熟悉,我就簡單描述下:Connector 屬于 Tomcat 抽象組件,功能就是用來接受外部請求,以及內(nèi)部傳遞,并返回響應(yīng)內(nèi)容,是Tomcat 中請求處理和響應(yīng)的重要組件,具體實(shí)現(xiàn)有 HTTP Connector 和 AJP Connector。

通過定制 Connector 的行為,我們就可以允許在請求處理完畢后進(jìn)行 Tomcat 線程池的關(guān)閉,具體實(shí)現(xiàn)代碼如下:

如何關(guān)閉 Spring Boot 應(yīng)用

上述代碼定義的 TIMEOUT 變量為 Tomcat 線程池延時(shí)關(guān)閉的最大等待時(shí)間,一旦超過這個時(shí)間就會強(qiáng)制關(guān)閉線程池,也就無法處理所有請求了,我們通過控制 Tomcat 線程池的關(guān)閉時(shí)機(jī),來實(shí)現(xiàn)優(yōu)雅關(guān)閉 Web 應(yīng)用的功能。另外需要注意的是我們的類 CustomShutdown 實(shí)現(xiàn)了 ApplicationListener 接口,意味著監(jiān)聽著 Spring 容器關(guān)閉的事件,即當(dāng)前的 ApplicationContext 執(zhí)行 close 方法。

內(nèi)嵌 Tomcat 添加 Connector 回調(diào)

有了定制的 Connector 回調(diào),我們需要在啟動過程中添加到內(nèi)嵌的 Tomcat 容器中,然后等待執(zhí)行。那這一步又是如何實(shí)現(xiàn)的呢,可以參考下面代碼:

如何關(guān)閉 Spring Boot 應(yīng)用

這里的 TomcatServletWebServerFactory 是 Spring Boot 實(shí)現(xiàn)內(nèi)嵌 Tomcat 的工廠類,類似的其他 Web 容器,也有對應(yīng)的工廠類如 JettyServletWebServerFactory,UndertowServletWebServerFactory。他們共同的特點(diǎn)就是繼承同個抽象類 AbstractServletWebServerFactory,提供了 Web 容器默認(rèn)的公共實(shí)現(xiàn),如應(yīng)用上下文設(shè)置,會話管理等。

如果我們需要定義Spring Boot 內(nèi)嵌的 Tomcat 容器時(shí),就可以使用 TomcatServletWebServerFactory 來進(jìn)行個性化定義,例如下方為官方文檔提供自定示例:

如何關(guān)閉 Spring Boot 應(yīng)用

好了說回正題,我們這里使用 addConnectorCustomizers 方法將自定義的 Connector 行為添加到內(nèi)嵌的Tomcat 之上,為了查看加載效果,我們可以在 Spring Boot 程序啟動后從容器中獲取下webServerFactory 對象,然后觀察,在它的 tomcatConnectorCustomizers 屬性中可以看到已經(jīng)有了 CustomeShutdown 對象。

如何關(guān)閉 Spring Boot 應(yīng)用

開啟 Shutdown Endpoint

到目前讓內(nèi)嵌 Tomcat 容器平穩(wěn)關(guān)閉的操作已經(jīng)完成,接下來要做的就是如何關(guān)閉主動關(guān)閉 Spring 容器了,除了常規(guī)Linux 命令 Kill,我們可以利用 Spring Boot Actuator 來實(shí)現(xiàn)Spring 容器的遠(yuǎn)程關(guān)閉,怎么實(shí)現(xiàn)繼續(xù)看

Spring Boot Actuator 是 Spring Boot 的一大特性,它提供了豐富的功能來幫助我們監(jiān)控和管理生產(chǎn)環(huán)境中運(yùn)行的 Spring Boot 應(yīng)用。我們可以通過 HTTP 或者 JMX 方式來對我們應(yīng)用進(jìn)行管理,除此之外,它為我們的應(yīng)用提供了審計(jì),健康狀態(tài)和度量信息收集的功能,能幫助我們更全面地了解運(yùn)行中的應(yīng)用。

Actuator, ['?kt???e?t?] 中文翻譯過來就是制動器,這是一個制造業(yè)的術(shù)語,指的是用于控制某物的機(jī)械裝置。

在 Spring Boot Actuator 中也提供控制應(yīng)用關(guān)閉的功能,所以我們要為應(yīng)用引入 Spring Boot Actuator,具體方式就是要將對應(yīng)的 starter 依賴添加到當(dāng)前項(xiàng)目中,以 Maven 項(xiàng)目為例:

如何關(guān)閉 Spring Boot 應(yīng)用

Spring Boot Actuator 采用向外部暴露 Endpoint (端點(diǎn))的方式來讓我們與應(yīng)用進(jìn)行監(jiān)控和管理,引入 spring-boot-starter-actuator 之后,我們就需要啟用我們需要的 Shutdown Endpoint,在配置文件 application.properties 中,設(shè)置如下

如何關(guān)閉 Spring Boot 應(yīng)用

第一行表示啟用 Shutdown Endpoint ,第二行表示向外部以 HTTP 方式暴露所有 Endpoint,默認(rèn)情況下除了 Shutdown Endpoint 之外,其他 Endpoint 都是啟用的。

除了 Shutdown Endpoint,Actuator Endpoint 還有十余種,有的是特定操作,比如 heapdump 轉(zhuǎn)儲內(nèi)存日志;有的是信息展示,比如 health 顯示應(yīng)用健康狀態(tài)。具體所有 Endpoint 信息可以參見官方文檔-53. Endpoints 一節(jié)。

到這里我們的前期配置工作就算完成了。當(dāng)啟動應(yīng)用后,就可以通過POST 方式請求對應(yīng)路徑的 http://host:port/actuator/shutdown 來實(shí)現(xiàn)Spring Boot 應(yīng)用遠(yuǎn)程關(guān)閉,是不是很簡單呢。

模擬測試

這里為了模擬測試,我們首先模擬實(shí)現(xiàn)長達(dá)10s 時(shí)間處理業(yè)務(wù)的請求控制器 BusinessController,具體實(shí)現(xiàn)如下:

如何關(guān)閉 Spring Boot 應(yīng)用

Thread.sleep 來阻塞當(dāng)前請求線程,模擬業(yè)務(wù)處理,在此同時(shí)用 HTTP 方式訪問 Shutdown Endpoint 試圖關(guān)閉應(yīng)用,可以通過觀察控制臺日志看是否應(yīng)用是否會完成請求的處理后才真正進(jìn)行關(guān)閉。

首先用 curl 命令模擬發(fā)送業(yè)務(wù)請求:

如何關(guān)閉 Spring Boot 應(yīng)用

然后在業(yè)務(wù)處理中,直接發(fā)送請求 actuator/shutdown,嘗試關(guān)閉應(yīng)用,同樣采用 curl 方式:

如何關(guān)閉 Spring Boot 應(yīng)用

actuator/shutdown 請求發(fā)送后會立即返回響應(yīng)結(jié)果,但應(yīng)用并不會停止:

如何關(guān)閉 Spring Boot 應(yīng)用

最后看下控制臺的日志輸出順序:

如何關(guān)閉 Spring Boot 應(yīng)用

可以看出在發(fā)送業(yè)務(wù)請求之后立刻發(fā)送關(guān)閉應(yīng)用的請求,并不會立即將應(yīng)用停止,而是在請求處理完畢之后,就是阻塞的 10s 后應(yīng)用開始退出,這樣可以保證已經(jīng)接收到的請求能返回正常響應(yīng), 而關(guān)閉請求之后再進(jìn)入的請求都不會被處理,到這里我們優(yōu)雅關(guān)閉 Spring Boot 程序的操作就此實(shí)現(xiàn)了。

實(shí)現(xiàn)自動化

由于 Spring Boot 提供內(nèi)嵌 Web 容器的便利性,我們經(jīng)常將程序打包成 jar 然后發(fā)布。通常應(yīng)用的啟動和關(guān)閉操作流程是固定且重復(fù)的,本著 Don't Repeat Yourself 原則,我們有必要將這個操作過程自動化,將關(guān)閉和啟用的 SpringBoot應(yīng)用的操作寫成 shell 腳本,以避免出現(xiàn)人為的差錯,并且方便使用,提高操作效率。下面是我針對示例程序所寫的程序啟動腳本:(具體腳本可在示例項(xiàng)目查看)

如何關(guān)閉 Spring Boot 應(yīng)用

有了腳本,我們可以直接通過命令行方式平滑地更新部署 Spring Boot 程序,效果如下:

如何關(guān)閉 Spring Boot 應(yīng)用

感謝各位的閱讀,以上就是“如何關(guān)閉 Spring Boot 應(yīng)用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何關(guān)閉 Spring Boot 應(yīng)用這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

當(dāng)前標(biāo)題:如何關(guān)閉SpringBoot應(yīng)用
網(wǎng)頁路徑:http://muchs.cn/article8/gpjcop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、營銷型網(wǎng)站建設(shè)企業(yè)建站、網(wǎng)站制作網(wǎng)站導(dǎo)航、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)