1. 程式人生 > >.Net Core實現健康檢查

.Net Core實現健康檢查

ASP.NET Core 提供執行狀況檢查中介軟體和庫,以用於報告應用基礎結構元件的執行狀況。
執行狀況檢查由應用程式作為 HTTP 終結點公開。 可以為各種實時監視方案配置執行狀況檢查終結點:

  • 執行狀況探測可以由容器業務流程協調程和負載均衡器用於檢查應用的狀態。 例如,容器業務流程協調程式可以通過停止滾動部署或重新啟動容器來響應失敗的執行狀況檢查。 負載均衡器可以通過將流量從失敗的例項路由到正常例項,來應對不正常的應用。
  • 可以監視記憶體、磁碟和其他物理伺服器資源的使用情況來了解是否處於正常狀態。
  • 執行狀況檢查可以測試應用的依賴項(如資料庫和外部服務終結點)以確認是否可用和正常工作。

這個示例展示資料庫的執行狀態,他在其驗證資料庫連線並返回相應的結果

        [Route("health")]
        public ActionResult Health()
        {
            using (var connection = new SqlConnection("Server=.;Initial Catalog=master;Integrated Security=true"))
            {
                try
                {
                    connection.Open();
                }
                catch (SqlException)
                {
                    return new StatusCodeResult(503);
               
                }
            }

            return new EmptyResult();
        }

當我們請求該地址的時候時,如果連線到資料庫時出現任何連線問題,它將顯示一條包含200狀態程式碼和503狀態程式碼的空訊息​​。

現在基於這些結果狀態碼,我們可以監視系統採取相關的操作。

從.NET Core2.2開始,我們不需要為執行狀態在去自定義檢查控制器和介面,而是框架本身已經為我們提供了執行狀況的檢查服務。

安裝和執行

Install-Package Microsoft.Extensions.Diagnostics.HealthChecks

安裝後,我們需要在Startup.cs檔案的ConfigureServices()和Configure()方法中新增。

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHealthChecks();
        }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app
                .UseHealthChecks("/health");
         
        }

我們在configure()方法中配置完端點後,我們就可以通過 /health來請求檢視我們的應用程式的健康程度的。

但是這樣對於我們剛才的需求是滿足不了的,那麼我們如何自定義我們的健康度檢查呢?

兩種方式來處理

option 1

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHealthChecks()
  .AddCheck("sql", () =>
  {

      using (var connection = new SqlConnection("Server=.;Initial Catalog=master;Integrated Security=true"))
      {
          try
          {
              connection.Open();
          }
          catch (SqlException)
          {
              return HealthCheckResult.Unhealthy();
          }
      }

      return HealthCheckResult.Healthy();

  });
        }

在這裡我們使用匿名方法AddCheck(),來編寫我們的自定義的驗證邏輯,結果是HealthCheckResult物件,該物件包含3個選項

  1. Healthy 健康
  2. Unhealthy 不良
  3. Degraded 降級

option 2

實現IHealthCheck介面並實現CheckHealthAsync()方法,如下所示:

   public class DatabaseHealthCheck : IHealthCheck
        {
            public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken =
             default)
            {
                using (var connection = new SqlConnection("Server=.;Initial Catalog=master;Integrated Security=true"))
                {
                    try
                    {
                        connection.Open();
                    }
                    catch (SqlException)
                    {
                        return  Task.FromResult(HealthCheckResult.Unhealthy());
                    }
                }

                return Task.FromResult(HealthCheckResult.Healthy());

            }
        }

建立該類之後,我們需要通過使用一些有效的唯一名稱,AddCheck ()方法在ConfigureServices()方法中提及該類,如下所示。

     public void ConfigureServices(IServiceCollection services)
        {
            services.AddHealthChecks()  
          .AddCheck<DatabaseHealthCheck>("sql");
        }

現在我們的程式碼就寫完了,我們可以像上面那樣新增任意數量的Health Task,它將按照我們在此處宣告的順序執行。

