健康檢查,檢查啥,怎麼檢查?

打滾的豬發表於2021-08-10
 
在雲原生時代,容器大多都提供了檢查機制來探測服務的執行狀態(異常自動重啟,擴容等)。如果應用本身就提供一個健康檢查的機制會更友好,更能真實的反映出應用的健康狀態。
 
那麼問題來了,健康檢查具體檢查啥?
 
現有的應用服務,大多依賴很多子系統,一些整合服務,例如資料庫,快取服務,檔案系統,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 , 可以看到已經跑起來了
 

 

 

感謝各位老鐵能看到最後,謝謝 

拜拜~~~(無彩蛋)

 

 

 

 

歡迎各位轉載,轉載文章必須在文章頁面明顯位置給出作者和原文連線,否則保留追究法律責任的權利。
 

相關文章