首頁  >  文章  >  系統教程  >  微服務架構—優雅停機方案

微服務架構—優雅停機方案

王林
王林原創
2024-08-07 18:47:02629瀏覽
摘要: 微服務架構中的應用優雅停機主要是指應用實例有計劃而平滑(即不產生需要處理的事故)的退出。
1 介紹

微服務架構中的應用優雅停機主要是指應用實例有計劃且平滑(即不產生需要處理的事故)的退出。應用伺服器的停機主要分為兩類:主動停機和被動停機,而其中主動停機和大部分的被動停機都是可以實現優雅停機。如果應用程式不做優雅停機,則會帶來以下情況:

  • 資料遺失:記憶體的中資料尚未持久化至磁碟
  • 檔案損壞:正在操作寫的檔案因沒有更新完成,導致檔案損壞
  • 請求遺失:排隊中等待處理的請求遺失
  • 回應遺失:成功的交易還來不及回應
  • 交易中斷:正在處理至中間狀態的交易被強制中斷
  • 服務未下線:上游服務仍會繼續往下游服務發送消費請求

而我們微服務的優雅升級的目標就是避免以上幾種情況,從而避免人工幹預的工作量和提升微服務架構的服務高可靠。

2 使用場景

優雅停機可以解決以下場景:

  • KILL PID
  • 套用意外自動退出(System.exit(n))
  • 使用腳本指令的方式停止套用

優雅停機解決不了以下場景:

  • 突然斷電
  • 機器物理破壞
  • KILL-9 PIDtaskkill /f /pid
3 ShutdownHook

Java的優雅停機通常透過註冊JDK的ShutdownHook(鉤子)來實現,當系統接收到退出指令後,首先標記系統處於退出狀態,不再接收新的訊息,然後將積壓的訊息處理完,最後呼叫資源回收介面將資源銷毀,最後各執行緒退出執行。簡單的使用demo案例如下(簡單版):

 <span class="hljs-comment">/**
 * 优雅停机处理方式
 * 
 * <span class="hljs-doctag">@author</span> lry
 **/</span>
<span class="hljs-keyword"><span class="hljs-selector-tag">public</span></span> <span class="hljs-class"><span class="hljs-keyword"><span class="hljs-selector-tag">class</span></span> <span class="hljs-title"><span class="hljs-selector-tag">Main</span></span></span>{

    <span class="hljs-comment">/**
     * 启动应用
     **/</span>
    <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-selector-tag">public</span></span> <span class="hljs-keyword"><span class="hljs-selector-tag">void</span></span> <span class="hljs-title"><span class="hljs-selector-tag">start</span></span><span class="hljs-params">()</span></span>{
        <span class="hljs-comment">// 第一步:启动应用服务……</span>

        <span class="hljs-comment">// 第二步:注册JDK钩子</span>
        <span class="hljs-selector-tag">Runtime</span><span class="hljs-selector-class">.getRuntime</span>()<span class="hljs-selector-class">.addShutdownHook</span>(<span class="hljs-keyword">new</span> Thread(<span class="hljs-keyword">new</span> Runnable() {
            <span class="hljs-meta"><span class="hljs-variable">@Override</span></span>
            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span> </span>{
                System.out.println(<span class="hljs-string">"The hook running..."</span>);
                <span class="hljs-comment">//第三步:调用停机处理</span>
                stop();
            }
        }));
    }

    <span class="hljs-comment">/**
     * 停止应用
     **/</span>
    <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-selector-tag">public</span></span> <span class="hljs-keyword"><span class="hljs-selector-tag">void</span></span> <span class="hljs-title"><span class="hljs-selector-tag">stop</span></span><span class="hljs-params">()</span></span>{
        <span class="hljs-comment">// 停止应用前停机处理(如:注销服务、标记不接受请求等)</span>
    }

}

超時控制
通常優雅退出需要有超時控制機制,如果到達超時時間仍然沒有完成退出前的資源回收等操作,則由停機腳本直接調用KILL -9 PID的方式進行強制退出,不然可能會等待很長時間。

4 微服務優雅停機

微服務的優雅停機沒有統一的解決方案,只要抓住核心思想進行設計即可:
        引流 → 擋板 → 等待停機

但在微服務架構中,我們可以遵守以下建議規則來設計微服務的優雅停機機制:

  • 所有微服務應用都應該支援優雅停機
  • 優先註銷註冊中心註冊的服務實例
  • 待停機的服務應用的存取點標記拒絕服務
  • 上游服務支援故障轉移因優雅停機而拒絕的服務
  • 根據特定業務也提供適當的停機介面

微服務應用的優雅停機依其使用者角色的不同,而主要分為兩種:

    • 微服務業務應用優雅停機設計:

微服務架構—優雅停機方案

    • 微服務業務應用優雅停機設計
    • 微服務閘道應用優雅停機設計:

微服務架構—優雅停機方案微服務閘道應用優雅停機設計

其餘各層設備的優雅停機都可從以上兩種類型衍生出解決方案,如:

  • 整個後端架構升級,則可從DNS或Nginx直接切換
  • Nginx層升級,則可以從DNS直接切換
5 使用案例

在業界開源的產品中,許多產品都使用了JDK鉤子的方式來實現優雅停機,如以下產品:

  • Netty
  • DUBBO

以上是微服務架構—優雅停機方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn