php實戰kong做微服務架構六(主動健康檢查與熔斷)
- 序言
- 健康檢查
- 主動檢查
- 熔斷
- 恢復
- 優缺點
- 業務應用
- 源代碼
- 作者最后的話
序言
通過上篇你應該了解到了如何使用kong實作動態的負載均衡,以及kong提供的環形均衡器的作用,
本篇將在環形均衡器的基礎上,講解如何實作健康檢查與熔斷,
健康檢查
在當下復雜的網路環境與現實環境眾多因素的影響中,單臺主機發生故障的幾率大大提升,我們在現實業務中,需要了解每臺主機的情況,
-
一個大栗子:
-
- 我們的作業如同路面施工者,
- 對壞的路面需要維修,
- 同時在壞的路面前方防止障礙物,讓車輛避過,行駛在安全無危險的路面上,
大栗子決議:
-
- 開開心心上班的你
- 發現某個服務器宕機了
- 將流量引到其他服務器
在這里kong允許我們檢查上游服務所配置的多個目標是否在正常作業,如果出現目標作業失敗現象,流量將被引導向正常作業目標,
kong將檢查部分分為主動檢查與被動檢查(斷路器),
主動檢查
kong將定期主動請求http與https目標,并對目標回應判斷其健康與否,并且自動在環形均衡器中禁止此目標,
熔斷
此處稱為被動健康檢查,是我們常說的斷路器,當發生問題后可以主動斷開連接,本篇將稱呼其為被動健康檢查,
kong將請求轉發到目標后,當目標變得無回應,斷路器將檢查到這一問題,并將之標記為不健康,kong提供的環形均衡器將跳過這一目標,達到熔斷的目的,
恢復
通過kong提供的管理員API可以非常方便的回復目標健康狀態,
注意:
- kong不會主動恢復標記健康,需人工操作,
- 恢復后廣播所有節點,節點重置健康記錄,恢復服務,
優缺點
- 被動檢查不消耗額外流量,是在對目標正常訪問程序中標記的,主動檢查需要額外的定時檢查,
- 主動檢查無需人工操作,被動檢查需要我們操作api恢復,
- 主動檢查會將健康目標配置為探測端點,環形均衡器將向配置為探測端點的每個網路端點轉發流量,被動則無需,
業務應用
在具體業務中,我們一般將兩種方式結合起來,
- 被動檢查檢測目標健康狀態,實行標記,
- 主動檢查在目標不健康時應用,這個時候目標可以自行啟動,環形均衡器正常分配流量,
emmm所以嘛~~被動恢復的api本篇不介紹^^
源代碼
健康檢查是在upstream上開啟配置的,
<?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就不截圖了~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/264817.html
標籤:其他

