iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Software Development

每天一點 Ktor 3.0:一個月學會 Kotlin 後端開發系列 第 10

Day 10:KHealth 設置容器存活檢查與就緒檢查

  • 分享至 

  • xImage
  •  

在微服務的場景裡面,有個很重要的觀念是,每個容器都是可拋棄的。有可能突然一個容器就掛了,需要隨時重啟這個服務。

所以,確認每個容器的存活與否(liveness)和就緒與否(readiness)是很重要的。

如果框架沒有特別準備的話,有時候我們會自己寫一個簡單的路由,用來確認系統的狀態

不過在 Ktor 裡面,我們可以用 KHealth 這個套件來達成

安裝 KHealth

首先我們先安裝 KHealth

這邊比較特別的是 settings.gradle.kts 內要加上 jitpack.io 的 dependency

dependencyResolutionManagement {
    repositories {
        mavenCentral()
        maven("https://jitpack.io")
    }
}

加好之後,我們就可以在 build.gradle.kts 內加上

implementation 'dev.hayden:khealth:3.0.2'

安裝好之後,我們就可以來看 Ktor 內的寫法

我們可以將監控的邏輯統一放在 configureMonitoring()

fun Application.module() {
    configureMonitoring()
    configureRouting()
}

configureMonitoring() 的實作則是

fun Application.configureMonitoring() {
    install(KHealth)
}

只要安裝好了之後,KHealth 就會幫我們安裝好兩個路由了

我們可以看看路徑內容

curl -i http://0.0.0.0:8080/ready

HTTP/1.1 200 OK
Content-Length: 2
Content-Type: application/json

{}%
curl -i http://0.0.0.0:8080/health

HTTP/1.1 200 OK
Content-Length: 2
Content-Type: application/json

{}%

調整 HTTP Status Code

基本的使用上,這樣已經足夠了!

如果有特別需要調整的部分,比方說專案習慣上使用 202 Accepted 作為成功回傳的 HTTP Status Code

import io.ktor.http.HttpStatusCode

fun Application.configureMonitoring() {
    install(KHealth) {
        successfulCheckStatusCode = HttpStatusCode.Accepted
    }
}

這樣存取時,HTTP Status Code 就會改變

curl -i http://0.0.0.0:8080/ready

HTTP/1.1 202 Accepted
Content-Length: 2
Content-Type: application/json

{}%

調整路由名稱

如果要調整路由名稱,我們可以改 readyCheckPath 或者 healthCheckPath

比方說我們這樣寫

fun Application.configureMonitoring() {
    install(KHealth) {
        successfulCheckStatusCode = HttpStatusCode.Accepted
        readyCheckPath = "readiness"
    }
}

這樣檢查存活的路由就改變了

curl -i http://0.0.0.0:8080/readiness

HTTP/1.1 202 Accepted
Content-Length: 2
Content-Type: application/json

{}%

調整回傳內容

前面我們可以看到,回傳內容固定都是空的 json 物件

我們可以在 readyChecks()healthChecks() 內撰寫檢查的邏輯

比方說我們寫一個永遠會回傳 true 的參數

fun Application.configureMonitoring() {
    install(KHealth) {
        successfulCheckStatusCode = HttpStatusCode.Accepted
        readyCheckPath = "readiness"
        readyChecks {
            check("i am alive") {
                true
            }
        }
    }
}

這時我們在檢查,就會發現多出內容了

curl -i http://0.0.0.0:8080/readiness

HTTP/1.1 202 Accepted
Content-Length: 19
Content-Type: application/json

{"i am alive":true}%

雖然是一個小工具,但是也是有很多可以客製化的地方,是不是很有趣呢?

今天的部分就到這邊,我們明天見!


上一篇
Day 09:Ktor 壓縮回應
下一篇
Day 11:使用 detekt 處理靜態分析,和 ktlint 處理排版
系列文
每天一點 Ktor 3.0:一個月學會 Kotlin 後端開發12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言