在雲原生時代,容器大多都提供了檢查機制來探測服務的運行狀態(異常自動重啟,擴容等)。如果應用本身就提供一個健康檢查的機制會更友好,更能真實的反映出應用的健康狀態。
那么問題來了,健康檢查具體檢查啥?
現有的應用服務,大多依賴很多子系統,一些集成服務,例如數據庫,緩存服務,文件系統,api、rpc等。 某一項子系統或服務失敗,可能導致部分功能不可用。這時候,健康檢查就可以精准定位到問題,配合k8s等容器編排工具,可以實現自動重啟,擴容等操作。
接下來咱們介紹一下,.net core 的健康檢查實現的兩種方式,框架已內置,開箱即用。
一、簡單方式
public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseEndpoints(endpoints => { endpoints.MapControllers(); // 可以自定義名稱 endpoints.MapHealthChecks("/health"); }); }
代碼修改完成后,請求 localhost/health地址會返回 如下

很簡單是不是?就這?直接請求api 根據Http 狀態碼,我也能知道啊。 但是這也不符合咱們的需求啊,這能檢查個啥,數據庫,緩存服務,啥狀態咱也看不出來啊。
別慌,接下來,咱們來看看進階版,支持自定義檢查邏輯的部分
二、支持之定義擴展檢查邏輯
比如想檢查數據庫,中間件、狀態是否正常,可以自定義檢查邏輯
新建類 ApiHealthCheck,集成IHealthCheck 接口,代碼如下
public class ApiHealthCheck : IHealthCheck { public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) { //todo 可自定義邏輯,驗證數據庫連接是否正常 或 中間件,緩存服務是否正常 return HealthCheckResult.Healthy($"API and Database is running."); } }
ApiHealthCheck邏輯寫好后,在Startup 注入咱們的檢查邏輯
public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks() .AddCheck<ApiHealthCheck>("apiHealth")//注入api檢查,key叫 apiHealth .AddCheck<ApiHealthCheck>("sqlHealth");//注入數據庫檢查,key叫 sqlHealth } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseHealthChecks("/healthCheck", //自定義檢查路由,並輸出信息 new HealthCheckOptions { ResponseWriter = WriteResponse }); } //輸出健康檢查信息 private static Task WriteResponse(HttpContext context, HealthReport healthReport) { context.Response.ContentType = "application/json"; //簡易報告 var result = JsonConvert.SerializeObject(new { code = context.Response.StatusCode, errors = healthReport.Entries.Select(e => new { key = e.Key, value = e.Value.Status.ToString() }) }); //var allHealthReport = JsonConvert.SerializeObject(healthReport); 完整的健康報告 return context.Response.WriteAsync(result); }
代碼完成后,輸入自定義的健康檢查路由 localhost/healthCheck 可以看到 上面定義的 api,sql 檢查結果都出來了。(這里只是示例,具體邏輯可以自由發揮)

當然,我們也可以輸出的健康檢查報告,有興趣的同學,可以自己跑下代碼了解。
三、UI
一 般配合K8s 等容器編排工具, 會有更好的界面管理工具。 當然社區提供了 健康檢查的UI 集成,咱們也可以了解一下
Install-Package AspNetCore.HealthChecks.UI Install-Package AspNetCore.HealthChecks.UI.InMemory.Storage //DB服務,一定要安裝,這里咱們安裝一個最簡單的內存模式。還支持各種數據庫及存儲服務
在StartUp 注入UI包
public void ConfigureServices(IServiceCollection services) { services.AddHealthChecksUI(setup => { setup.DisableDatabaseMigrations(); }) .AddInMemoryStorage(); //使用內存緩存 } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseHealthChecksUI(config => config.UIPath = "/hc-ui"); }
注意:網上很多文章沒有配置UI的DB服務,直接運行會報錯,具體看這個文檔
appsetting.json 添加UI配置,(也可通過代碼設置,具體看
文檔)
"HealthChecksUI": { "HealthChecks": [ { "Name": "healthCheck", "Uri": "https://localhost:9288/healthCheck" //這個地址要配置ssl證書,不然訪問不了 } ], "EvaluationTimeinSeconds": 10, "MinimumSecondsBetweenFailureNotifications": 60 }
輸入 localhost/hc-ui , 可以看到已經跑起來了

感謝各位老鐵能看到最后,謝謝
拜拜~~~(無彩蛋)
歡迎各位轉載,轉載文章必須在文章頁面明顯位置給出作者和原文連接,否則保留追究法律責任的權利。