日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

使用ASP.NET Core 实现Docker的HealthCheck指令

發(fā)布時(shí)間:2023/12/4 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用ASP.NET Core 实现Docker的HealthCheck指令 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?寫(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 NAMES
0111ea10581f 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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。