自定義狀態碼

在之前我們也說過200為健康,503為不健康那麼Healthcheck服務甚至通過以下方式使用其options物件提供自定義狀態程式碼,為我們提供了更改此預設的狀態碼。

config.MapHealthChecks("/health", new HealthCheckOptions
                     {
                        ResultStatusCodes = new Dictionary<HealthStatus, int> { { HealthStatus.Unhealthy, 420 }, { HealthStatus.Healthy, 200 }, { HealthStatus.Degraded, 419 } }

                         
                     }); 

自定義輸出

我們可以自定義輸出,以獲取有關每個執行狀況檢查任務的更清晰詳細的資訊。如果我們有多個執行狀況檢查任務來分析哪個任務使整個服務健康狀態變為”不正常“,這將非常有用。

我們可以通過HealthCheckOptions ResponseWriter屬性來實現。

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app
                 .UseRouting()
                 .UseEndpoints(config =>
                 {
                     config.MapHealthChecks("/health", new HealthCheckOptions
                     {
                        ResponseWriter=CustomResponseWriter
                        
                     }); 

                 });

        }
        private static Task CustomResponseWriter(HttpContext context, HealthReport healthReport)
        {
            context.Response.ContentType = "application/json";

            var result = JsonConvert.SerializeObject(new
            {
                status = healthReport.Status.ToString(),
                errors = healthReport.Entries.Select(e => new
                {
                    key = e.Key,
                    value = e.Value.Status.ToString()
                })
            });
            return context.Response.WriteAsync(result);

        }

相關推薦

.Net Core實現健康檢查

ASP.NET Core 提供執行狀況檢查中介軟體和庫,以用於報告應用基礎結構元件的執行狀況。 執行狀況檢查由應用程式作為 HTTP 終結點公開。 可以為各種實時監視方案配置執行狀況檢查終結點: 執行狀況探測可以由容器業務流程協調程和負載均衡器用於檢查應用的狀態。 例如,容器業務流程協調程式可以通過停止滾動

在.NET Core實現健康檢查

