在微服務的場景裡面,有個很重要的觀念是,每個容器都是可拋棄的。有可能突然一個容器就掛了,需要隨時重啟這個服務。
所以,確認每個容器的存活與否(liveness)和就緒與否(readiness)是很重要的。
如果框架沒有特別準備的話,有時候我們會自己寫一個簡單的路由,用來確認系統的狀態
不過在 Ktor 裡面,我們可以用 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
{}%
基本的使用上,這樣已經足夠了!
如果有特別需要調整的部分,比方說專案習慣上使用 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}%
雖然是一個小工具,但是也是有很多可以客製化的地方,是不是很有趣呢?
今天的部分就到這邊,我們明天見!