微服務架構中的應用優雅停機主要是指應用實例有計劃且平滑(即不產生需要處理的事故)的退出。應用伺服器的停機主要分為兩類:主動停機和被動停機,而其中主動停機和大部分的被動停機都是可以實現優雅停機。如果應用程式不做優雅停機,則會帶來以下情況:
而我們微服務的優雅升級的目標就是避免以上幾種情況,從而避免人工幹預的工作量和提升微服務架構的服務高可靠。
優雅停機可以解決以下場景:
優雅停機解決不了以下場景:
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的方式進行強制退出,不然可能會等待很長時間。
微服務的優雅停機沒有統一的解決方案,只要抓住核心思想進行設計即可:
引流 → 擋板 → 等待停機
但在微服務架構中,我們可以遵守以下建議規則來設計微服務的優雅停機機制:
微服務應用的優雅停機依其使用者角色的不同,而主要分為兩種:
微服務閘道應用優雅停機設計
其餘各層設備的優雅停機都可從以上兩種類型衍生出解決方案,如:
在業界開源的產品中,許多產品都使用了JDK鉤子的方式來實現優雅停機,如以下產品:
以上是微服務架構—優雅停機方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!