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


 
在雲原生時代,容器大多都提供了檢查機制來探測服務的運行狀態(異常自動重啟,擴容等)。如果應用本身就提供一個健康檢查的機制會更友好,更能真實的反映出應用的健康狀態。
 
那么問題來了,健康檢查具體檢查啥?
 
現有的應用服務,大多依賴很多子系統,一些集成服務,例如數據庫,緩存服務,文件系統,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 , 可以看到已經跑起來了
 

 

 

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

拜拜~~~(無彩蛋)

 

 

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM