成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java層如何配合K8s實現優雅下線

開發 前端
在Kubernetes(K8s)中部署Java應用(如Spring Boot)時,實現優雅下線(Graceful Shutdown)是確保服務平滑停止的關鍵,避免正在處理的請求中斷或數據不一致,尤其在金融、支付等高可靠性場景中至關重要。

在Kubernetes(K8s)中部署Java應用(如Spring Boot)時,實現優雅下線(Graceful Shutdown)是確保服務平滑停止的關鍵,避免正在處理的請求中斷或數據不一致,尤其在金融、支付等高可靠性場景中至關重要。優雅下線需要Java應用層與K8s的生命周期管理機制協同工作。以下是詳細實現方案,涵蓋原理、代碼實現和配置步驟。

一、優雅下線的原理

1. K8s下線流程

  • 當K8s執行kubectl delete或滾動更新(Rolling Update)時:
  1. Pod標記為Terminating:K8s向Pod發送SIGTERM信號。
  2. 負載均衡移除:Service從Endpoint中移除該Pod,停止新流量。
  3. 寬限期等待:K8s等待terminationGracePeriodSeconds(默認30秒),然后發送SIGKILL強制終止。
  • 目標:

在寬限期內完成現有請求處理,拒絕新請求,釋放資源。

2. Java層需求

  • 捕獲SIGTERM:監聽操作系統信號,觸發關閉邏輯。
  • 停止新請求:關閉Web服務器(如Tomcat),但保留現有連接。
  • 完成任務:等待異步任務(如數據庫寫入)結束。
  • 通知K8s:通過健康檢查(Readiness Probe)告知已下線。

二、Java層實現優雅下線

以Spring Boot為例,結合K8s的preStop鉤子和Spring的關閉機制實現。

1. 捕獲SIGTERM信號

  • Spring Boot通過ApplicationListener監聽上下文關閉事件:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.event.ApplicationContextInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class GracefulShutdownListener implements ApplicationListener<ContextClosedEvent> {
    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        System.out.println("Received SIGTERM, starting graceful shutdown...");
        // 自定義關閉邏輯
        try {
            Thread.sleep(5000); // 模擬等待現有請求完成
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        System.out.println("Shutdown complete.");
    }
}

2. 關閉Web服務器

  • Spring Boot嵌入Tomcat時,需優雅停止連接:
import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;

@Component
public class TomcatGracefulShutdown implements ApplicationListener<ContextClosedEvent>, TomcatConnectorCustomizer {
    private volatile Connector connector;

    @Override
    public void customize(Connector connector) {
        this.connector = connector;
    }

    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        if (connector != null) {
            System.out.println("Shutting down Tomcat gracefully...");
            connector.pause(); // 暫停新請求
            try {
                Thread.sleep(5000); // 等待現有請求完成,實際應動態判斷
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            connector.getService().stop(); // 停止服務
        }
    }
}
  • 配置Spring Boot:
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.addListeners(new TomcatGracefulShutdown());
        app.run(args);
    }
}

3. 處理異步任務

  • 若有線程池或消息隊列(如Kafka消費者),需等待任務完成:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;

@Component
public class AsyncTaskShutdown implements ApplicationListener<ContextClosedEvent> {
    @Autowired
    private ThreadPoolTaskExecutor executor;

    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        System.out.println("Shutting down async tasks...");
        executor.setWaitForTasksToCompleteOnShutdown(true); // 等待任務完成
        executor.setAwaitTerminationSeconds(10); // 最多等10秒
        executor.shutdown();
    }
}

三、K8s配置配合

1. 設置寬限期

  • 在Pod配置中延長terminationGracePeriodSeconds,給Java足夠關閉時間:
apiVersion: v1
kind: Pod
metadata:
  name: spring-boot-app
spec:
  containers:
  - name: app
    image: spring-boot-app:latest
    terminationGracePeriodSeconds: 60  # 寬限期60秒

2. 添加preStop鉤子

  • 在容器停止前執行腳本,通知應用準備下線:
spec:
  containers:
  - name: app
    image: spring-boot-app:latest
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "curl -X POST http://localhost:8080/actuator/shutdown"]
    ports:
    - containerPort: 8080
  • Spring Boot啟用Actuator:
management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=shutdown
  • 說明:preStop調用/actuator/shutdown,觸發Spring上下文關閉。

3. 配置Readiness Probe

  • 讓K8s感知應用不再就緒,移除流量:
spec:
  containers:
  - name: app
    readinessProbe:
      httpGet:
        path: /actuator/health/readiness
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
  • Java代碼:關閉時更新健康狀態:
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;

@Component
public class ShutdownHealthIndicator implements HealthIndicator {
    private volatile boolean isShuttingDown = false;

    public void setShuttingDown(boolean shuttingDown) {
        this.isShuttingDown = shuttingDown;
    }

    @Override
    public Health health() {
        return isShuttingDown ? Health.down().build() : Health.up().build();
    }
}

@Component
public class ShutdownListener implements ApplicationListener<ContextClosedEvent> {
    @Autowired
    private ShutdownHealthIndicator healthIndicator;

    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        healthIndicator.setShuttingDown(true); // 標記下線
    }
}

四、完整流程

  1. K8s發起停止:
  • 發送SIGTERM,觸發preStop。
  1. Java響應:
  • /actuator/shutdown關閉Spring上下文。
  • Readiness Probe返回DOWN,K8s移除流量。
  • Tomcat暫停新請求,等待現有請求完成。
  • 異步任務執行完畢。
  1. Pod終止:
  • 寬限期(60秒)內完成,K8s發送SIGKILL。

五、驗證與優化

  • 測試:
kubectl delete pod spring-boot-app
# 檢查日志,確保"Shutdown complete"打印,且無請求中斷
  • 優化:

動態等待:根據活躍連接數(Tomcat getActiveCount)調整睡眠時間。

超時控制:若任務未完成,記錄日志并強制退出。

六、總結

  • Java層:通過ContextClosedEvent捕獲信號,優雅關閉Tomcat和異步任務。
  • K8s配合:設置terminationGracePeriodSeconds、preStop和Readiness Probe,確保流量移除和資源釋放。
  • 效果:請求零中斷,數據一致性保障。
責任編輯:武曉燕 來源: 科學隨想錄
相關推薦

2023-12-26 15:05:00

Linux共享內存配置

2022-04-29 10:40:38

技術服務端K8s

2022-04-22 13:32:01

K8s容器引擎架構

2019-04-29 08:41:44

K8S集群節點

2023-11-06 07:16:22

WasmK8s模塊

2019-05-17 15:16:24

Kubernetes容器集群

2023-09-06 08:12:04

k8s云原生

2022-06-14 09:49:10

K8sLinuxKubernetes

2023-11-30 08:08:30

k8s優雅停機

2023-05-25 21:38:30

2023-08-03 08:36:30

Service服務架構

2023-08-04 08:19:02

2023-09-15 07:34:15

AIOps云原生項目

2020-05-12 10:20:39

K8s kubernetes中間件

2022-09-05 08:26:29

Kubernetes標簽

2021-12-08 07:55:53

K8S WebhookKubernetes

2021-05-07 09:31:33

KindK8s Operator

2022-01-11 07:59:15

K8S KubernetesAirflow

2023-07-04 07:30:03

容器Pod組件

2022-08-15 09:49:28

K8s云原生
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品在线看 | 欧美一区二区三区大片 | 中文字幕av亚洲精品一部二部 | 免费av手机在线观看 | 成人婷婷 | 亚洲97| 波多野结衣中文视频 | 成人久草 | 亚洲一区二区视频 | 夜夜精品浪潮av一区二区三区 | 精品久久久一区二区 | 综合亚洲视频 | 国产精品久久久久一区二区三区 | 国产高潮av | 国内久久 | 奇米久久 | 精品欧美色视频网站在线观看 | 999国产精品视频免费 | 男女在线免费观看 | 91精品久久久久久久久中文字幕 | 成人一级黄色毛片 | 久久夜视频 | 精品亚洲一区二区三区四区五区 | 在线观看亚洲欧美 | 天堂资源 | 国产一区二区三区四区五区3d | 99精品国产一区二区青青牛奶 | 成人性生交大免费 | 亚洲精品一区在线 | 精品国产欧美一区二区三区成人 | 久久99精品久久久久久噜噜 | 美女黄网站 | 国产又色又爽又黄又免费 | 国产欧美精品区一区二区三区 | 免费午夜剧场 | 永久www成人看片 | 韩日有码 | 成人午夜网站 | 日日干天天干 | 中文字幕日韩一区 | 国产精品视频一二三区 |