就像是出去玩要先查店家有沒有開,可以透過直接打電話給店家、請朋友先協助確認等成本比較低的方式。在服務檢查部分,通常使用「Health Check」。
APISIX提供「主動」和「被動」的檢查機制。
爲了提供APISIX健康檢查端點,我們在「新竹百貨公司」服務節點下,再添加一個檔案充當健康檢查結果,那麼就直接取名這個檔案叫做health.json
:
{"status": "health"}
接著可以透過檢查 http://新竹百貨公司.com:9080/health.json 來檢查健康狀態。(可將端口改成特定節點監聽端口,以檢查特定節點的健康狀態)
示範上設計簡單一點:只要有回傳檔案,HTTP回應狀態碼是200或201就是健康;反之找不到檔案,回應狀態碼是404就是不健康。
欄位 | 值 | 備註 |
---|---|---|
HTTP Path | /health.json |
健康檢查端點 |
Interval | 1 | 檢查間格(秒) |
Successes | 2 | 連續成功2次數健康後,視爲節點健康。恢復轉發請求。 |
HTTP Status | 200 | 回應狀態爲200 視爲健康 |
欄位 | 值 | 備註 |
---|---|---|
Timeouts | 3 | 連線、回應超時3秒同樣視爲不健康 |
Interval | 1 | 檢查間格(秒) |
HTTP Status | 404 | 回應狀態爲404 視爲不健康 |
HTTP Failures | 5 | HTTP檢查累計超過5次,視爲節點不健康。停止轉發請求。 |
TCP Failures | 2 | TCP檢查累計超過2次,視爲節點不健康。停止轉發請求。 |
欄位 | 值 | 備註 |
---|---|---|
HTTP Status | 200 | 回應狀態爲200 視爲健康 |
Successes | 5 | 連續成功5次數健康後,視爲節點健康。恢復轉發請求。 |
欄位 | 值 | 備註 |
---|---|---|
Timeouts | 7 | 連線、回應超時7秒同樣視爲不健康 |
TCP Failures | 2 | TCP檢查累計超過2次,視爲節點不健康。停止轉發請求。 |
HTTP Failures | 2 | HTTP檢查累計超過2次,視爲節點不健康。停止轉發請求。 |
HTTP Status | 404 | 回應狀態爲404 視爲不健康 |
不設定優先序,所有節點都可以去,但仍保留各自權重。測試一百次請求結果:
百貨公司 | 拜訪次數 |
---|---|
新竹巨城 | 31 次 |
新竹SOGO | 31 次 |
新竹大遠百 | 26 次 |
竹北大遠百 | 12 次 |
接著可以透過刪除或重新命名health.json
檔案模擬檢查不健康的情況:
mv health.json unhealth.json
然後會發現APISIX的後臺記錄顯式:unhealthy HTTP increment (5/5) for '(192.168.56.3:8084)'
apisix | 2025/09/07 15:16:48 [warn] 49#49: *1742487 [lua] healthcheck.lua:1150: log(): [healthcheck] (upstream#/apisix/upstreams/583310545831068350) unhealthy HTTP increment (1/5) for '(192.168.56.3:8084)', context: ngx.timer, client: 192.168.56.1, server: 0.0.0.0:9080
apisix | 2025/09/07 15:16:49 [warn] 49#49: *1742616 [lua] healthcheck.lua:1150: log(): [healthcheck] (upstream#/apisix/upstreams/583310545831068350) unhealthy HTTP increment (2/5) for '(192.168.56.3:8084)', context: ngx.timer, client: 192.168.56.1, server: 0.0.0.0:9080
apisix | 2025/09/07 15:16:50 [warn] 49#49: *1742738 [lua] healthcheck.lua:1150: log(): [healthcheck] (upstream#/apisix/upstreams/583310545831068350) unhealthy HTTP increment (3/5) for '(192.168.56.3:8084)', context: ngx.timer, client: 192.168.56.1, server: 0.0.0.0:9080
apisix | 2025/09/07 15:16:51 [warn] 51#51: *1742873 [lua] healthcheck.lua:1150: log(): [healthcheck] (upstream#/apisix/upstreams/583310545831068350) unhealthy HTTP increment (4/5) for '(192.168.56.3:8084)', context: ngx.timer, client: 192.168.56.1, server: 0.0.0.0:9080
apisix | 2025/09/07 15:16:52 [warn] 51#51: *1742992 [lua] healthcheck.lua:1150: log(): [healthcheck] (upstream#/apisix/upstreams/583310545831068350) unhealthy HTTP increment (5/5) for '(192.168.56.3:8084)', context: ngx.timer, client: 192.168.56.1, server: 0.0.0.0:9080
在訪問一百次看看:
百貨公司 | 拜訪次數 |
---|---|
新竹巨城 | 34 次 |
新竹SOGO | 36 次 |
新竹大遠百 | 30 次 |
竹北大遠百 | 0 次 |
這次並沒有像「從百貨公司案例,看懂 APISIX 的負載平衡魔法!」那樣白跑一趟了!
mv unhealth.json health.json; ls
透過恢復health.json
檔案,讓健康檢查重新加入節點。同樣可以在APISIX的後臺記錄看到:healthy SUCCESS increment (2/2) for '(192.168.56.3:8084)'
apisix | 2025/09/07 15:21:29 [warn] 49#49: *1778182 [lua] healthcheck.lua:1150: log(): [healthcheck] (upstream#/apisix/upstreams/583310545831068350) healthy SUCCESS increment (1/2) for '(192.168.56.3:8084)', context: ngx.timer, client: 192.168.56.1, server: 0.0.0.0:9080
apisix | 2025/09/07 15:21:30 [warn] 49#49: *1778310 [lua] healthcheck.lua:1150: log(): [healthcheck] (upstream#/apisix/upstreams/583310545831068350) healthy SUCCESS increment (2/2) for '(192.168.56.3:8084)', context: ngx.timer, client: 192.168.56.1, server: 0.0.0.0:9080
在拜訪一百次結果:
百貨公司 | 拜訪次數 |
---|---|
新竹巨城 | 30 次 |
新竹SOGO | 31 次 |
新竹大遠百 | 26 次 |
竹北大遠百 | 13 次 |