使用ASP.NET Core 实现Docker的HealthCheck指令
?寫(xiě)在前面
? ? ? ? ?HealthCheck 不僅是對(duì)應(yīng)用程序內(nèi)運(yùn)行情況、數(shù)據(jù)流通情況進(jìn)行檢查, 還包括應(yīng)用程序?qū)ν獠糠?wù)或依賴(lài)資源的健康檢查。
健康檢查通常是以暴露應(yīng)用程序的HTTP端點(diǎn)的形式?實(shí)施,可用于配置健康探測(cè)的的場(chǎng)景有 :
容器或負(fù)載均衡器 探測(cè)應(yīng)用狀態(tài),執(zhí)行既定策略,例如:容器探測(cè)到應(yīng)用unhealthy可終止后續(xù)的滾動(dòng)部署或者重啟容器;負(fù)載均衡器探測(cè)到實(shí)例unhealthy能將請(qǐng)求路由到健康的運(yùn)行實(shí)例。
對(duì)應(yīng)用程序種依賴(lài)的第三方服務(wù)進(jìn)行健康探測(cè),比如redis、database、外部服務(wù)接口
內(nèi)存、硬盤(pán)、網(wǎng)絡(luò)等物理依賴(lài)資源的探測(cè)
HealthCheck提供一種?告知外部應(yīng)用運(yùn)行狀態(tài)的機(jī)制。
容器HEALTHCHECK指令
一般情況下我們很容易知道容器正在運(yùn)行[running], 但容器作為相對(duì)獨(dú)立的應(yīng)用執(zhí)行環(huán)境,有時(shí)候并不知道容器是否以預(yù)期的方式正確運(yùn)作[working]
Dockerfile/ docker-compose.yml文件提供的 HEALTHCHECK指令提供了探測(cè)容器正確工作的輪詢(xún)機(jī)制,輪詢(xún)內(nèi)容可由應(yīng)用自身決定。
該指令定義輪詢(xún)參數(shù)interval、探測(cè)超時(shí)參數(shù)timeout、 重試參數(shù)retries 進(jìn)行不間斷探測(cè)容器:
// 通過(guò)在容器內(nèi)運(yùn)行shell命令來(lái)探測(cè)容器健康狀態(tài), 命令返回值0表示容器healthy, 命令返回值1表示unhealthyEALTHCHECK [OPTIONS] CMD command對(duì)于容器內(nèi)Web應(yīng)用,自然而然會(huì)想到使用暴露HTTP端點(diǎn)的方式去探測(cè),并將error response認(rèn)定為unhealthy
// 容器每隔5min請(qǐng)求應(yīng)用程序的http://localhost(重試3次),成功響應(yīng)則返回0,錯(cuò)誤響應(yīng)則返回1HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMD curl -f http://localhost:5000/healthz || exit 1下面我們會(huì)將漸進(jìn)式演示?使用Docker平臺(tái)的HEALTHCHECK指令對(duì)接 ASP.NET Core程序的健康檢查能力。
?
?ASP.NET Core 實(shí)現(xiàn)HealthCheck
? ASPNET Core在2.2版本內(nèi)置了健康檢查的能力, 使用的是一個(gè)HealthCheck Middleware, 該中間件是一個(gè)終端中間件,滿(mǎn)足該路徑的url請(qǐng)求,將會(huì)被該中間件處理。
public void ConfigureServices(IServiceCollection services){
services.AddHealthChecks();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/healthcheck");
}
? 請(qǐng)求/healthcheck端點(diǎn), 程序會(huì)進(jìn)行健康檢查邏輯并響應(yīng)輸出, 默認(rèn)的行為:
? ? ?① 對(duì)healthy、degraded狀態(tài)返回200 OK 響應(yīng)碼; 對(duì)于unhealthy返回503 Service Unavailable?響應(yīng)碼
? ? ?② 響應(yīng)體只會(huì)包含簡(jiǎn)單的HealthStatus枚舉字符串
? ? ?③ 將每次健康檢查的結(jié)果寫(xiě)入HealthReport對(duì)象。
? ?作為企業(yè)級(jí)項(xiàng)目,存在對(duì)Web項(xiàng)目物理資源和服務(wù)依賴(lài)的健康檢查需求, 這里我們?yōu)楸苊庵貜?fù)造輪子,引入了開(kāi)源的力量。
?開(kāi)源社區(qū)對(duì)HealthCheck的支持
開(kāi)源的企業(yè)級(jí)AspNetCore.Diagnostics.HealthChecks系列組件,該系列組件支持多種物理資源和服務(wù)依賴(lài)的健康檢查,支持報(bào)告推送,支持友好的檢查報(bào)告UI(支持后臺(tái)輪訓(xùn)檢查)、支持webhook通知。
下面的步驟演示了對(duì)web程序HTTP請(qǐng)求、Redis、Sqlite等服務(wù)進(jìn)行健康檢查的端點(diǎn)配置
? ? ① 引入AspNetCore.HealthChecks.Redis 、 AspNetCore.HealthChecks.Sqlite nuget庫(kù)
? ? ② startup中配置并啟用健康檢查
// 以下代碼截取自Startup.Configure方法: 啟用/healthz作為檢查端點(diǎn)
app.UseHealthChecks("/healthz").UseMvcWithDefaultRoute(); // 這里仍然只會(huì)響應(yīng) 200/503狀態(tài)碼+簡(jiǎn)單的HealthStatus枚舉值
? ?? 小技巧:你也可以使用UseHealthChecks()擴(kuò)展方法修改默認(rèn)的響應(yīng)輸出, 這里我們可引入HealthChecks.UI.Client nuget package輸出更加詳細(xì)的的HealthReport
app.UseHealthChecks("/healthz", new HealthCheckOptions(){
Predicate = _ => true,
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse // 該響應(yīng)輸出是一個(gè)json,包含所有檢查項(xiàng)的詳細(xì)檢查結(jié)果
});
注意
? ? 上文配置的HEALTHCHECK 指令:?
? ? ? ?HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMD curl -f?http://localhost:5000/healthz?|| exit 1
? ? ??并不關(guān)注響應(yīng)體輸出,依然對(duì)于success response 返回0, error response返回1。
?測(cè)試容器的HEALTHCHECK輸出
? 使用docker ps命令可查看容器的狀態(tài), 通過(guò)docker inspect [container_id] 查看容器HealthCheck的輸出
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES0111ea10581f eqidmanager_proxy "nginx -g 'daemon ..." 24 hours ago Up 24 hours 0.0.0.0:80->80/tcp eqidmanager_proxy_1
8e96a0e8b993 eqidmanager_app "dotnet EqidManage..." 24 hours ago Up 24 hours (healthy) 80/tcp eqidmanager_app_1
容器在啟動(dòng)的時(shí)候是starting, 一旦監(jiān)測(cè)到成功的響應(yīng)狀態(tài)碼,將會(huì)轉(zhuǎn)換為healthy 并將會(huì)持續(xù)間隔輪詢(xún)檢查。
?附加知識(shí)點(diǎn)
?拋開(kāi)Docker的HEALTHCHECK指令、負(fù)載均衡器的輪詢(xún)機(jī)制不談,我們的Web自身也可以進(jìn)行 輪詢(xún)健康檢查并給出告警。
就我們上面的Web 實(shí)例來(lái)說(shuō),我們只對(duì)外提供的是一個(gè) /healthcheck 檢查端點(diǎn),引入HealthChecks.UI.dll 將會(huì)在前端生成友好的HealthReport 界面, 該庫(kù)支持后臺(tái)輪詢(xún)檢查、支持webhook 通知。
這里就不展開(kāi)說(shuō)明,自行前往AspNetCore.Diagnostics.HealthChecks查看響應(yīng)文檔,效果如下:
至此,本文內(nèi)容完畢:
? ?-? 使用ASP.NETCore 框架實(shí)現(xiàn)一個(gè)稍復(fù)雜的HealthCheck端點(diǎn)?/healthz
? ? - 使用docker的HEALTHCHECK 指令對(duì)接Web程序健康檢查端點(diǎn)(該能力是實(shí)現(xiàn)容器自愈的基礎(chǔ), 請(qǐng)關(guān)注后續(xù)博文)。
原文地址:https://www.cnblogs.com/mi12205599/p/10837804.html
.NET社區(qū)新聞,深度好文,歡迎訪(fǎng)問(wèn)公眾號(hào)文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的使用ASP.NET Core 实现Docker的HealthCheck指令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【译文】领域模型的五个特征
- 下一篇: asp.net ajax控件工具集 Au