マイクロサービスアーキテクチャ6(アクティブヘルスチェックとサーキットブレーカー)を実行するためのPHPの実際の戦闘コン
序文
前回の記事を通じて、kongを使用して動的な負荷分散を実現する方法と、kongが提供するリングバランサーの役割を学習したはずです。
この記事では、リングイコライザーに基づいてヘルスチェックと融合を実装する方法について説明します。
健康診断
現在の複雑なネットワーク環境と実際の環境における多くの要因の影響では、単一のホストに障害が発生する可能性が大幅に高まります。私たちの実際のビジネスでは、各ホストの状況を理解する必要があります。
-
大きな栗:
-
- 私たちの仕事は道路建設業者のようなものです、
- 悪路は修理する必要があります、
- 同時に、悪路の前にある障害物を防ぎ、車両が障害物を避けて安全で危険のない道路を運転できるようにします。
大きな栗の分析:
-
- 仕事に行って幸せなあなた
- サーバーがダウンしていることがわかりました
- 他のサーバーへの直接トラフィック
ここで、kongを使用すると、アップストリームサービスによって構成された複数のターゲットが正しく機能しているかどうかを確認できます。ターゲット作業が失敗した場合、トラフィックは通常の作業ターゲットに転送されます。
Kongは、検査部分を能動検査と受動検査(サーキットブレーカ)に分けています。
積極的な検査
Kongは、定期的にhttpおよびhttpsターゲットを積極的に要求し、ターゲットに応答して正常かどうかを判断し、リングイコライザーでこのターゲットを自動的に禁止します。
ヒューズ
これはパッシブヘルスチェックと呼ばれ、私たちがよく参照するサーキットブレーカーです。問題が発生した場合は、アクティブに切断できます。この記事では、これをパッシブヘルスチェックと呼びます。
Kongがリクエストをターゲットに転送した後、ターゲットが応答しなくなると、サーキットブレーカーが問題を検出し、異常としてマークします。Kongが提供するリングイコライザーは、この目標をスキップして、融合の目的を達成します。
戻す
Kongが提供する管理者APIを使用すると、ターゲットのヘルスステータスに返信するのに非常に便利です。
注意:
- Kongはマークの健全性を回復するための主導権を握らず、手動操作が必要です。
- 回復後、すべてのノードがブロードキャストされ、ノードはヘルスレコードをリセットしてサービスを復元します。
長所と短所
- パッシブ検査は追加のトラフィックを消費せず、ターゲットへの通常のアクセス中にマークされます。アクティブな検査には、追加の定期的な検査が必要です。
- アクティブ検査では手動操作は不要であり、パッシブ検査ではAPIリカバリを操作する必要があります。
- アクティブインスペクションはヘルスターゲットをプローブエンドポイントとして構成し、リングイコライザーはトラフィックをプローブエンドポイントとして構成された各ネットワークエンドポイントに転送します。パッシブは必要ありません。
ビジネスアプリケーション
特定のビジネスでは、通常、2つの方法を組み合わせます。
- 検出対象のヘルスステータスを受動的にチェックし、マーキングを実装します。
- ターゲットが異常な場合にアクティブチェックが適用されます。このとき、ターゲットは自動的に起動でき、リングイコライザーはトラフィックを正常に分散します。
したがって、emmm ~~パッシブリカバリAPIはこの記事では紹介されていません^^
ソースコード
ヘルスチェックはアップストリームで構成されます。
<?php
/**
* @author: 飘逸的罗伯特
*/
//创建名字为 upstream02 的 upstream
$upstream_data = [
'name' => 'upstream01',
'healthchecks.active.type' => 'http' //探头配置 此处可选【http https tcp】 默认http
//============================================主动检查============================================
'healthchecks.active.http_path' => '/' //主动检测get http请求使用路径
'healthchecks.active.timeout' => 1, //主动检查超时时间 此处设置1秒
'healthchecks.active.concurrency' => 10, //同时主动检查目标数量设置
'healthchecks.active.healthy.interval' => 0, //健康目标主动检查每隔几秒进行 0表示不进行
'healthchecks.active.unhealthy.interval' => 1, //不健康目标主动检查每隔几秒进行 此处设置1秒
'healthchecks.active.unhealthy.timeouts' => 10, //主动检查认为目标不健康的超时时间
//一起配合使用 当检测到响应为对应状态码指定次数,将标记目标为健康
'healthchecks.active.healthy.successes' => 1, //主动检查认为目标健康的成功次数
'healthchecks.active.healthy.http_statuses' => [200, 302], //主动检查健康状态码
//一起配合使用 当检测到响应为对应状态码指定次数,将标记目标为不健康
'healthchecks.active.unhealthy.http_failures' => 1, //主动检查认为目标不健康的失败次数
'healthchecks.active.unhealthy.http_statuses' => [500,505], //主动检查不健康状态码
//============================================被动检查============================================
'healthchecks.passive.unhealthy.timeouts' => 10, //被动检查认为目标不健康的超时时间
//一起配合使用 当检测到响应为对应状态码指定次数,将标记目标为健康
'healthchecks.passive.healthy.successes' => 1, //被动检查认为目标健康的成功次数
'healthchecks.passive.healthy.http_statuses' => [200, 302], //被动检查健康状态码
'healthchecks.passive.unhealthy.http_failures' => 1, //被动检查认为目标不健康的成功次数
'healthchecks.passive.unhealthy.http_statuses' => [500,505], //被动检查不健康状态码s
];
http_request('http://hz12.cn:8001/upstreams', $upstream_data);
/**
* 发送post请求
* @param [string] $url 请求地址
* @param [array] $postdata post参数
* @return [ar] [description]
*/
function http_request($url, $postdata=[]){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
$data = curl_exec();
curl_close($curl);
return $data;
}
著者の最後の言葉
運用効果は前回と同じですが、ダウンタイムの対象はフローに割り当てられず、復旧作業の対象はフローに再配分されます。
emmmmはスクリーンショットを撮りません~~