日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Spring Boot最新版優雅停機的方法

瀏覽:251日期:2023-08-08 16:33:34

什么是優雅停機先來一段簡單的代碼,如下:

@RestControllerpublic class DemoController { @GetMapping('/demo') public String demo() throws InterruptedException { // 模擬業務耗時處理流程 Thread.sleep(20 * 1000L); return 'hello'; }}

當我們流量請求到此接口執行業務邏輯的時候,若服務端此時執行關機 (kill),spring boot 默認情況會直接關閉容器(tomcat 等),導致此業務邏輯執行失敗。在一些業務場景下:會出現數據不一致的情況,事務邏輯不會回滾。

詳解Spring Boot最新版優雅停機的方法

開源項目:

分布式監控(Gitee GVP最有價值開源項目 ):https://gitee.com/sanjiankethree/cubic

攝像頭視頻流采集:https://gitee.com/sanjiankethree/cubic-video

優雅停機

目前Spring Boot已經發展到了2.3.4.RELEASE,伴隨著2.3版本的到來,優雅停機機制也更加完善了。

目前版本的Spring Boot 優雅停機支持Jetty, Reactor Netty, Tomcat和 Undertow 以及反應式和基于 Servlet 的 web 應用程序都支持優雅停機功能。

優雅停機的目的:

如果沒有優雅停機,服務器此時直接直接關閉(kill -9),那么就會導致當前正在容器內運行的業務直接失敗,在某些特殊的場景下產生臟數據。

增加了優雅停機配置后:

在服務器執行關閉(kill -2)時,會預留一點時間使容器內部業務線程執行完畢,此時容器也不允許新的請求進入。新請求的處理方式跟web服務器有關,Reactor Netty、 Tomcat將停止接入請求,Undertow的處理方式是返回503.

新版配置

YAML配置

新版本配置非常簡單,server.shutdown=graceful 就搞定了(注意,優雅停機配置需要配合Tomcat 9.0.33(含)以上版本)

server: port: 6080 shutdown: graceful #開啟優雅停機spring: lifecycle: timeout-per-shutdown-phase: 20s #設置緩沖時間 默認30s

在設置了緩沖參數timeout-per-shutdown-phase 后,在規定時間內如果線程無法執行完畢則會被強制停機。

下面我們來看下停機時,加了優雅停日志和不加的區別:

//未加優雅停機配置Disconnected from the target VM, address: ’127.0.0.1:49754’, transport: ’socket’Process finished with exit code 130 (interrupted by signal 2: SIGINT)

加了優雅停機配置后,可明顯發現的日志 Waiting for active requests to cpmplete,此時容器將在ShutdownHook執行完畢后停止。

詳解Spring Boot最新版優雅停機的方法

關閉方式

1、 一定不要使用kill -9 操作,使用kill -2 來關閉容器。這樣才會觸發java內部ShutdownHook操作,kill -9不會觸發ShutdownHook。

2、可以使用端點監控 POST 請求 /actuator/shutdown 來執行優雅關機。

添加ShutdownHook

通過上面的日志我們發現Druid執行了自己的ShutdownHook,那么我們也來添加下ShutdownHook,有幾種簡單的方式:

1、實現DisposableBean接口,實現destroy方法

@Slf4j@Servicepublic class DefaultDataStore implements DisposableBean { private final ExecutorService executorService = new ThreadPoolExecutor(OSUtil.getAvailableProcessors(), OSUtil.getAvailableProcessors() + 1, 1, TimeUnit.MINUTES, new ArrayBlockingQueue<>(200), new DefaultThreadFactory('UploadVideo')); @Override public void destroy() throws Exception { log.info('準備優雅停止應用使用 DisposableBean'); executorService.shutdown(); }}

2、使用@PreDestroy注解

@Slf4j@Servicepublic class DefaultDataStore { private final ExecutorService executorService = new ThreadPoolExecutor(OSUtil.getAvailableProcessors(), OSUtil.getAvailableProcessors() + 1, 1, TimeUnit.MINUTES, new ArrayBlockingQueue<>(200), new DefaultThreadFactory('UploadVideo')); @PreDestroy public void shutdown() { log.info('準備優雅停止應用 @PreDestroy'); executorService.shutdown(); }}

這里注意,@PreDestroy 比 DisposableBean 先執行

關閉原理

1、使用kill pid關閉,源碼很簡單,大家可以看下GracefulShutdown

private void doShutdown(GracefulShutdownCallback callback) {List<Connector> connectors = getConnectors();connectors.forEach(this::close);try {for (Container host : this.tomcat.getEngine().findChildren()) {for (Container context : host.findChildren()) {while (isActive(context)) {if (this.aborted) {logger.info('Graceful shutdown aborted with one or more requests still active');callback.shutdownComplete(GracefulShutdownResult.REQUESTS_ACTIVE);return;}Thread.sleep(50);}}}}catch (InterruptedException ex) {Thread.currentThread().interrupt();}logger.info('Graceful shutdown complete');callback.shutdownComplete(GracefulShutdownResult.IDLE);}

2、使用端點監控 POST 請求 /actuator/shutdown關閉

因為actuator 都使用了SPI的擴展方式,所以我們看下AutoConfiguration,可以看到關鍵點就是ShutdownEndpoint

@Configuration( proxyBeanMethods = false)@ConditionalOnAvailableEndpoint( endpoint = ShutdownEndpoint.class)public class ShutdownEndpointAutoConfiguration { public ShutdownEndpointAutoConfiguration() { } @Bean( destroyMethod = '' ) @ConditionalOnMissingBean public ShutdownEndpoint shutdownEndpoint() { return new ShutdownEndpoint(); }}

ShutdownEndpoint,為了節省篇幅只留了一點重要的

@Endpoint( id = 'shutdown', enableByDefault = false)public class ShutdownEndpoint implements ApplicationContextAware { @WriteOperation public Map<String, String> shutdown() { if (this.context == null) { return NO_CONTEXT_MESSAGE; } else { boolean var6 = false; Map var1; try { var6 = true; var1 = SHUTDOWN_MESSAGE; var6 = false; } finally { if (var6) { Thread thread = new Thread(this::performShutdown); thread.setContextClassLoader(this.getClass().getClassLoader()); thread.start(); } } Thread thread = new Thread(this::performShutdown); thread.setContextClassLoader(this.getClass().getClassLoader()); thread.start(); return var1; } } private void performShutdown() { try { Thread.sleep(500L); } catch (InterruptedException var2) { Thread.currentThread().interrupt(); } this.context.close(); //這里才是核心 }}

在調用了 this.context.close() ,其實就是AbstractApplicationContext 的close() 方法 (重點是其中的doClose())

/** * Close this application context, destroying all beans in its bean factory. * <p>Delegates to {@code doClose()} for the actual closing procedure. * Also removes a JVM shutdown hook, if registered, as it’s not needed anymore. * @see #doClose() * @see #registerShutdownHook() */@Overridepublic void close() {synchronized (this.startupShutdownMonitor) {doClose(); //重點:銷毀bean 并執行jvm shutdown hook// If we registered a JVM shutdown hook, we don’t need it anymore now:// We’ve already explicitly closed the context.if (this.shutdownHook != null) {try {Runtime.getRuntime().removeShutdownHook(this.shutdownHook);}catch (IllegalStateException ex) {// ignore - VM is already shutting down}}}}

后記

到這里,關于單機版本的Spring Boot優雅停機就說完了。為什么說單機?因為大家也能發現,在關閉時,其實只是保證了服務端內部線程執行完畢,調用方的狀態是沒關注的。

不論是Dubbo還是Cloud 的分布式服務框架,需要關注的是怎么能在服務停止前,先將提供者在注冊中心進行反注冊,然后在停止服務提供者,這樣才能保證業務系統不會產生各種503、timeout等現象。

好在當前Spring Boot 結合Kubernetes已經幫我們搞定了這一點,也就是Spring Boot 2.3版本新功能Liveness(存活狀態) 和Readiness(就緒狀態)

簡單的提下這兩個狀態:

Liveness(存活狀態):Liveness 狀態來查看內部情況可以理解為health check,如果Liveness失敗就就意味著應用處于故障狀態并且目前無法恢復,這種情況就重啟吧。此時Kubernetes如果存活探測失敗將殺死Container。 Readiness(就緒狀態):用來告訴應用是否已經準備好接受客戶端請求,如果Readiness未就緒那么k8s就不能路由流量過來。

到此這篇關于Spring Boot最新版優雅停機的文章就介紹到這了,更多相關Spring Boot優雅停機內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品三级在线观看视频| 精品国产18久久久久久二百| 精品国产亚洲一区二区在线观看| 亚洲精选91| 伊人久久大香线蕉av超碰演员| 国产福利电影在线播放| 欧美亚洲二区| 婷婷精品在线| 蜜臀av国产精品久久久久| 午夜欧美在线| 久久国产电影| 久久久一本精品| 美日韩一区二区三区| 亚洲免费毛片| 中文字幕一区二区精品区| 香蕉久久夜色精品国产| 夜久久久久久| 日韩在线综合| 日本美女一区| 日韩精品电影| 欧美日韩精品免费观看视完整 | 日韩不卡手机在线v区| 一区二区精彩视频| 亚洲一区黄色| 免费欧美日韩| 亚洲日产av中文字幕| 福利精品一区| 精品丝袜久久| 高清在线一区| 成人午夜精品| 国产在线视频欧美一区| 你懂的国产精品永久在线| 成人国产综合| 亚洲主播在线| 国产欧美亚洲精品a| 97精品国产| 视频一区在线播放| 国产精品毛片aⅴ一区二区三区| av亚洲一区二区三区| 午夜亚洲福利在线老司机| 欧美亚洲网站| 高清不卡亚洲| 日韩精品一区第一页| 老牛国内精品亚洲成av人片| 午夜国产精品视频| 国产精品一国产精品k频道56| 美女一区网站| 亚洲精品欧美| 欧美成人a交片免费看| 免费观看在线色综合| 电影91久久久| 中文不卡在线| 日韩精品中文字幕第1页| 免费在线观看一区二区三区| 欧美91在线| 久久不射中文字幕| 久久午夜影院| 噜噜噜久久亚洲精品国产品小说| 麻豆成人91精品二区三区| 亚洲一级在线| bbw在线视频| 日韩精品久久理论片| 91精品一区国产高清在线gif| 国产私拍福利精品视频二区| 午夜欧美在线| 国产aⅴ精品一区二区四区| 影音先锋久久精品| 91精品国产调教在线观看| 国产精品久久久亚洲一区| 久久高清国产| 日韩影院二区| 国产精品日本一区二区不卡视频| 日韩一级网站| 日韩欧美另类一区二区| 国产欧美日韩在线一区二区| 99国产精品久久久久久久| 亚洲国产成人二区| 国产亚洲欧美日韩在线观看一区二区| 91精品二区| av中文资源在线资源免费观看| 日韩精品国产精品| 欧美日韩视频| 国产精品99视频| 国产精品日本一区二区不卡视频 | 国产精品嫩草99av在线| 精品国产18久久久久久二百| 日韩精品欧美大片| 中日韩男男gay无套| 久久久久国产精品一区三寸| 精品一区二区三区中文字幕视频 | 日韩精品亚洲专区| 国产精品美女久久久| 久久激情婷婷| 黑森林国产精品av| 久久精品伊人| 国产精品久久久久久av公交车| 91成人超碰| 日韩精品麻豆| 国产精品国产三级国产在线观看| 国产精品中文字幕亚洲欧美| 中文字幕中文字幕精品| 国产精品毛片在线看| 激情欧美亚洲| 日韩精品欧美| 欧美精品资源| 丝袜美腿诱惑一区二区三区| av资源新版天堂在线| 国产一区一一区高清不卡| 国产日韩中文在线中文字幕| 日韩av一区二区三区| 亚洲区第一页| 亚洲深深色噜噜狠狠爱网站 | 深夜福利视频一区二区| 国产一区二区精品久| 麻豆成人在线观看| 国产福利资源一区| 久久精品女人| 国产成人1区| 综合日韩av| 欧美香蕉视频| 国产尤物精品| 激情欧美丁香| 午夜久久美女| 中文国产一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久亚洲欧洲| 日本一区福利在线| 欧美欧美黄在线二区| 国产精品白丝一区二区三区| 欧美黄色一区| 国产美女高潮在线| 99久久夜色精品国产亚洲1000部| 99久久亚洲精品蜜臀| 国产亚洲毛片在线| 一区二区91| 国产精品对白久久久久粗| 麻豆精品蜜桃视频网站| 日本一二区不卡| 国产亚洲一区二区手机在线观看 | 另类中文字幕国产精品| 九一成人免费视频| 视频一区二区三区在线| 婷婷成人av| 久久99精品久久久久久园产越南 | 久久免费黄色| 亚洲欧美日韩国产一区| 一本一道久久a久久| 欧美日韩午夜电影网| 国产a久久精品一区二区三区| 日韩欧美一区二区三区在线观看| 红桃视频亚洲| 青青草91久久久久久久久| 精品色999| 激情综合自拍| 日本aⅴ精品一区二区三区| 麻豆中文一区二区| 久久久久国产一区二区| 蜜臀av一区二区在线免费观看| 国产欧美日韩一级| 精品国产精品久久一区免费式 | 亚洲欧美日韩综合国产aⅴ| 日本强好片久久久久久aaa| 美女视频免费精品| 欧美精品一二| 日韩国产在线一| 日韩欧美看国产| 亚洲精品在线二区| 精品色999| 日本欧美在线看| 久久亚洲精品中文字幕| 91精品蜜臀一区二区三区在线| 最近国产精品视频| 黄色在线网站噜噜噜| 美女精品网站| 久久中文字幕导航| 激情综合在线| 国产精品男女| 伊人久久成人| 欧美国产极品| 久久性天堂网| av中文资源在线资源免费观看| 视频一区中文字幕| 国精品产品一区| 亚洲一区二区三区在线免费| 黑森林国产精品av| 综合一区av| 亚洲1234区| 久久精品99国产精品日本| 亚洲先锋成人| 精品三级在线| 亚洲欧洲av| 激情综合自拍| 精品亚洲二区| 久久国产精品亚洲77777| 在线手机中文字幕| 国产欧美日韩视频在线| 国产亚洲毛片在线| 色黄视频在线观看| 国产美女久久| 男女精品网站|