.NET Core中提供了開箱即用的執行狀況檢查,首先,我將在.NET Core API應用程式中執行執行狀況檢查,接下來,我們將使用DbContext整合SQL Server或資料庫的執行狀況檢查,最後是如何實現自定義服務的執行狀況檢查。 ![](https://blog-1259586045.cos.a

Docker系列(五):.Net Core實現k8s健康探測機制

        k8s通過liveness來探測微服務的存活性,判斷什麼時候該重啟容器實現自愈。比如訪問 Web 伺服器時顯示 500 內部錯誤,可能是系統超載,也可能是資源死鎖,此時 httpd 程序並沒有異常退出,在這種情況下重啟容器可能是最直接最有效的解決方案。

ASP.NET Core實現強類型Configuration讀取配置數據

控制器 項目 最好 前言實現讀取JSON文件幾種方式,在項目中采取老辦法簡單粗暴,結果老大過來一看,恩,這樣不太可取,行吧那我就用.NET Core中最新的方式諾,切記,適合的才是最好的,切勿懶。.NET Core讀取JSON文件通過讀取文件方式 當我將VS2015項目用VS2017打開後

ASP.NET Core實現類庫項目讀取配置文件

services 應用程序 配置文件 builder public .NET Core類庫項目讀取JSON配置文件在應用程序目錄下添加JSON文件是進行如下配置: var builder = new ConfigurationBuilder()

.net core實現redisClient

array chan closed setevent highlight 方式 master 不同的 hub 引言   最近工作上有需要使用redis,於是便心血來潮打算自己寫一個C#客戶端。經過幾天的努力,目前該客戶端已經基本成型,下面簡單介紹一下。 通信協議   要想自

使用靜態基類方案讓 ASP.NET Core 實現遵循 HATEOAS Restful Web API

以及 acc repo pri == single partially context 繼承 Hypermedia As The Engine Of Application State (HATEOAS) HATEOAS(Hypermedia as the engi

用C# (.NET Core) 實現抽象工廠設計模式

show 技術 例如 mtom src box gif 一起 off 本文的概念性內容來自深入淺出設計模式一書. 上一篇文章講了簡單工廠和工廠方法設計模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披薩店的例子. 文

ASP.NET Core 實現跨站登錄重定向的新解藥

help builder config star path .cn account startup 新的 作為 .NET 程序員,痛苦之一是自從 ASP.NET 誕生之日起直到最新的 ASP.NET Core 都無法直接實現跨站登錄重定向(比如訪問 https://q.cn

.net core實現前後端徹底分離

方法 red app rtu runtime query exception get header 問題的關鍵在跨域 1.我們在services裏面 添加跨域內容如下: public void ConfigureServices(IServiceCollection se

.net core 實現npoi導出

new border set core write idt tom var index public void ExportDataToExcel() { var workbook = new HSSFWorkbook();

.net core實現跨域

什麼是跨域在前面已經講解過了,這裡便不再講解,直接上程式碼。 一、後臺API介面 用.net core建立一個Web API專案負責給前端介面提供資料。 二、前端介面 建立兩個MVC專案,模擬不同的ip,在view裡面新增按鈕呼叫WEB API提供的介面進行測試跨域。view檢視頁程式碼如下:

使用 .NET Core 實現依賴關係注入

為什麼使用依賴關係注入? 使用 .NET,通過 new 運算子(即,new MyService 或任何想要例項化的物件型別)呼叫建構函式即可輕鬆實現物件例項化。遺憾的是,此類呼叫會強制實施客戶端(或應用程式)程式碼到已例項化物件的緊密耦合的連線(硬編碼的引用),此外

spring cloud + .net core實現微服務架構

1.新建spring boot專案 2.新增spring-cloud-starter-eureka-server依賴(需提供版本資訊) <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-star

[C#]使用 Jenkins + TFS 為 .Net Core 實現持續整合/部署

在前後端分離開發的專案當中為了避免重複構建釋出,我們需要部署一個持續釋出環境,而目前的開發環境伺服器都是基於 CentOS 的,因此每次在本地釋出之後還需要打包,上傳,部署,十分繁瑣。故這裡採用了比較成熟的Jenkins 作為持續部署環境。 為了方便安裝,我們這裡使用了 Docker 來進行安裝,至於 Doc

Net Core 實現谷歌翻譯ApI 免費版

display rst 助手 dto 獲取 ice image htm bsp 原文:Net Core 實現谷歌翻譯ApI 免費版  由於谷歌翻譯官方API是付費版本,本著免費和開源的精神。分享一下用 Net Core 實現谷歌翻譯API的代碼。 項目引用的Nuge

Asp.Net Core 實現服務的批量註冊註入

wid ant 技術分享 註入 image html hive png nbsp 原文:Asp.Net Core 實現服務的批量註冊註入 Asp.Net Core 實現服務的批量註冊註入

ASP.NET Core實現OAuth2.0的AuthorizationCode模式

ASP.NET Core實現OAuth2的AuthorizationCode模式 授權伺服器 Program.cs --> Main方法中:需要呼叫UseUrls設定IdentityServer4授權服務的IP地址 1 var hos

用.NET Core實現一個類似於餓了嗎的簡易拆紅包功能

  需求說明 以前很討厭點外賣的我,最近中午經常點外賣,因為確實很方便,提前點好餐,算準時間,就可以在下班的時候吃上飯,然後省下的那些時間就可以在中午的時候多休息一下了。 點餐結束後,會有一個好友分享紅包功能,雖說這個紅包不能提現,但卻可以抵扣點餐費用,對於經常點餐的人來說,直接用於抵扣現金確

ASP.NET Core - 實現自定義WebApi模型驗證

  Framework時代     在Framework時代,我們一般進行引數驗證的時候,以下程式碼是非常常見的 [HttpPost] public async Task<JsonResult> SaveNewCustomerAsnyc(AddCustom