在雲原生時代,容器大多都提供了檢查機制來探測服務的執行狀態(異常自動重啟,擴容等)。如果應用本身就提供一個健康檢查的機制會更友好,更能真實的反映出應用的健康狀態。
那麼問題來了,健康檢查具體檢查啥?
現有的應用服務,大多依賴很多子系統,一些整合服務,例如資料庫,快取服務,檔案系統,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 , 可以看到已經跑起來了
感謝各位老鐵能看到最後,謝謝
拜拜~~~(無彩蛋)
歡迎各位轉載,轉載文章必須在文章頁面明顯位置給出作者和原文連線,否則保留追究法律責任的權利。