說(shuō)明
網(wǎng)上關(guān)于consul健康檢查的說(shuō)明有很多,基本都是根據(jù)官方文檔的說(shuō)明來(lái)的,基本上就是一下幾種。
Script+ Interval
HTTP+ Interval
TCP+ Interval
Timeto Live(TTL)
Docker+ interval
本文根據(jù)consul源碼來(lái)分析整個(gè)過(guò)程,來(lái)看一下具體的是怎么實(shí)現(xiàn)的。
是用的源碼為consul-1.9.5的源碼
從api注冊(cè)接口流程中查看check的配置,來(lái)梳理整個(gè)流程
agent/http_register.go 程序入口,找到agent注冊(cè)的代碼

agent/agent_endpoint.go 接口實(shí)現(xiàn),新增服務(wù)的話走AddService邏輯

agent/agent.go 調(diào)用順序是:AddService->addServiceLocked->addServiceInternal,最后進(jìn)入到addCheck

agent/agent.go addCheck里面有一個(gè)switch語(yǔ)句,來(lái)根據(jù)你傳的參數(shù)看你是哪種健康檢查

以http+interval為例,它最終會(huì)配置一個(gè)http.Start()

agent/checks/check.go 最終會(huì)啟一個(gè)協(xié)程,它會(huì)根據(jù)interval時(shí)間來(lái)啟動(dòng)一個(gè)定時(shí)任務(wù),


定時(shí)任務(wù)里面會(huì)有一個(gè)check()函數(shù),它用來(lái)判斷應(yīng)用的狀態(tài)。
創(chuàng)建http失敗會(huì)直接更新應(yīng)用的status

http發(fā)送異常會(huì)更新status為critical
發(fā)送200更新status為passing
發(fā)送429更新status為warning
其余情況更新status為critical

以上就是健康檢查的基本邏輯,其他類型的邏輯與其類似,ttl上報(bào)的這種是應(yīng)用主動(dòng)發(fā)起請(qǐng)求到consul的check/pass接口中。這塊下次在分析源碼。
以上是consul健康檢查的簡(jiǎn)單分析過(guò)程,個(gè)人理解,歡迎討論,留言,有問(wèn)題請(qǐng)指正。