Heim > System-Tutorial > LINUX > Hauptteil

Microservice-Architektur – Lösung für elegantes Herunterfahren

王林
Freigeben: 2024-08-07 18:47:02
Original
634 Leute haben es durchsucht
Zusammenfassung: Das ordnungsgemäße Herunterfahren von Anwendungen in der Microservice-Architektur bezieht sich hauptsächlich auf das geplante und reibungslose Beenden von Anwendungsinstanzen (d. h. keine Vorfälle, die behandelt werden müssen).
1 Einführung

Das ordnungsgemäße Herunterfahren von Anwendungen in der Microservice-Architektur bezieht sich hauptsächlich auf das geplante und reibungslose Beenden von Anwendungsinstanzen (d. h. es müssen keine Vorfälle behandelt werden). Das Herunterfahren von Anwendungsservern wird hauptsächlich in zwei Kategorien unterteilt: aktives Herunterfahren und passives Herunterfahren, wobei aktives Herunterfahren und die meisten passiven Herunterfahren ein ordnungsgemäßes Herunterfahren bewirken können. Wenn die Anwendung nicht ordnungsgemäß heruntergefahren wird, treten die folgenden Situationen auf:

  • Datenverlust: Die Daten im Speicher wurden nicht auf der Festplatte gespeichert
  • Dateibeschädigung: Die zu schreibende Datei wurde nicht aktualisiert, was zu einer Dateibeschädigung führt
  • Anfrage verloren: Die in der Warteschlange wartende Anfrage ist verloren
  • Antwort verloren: Die erfolgreiche Transaktion hatte keine Zeit zu antworten
  • Transaktionsunterbrechung: Transaktionen, die bis zu einem Zwischenstatus verarbeitet werden, werden zwangsweise unterbrochen
  • Der Dienst ist nicht offline: Der Upstream-Dienst sendet weiterhin Verbrauchsanfragen an den Downstream-Dienst

Das Ziel des eleganten Upgrades unserer Microservices besteht darin, die oben genannten Situationen zu vermeiden, dadurch den Arbeitsaufwand durch manuelle Eingriffe zu vermeiden und die Servicezuverlässigkeit der Microservice-Architektur zu verbessern.

2 Nutzungsszenarien

Ein ordnungsgemäßes Herunterfahren kann die folgenden Szenarien lösen:

  • PID TÖTEN
  • Die Anwendung wurde unerwartet automatisch beendet (System.exit(n))
  • Verwenden Sie einen Skriptbefehl, um die Anwendung zu stoppen

Ein ordnungsgemäßes Herunterfahren kann die folgenden Szenarien nicht lösen:

  • Plötzlicher Stromausfall
  • Maschinelle physische Zerstörung
  • KILL-9 PID oder taskkill /f /pid
3 ShutdownHook

Das ordnungsgemäße Herunterfahren von Java wird normalerweise durch die Registrierung des ShutdownHooks (Hooks) des JDK erreicht. Wenn das System den Exit-Befehl empfängt, markiert es zunächst das System als im Exit-Status befindlich und empfängt keine neuen Nachrichten mehr und verarbeitet dann den Nachrichtenrückstand. und ruft schließlich Ressourcen auf. Die Recycling-Schnittstelle zerstört die Ressourcen und schließlich verlässt jeder Thread die Ausführung. Ein einfacher Demo-Fall sieht wie folgt aus (einfache Version):

 <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>
    }

}
Nach dem Login kopieren

Timeout-Kontrolle
Normalerweise erfordert das ordnungsgemäße Beenden einen Timeout-Kontrollmechanismus. Wenn die Ressourcenwiederherstellung und andere Vorgänge vor dem Beenden nicht abgeschlossen sind, ruft das Shutdown-Skript direkt KILL -9 PID auf, um das Beenden zu erzwingen lange Zeit.

4 Microservices wurden ordnungsgemäß heruntergefahren

微服务的优雅停机没有统一的解决方案,只要抓住核心思想进行设计即可:
        引流 → 挡板 → 等待停机

但在微服务架构中,我们可以遵守以下建议规则来设计微服务的优雅停机机制:

  • 所有微服务应用都应该支持优雅停机
  • 优先注销注册中心注册的服务实例
  • 待停机的服务应用的接入点标记拒绝服务
  • 上游服务支持故障转移因优雅停机而拒绝的服务
  • 根据具体业务也提供适当的停机接口

微服务应用的优雅停机根据其使用者角色的不同,而主要分为两种类型:

    • 微服务业务应用优雅停机设计:

Microservice-Architektur – Lösung für elegantes Herunterfahren

    • 微服务业务应用优雅停机设计
    • 微服务网关应用优雅停机设计:

Microservice-Architektur – Lösung für elegantes Herunterfahren微服务网关应用优雅停机设计

其余各层设备的优雅停机都可从以上两种类型进行衍生出解决方案,如:

  • 整个后端架构升级,则可从DNS或Nginx直接切换
  • Nginx层升级,则可以从DNS直接切换
5 使用案例

在业界开源的产品中,很多产品都使用了JDK钩子的方式来实现优雅停机,如以下产品:

  • Netty
  • DUBBO

Das obige ist der detaillierte Inhalt vonMicroservice-Architektur – Lösung für elegantes Herunterfahren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:linuxprobe.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!