健康狀態(tài)監(jiān)視
已不再支援此瀏覽器。
請(qǐng)升級(jí)至 Microsoft Edge,以利用最新功能、安全性更新和技術(shù)支援。
健康狀態(tài)監(jiān)視
發(fā)行項(xiàng)2024/09/10本文內(nèi)容
在 ASP.NET Core 服務(wù)中實(shí)作健康情況檢查使用監(jiān)視程式使用協(xié)調(diào)器時(shí)的健康狀態(tài)檢查進(jìn)階監(jiān)視:視覺效果、分析和警示其他資源提示
本內(nèi)容節(jié)錄自《容器化 .NET 應(yīng)用程式的 .NET 微服務(wù)架構(gòu)》(.NET Microservices Architecture for Containerized .NET Applications) 電子書,可以在 .NET Docs 上取得,或免費(fèi)下載可供離線閱讀的 PDF。
健康狀態(tài)監(jiān)視功能可提供近即時(shí)的容器和微服務(wù)狀態(tài)資訊。 健康狀態(tài)監(jiān)視功能對(duì)微服務(wù)運(yùn)作的各方面來說都非常重要,尤其當(dāng)協(xié)調(diào)器要分階段執(zhí)行部分應(yīng)用程式升級(jí)時(shí)更是如此,如稍後所說明。
微服務(wù)應(yīng)用程式通常使用活動(dòng)訊號(hào)或健康狀態(tài)檢查,使其效能監(jiān)視器、排程器及協(xié)調(diào)器可以追蹤許多服務(wù)。 如果服務(wù)無法視需求或依排程傳送「運(yùn)作正?!沟挠嵦?hào),當(dāng)您部署更新時(shí)應(yīng)用程式可能會(huì)面臨風(fēng)險(xiǎn),或可能會(huì)太晚偵測到失敗,讓故障一發(fā)不可收拾,進(jìn)而導(dǎo)致全面中斷。
在一般模型中,服務(wù)會(huì)傳送其狀態(tài)報(bào)告,而該彙總資訊可提供應(yīng)用程式健康狀態(tài)的整體檢視。 如果您是使用協(xié)調(diào)器,則可以提供健康情況資訊給協(xié)調(diào)器的叢集,使叢集可以據(jù)以採取行動(dòng)。 如果您為應(yīng)用程式投入自訂的高品質(zhì)健康情況報(bào)告,即可更輕鬆地偵測執(zhí)行中的應(yīng)用程式並修正問題。
在 ASP.NET Core 服務(wù)中實(shí)作健康情況檢查
在開發(fā) ASP.NET Core 微服務(wù)或 Web 應(yīng)用程式時(shí),您可以使用 ASP.NET Core 2.2 中發(fā)行的內(nèi)建健康情況檢查功能 (Microsoft.Extensions.Diagnostics.HealthChecks)。 如同許多 ASP.NET Core 功能,健康情況檢查隨附一組服務(wù)與中介軟體。
健康情況服務(wù)和中介軟體不僅簡單易用,還提供功能讓您驗(yàn)證應(yīng)用程式所需的任何外部資源 (例如 SQL Server 資料庫或遠(yuǎn)端 API) 是否正常運(yùn)作。 使用這個(gè)功能時(shí),您也可以自行決定何種情況下表示資源狀況良好,如我們稍後所說明。
若要有效地使用這個(gè)功能,您需要先在微服務(wù)中設(shè)定服務(wù)。 接著,您需要可查詢健康狀態(tài)報(bào)告的前端應(yīng)用程式。 這裡的前端應(yīng)用程式可能是自訂的報(bào)告應(yīng)用程式,或能根據(jù)健康情況採取動(dòng)作的協(xié)調(diào)器本身。
在您的後端 ASP.NET 微服務(wù)中使用 HealthChecks 功能
在本節(jié)中,您將了解如何在使用 Microsoft.Extensions.Diagnostics.HealthChecks 套件時(shí),在範(fàn)例 ASP.NET Core 8.0 Web API 應(yīng)用程式中實(shí)作 HealthChecks 功能。 在大規(guī)模微服務(wù) (例如 eShopOnContainers) 實(shí)作這個(gè)功能,下一節(jié)將有所說明。
首先,您需要為每個(gè)微服務(wù)定義健康狀態(tài)良好的構(gòu)成項(xiàng)目。 在範(fàn)例應(yīng)用程式中,如果可透過 HTTP 存取微服務(wù) API 且其相關(guān) SQL Server 資料庫亦可供存取,我們會(huì)將微服務(wù)定義為健康狀態(tài)良好。
在 .NET 8 中,您可以使用內(nèi)建 API 來設(shè)定服務(wù),並以下列方式新增微服務(wù)及其相關(guān) SQL Server 資料庫的健康情況檢查:
// Program.cs from .NET 8 Web API sample //... // Registers required services for health checks builder.Services.AddHealthChecks() // Add a health check for a SQL Server database .AddCheck( "OrderingDB-check", new SqlConnectionHealthCheck(builder.Configuration["ConnectionString"]), HealthStatus.Unhealthy, new string[] { "orderingdb" });
在上述程式碼中,services.AddHealthChecks() 方法會(huì)設(shè)定基本 HTTP 檢查,傳回狀態(tài)碼 200,表示「良好」。 此外,AddCheck() 擴(kuò)充方法會(huì)設(shè)定一個(gè)自訂 SqlConnectionHealthCheck,檢查相關(guān) SQL Database 的健康情況。
AddCheck() 方法會(huì)使用指定的名稱和類型為 IHealthCheck 的實(shí)作來新增健康情況檢查。 您可以使用 AddCheck 方法新增多個(gè)健康情況檢查,讓微服務(wù)不會(huì)提供「良好」?fàn)顟B(tài),直到其所有檢查皆為良好為止。
SqlConnectionHealthCheck 是一種自訂類別,其會(huì)實(shí)作 IHealthCheck,而此實(shí)作會(huì)採取連接字串作為建構(gòu)函式參數(shù),並執(zhí)行簡單查詢,以檢查 SQL 資料庫的連線是否成功。 如果查詢執(zhí)行成功,則它會(huì)傳回 HealthCheckResult.Healthy(),若失敗,則會(huì)傳回 FailureStatus 與實(shí)際例外狀況。
// Sample SQL Connection Health Check public class SqlConnectionHealthCheck : IHealthCheck { private const string DefaultTestQuery = "Select 1"; public string ConnectionString { get; } public string TestQuery { get; } public SqlConnectionHealthCheck(string connectionString) : this(connectionString, testQuery: DefaultTestQuery) { } public SqlConnectionHealthCheck(string connectionString, string testQuery) { ConnectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString)); TestQuery = testQuery; } public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken)) { using (var connection = new SqlConnection(ConnectionString)) { try { await connection.OpenAsync(cancellationToken); if (TestQuery != null) { var command = connection.CreateCommand(); command.CommandText = TestQuery; await command.ExecuteNonQueryAsync(cancellationToken); } } catch (DbException ex) { return new HealthCheckResult(status: context.Registration.FailureStatus, exception: ex); } } return HealthCheckResult.Healthy(); } }
重要
Microsoft建議您使用可用的最安全驗(yàn)證流程。 如果您正在連接 Azure SQL,建議使用的驗(yàn)證方法為 Azure 資源受控識(shí)別。
請(qǐng)注意,在上述程式碼中,Select 1 是用來檢查資料庫健康情況的查詢。 為了監(jiān)視您的微服務(wù)可用性,Kubernetes 這類協(xié)調(diào)器會(huì)傳送測試微服務(wù)的要求,以定期執(zhí)行健康情況檢查。 請(qǐng)務(wù)必讓您的資料庫查詢保持效率,以便這些作業(yè)可以快速執(zhí)行,但不會(huì)產(chǎn)生更高的資源使用率。
最後,新增可回應(yīng) url 路徑 /hc 的中介軟體:
// Program.cs from .NET 8 Web Api sample app.MapHealthChecks("/hc");
叫用端點(diǎn) <yourmicroservice>/hc 時(shí),它會(huì)執(zhí)行啟動(dòng)類別中 AddHealthChecks() 方法內(nèi)所設(shè)定的所有健康狀態(tài)檢查,並顯示結(jié)果。
eShopOnContainers 中的 HealthChecks 實(shí)作
eShopOnContainers 中的微服務(wù)依賴多個(gè)服務(wù)來執(zhí)行其工作。 例如,來自 eShopOnContainers 的 Catalog.API 微服務(wù)依賴多個(gè)服務(wù),例如 Azure Blob 儲(chǔ)存體、SQL Server 和 RabbitMQ。 因此,它具有數(shù)個(gè)使用 AddCheck() 方法新增的健康情況檢查。 對(duì)於每項(xiàng)相依服務(wù),需要新增自訂 IHealthCheck 實(shí)作,以定義其各自的健康情況狀態(tài)。
開放原始碼專案 AspNetCore.Diagnostics.HealthChecks 解決了這個(gè)問題,方法為針對(duì)建置於 .NET 8 之上的各項(xiàng)企業(yè)服務(wù)提供自訂健康情況檢查實(shí)作。 每個(gè)健康情況檢查都可當(dāng)成個(gè)別 NuGet 套件提供,然後便可輕鬆地將其新增至專案。 eShopOnContainers 會(huì)在其所有的微服務(wù)中廣泛使用它們。
例如,在 Catalog.API 微服務(wù)中,已新增下列 NuGet 套件:
圖 8-7。 目錄 API 中使用 AspNetCore.Diagnostics.HealthChecks 實(shí)作的自訂健康情況檢查
在下列程式碼中,已針對(duì)每個(gè)相依服務(wù)新增健康情況檢查實(shí)作,然後設(shè)定中介軟體:
// Extension method from Catalog.api microservice // public static IServiceCollection AddCustomHealthCheck(this IServiceCollection services, IConfiguration configuration) { var accountName = configuration.GetValue<string>("AzureStorageAccountName"); var accountKey = configuration.GetValue<string>("AzureStorageAccountKey"); var hcBuilder = services.AddHealthChecks(); hcBuilder .AddSqlServer( configuration["ConnectionString"], name: "CatalogDB-check", tags: new string[] { "catalogdb" }); if (!string.IsNullOrEmpty(accountName) && !string.IsNullOrEmpty(accountKey)) { hcBuilder .AddAzureBlobStorage( $"DefaultEndpointsProtocol=https;AccountName={accountName};AccountKey={accountKey};EndpointSuffix=core.windows.net", name: "catalog-storage-check", tags: new string[] { "catalogstorage" }); } if (configuration.GetValue<bool>("AzureServiceBusEnabled")) { hcBuilder .AddAzureServiceBusTopic( configuration["EventBusConnection"], topicName: "eshop_event_bus", name: "catalog-servicebus-check", tags: new string[] { "servicebus" }); } else { hcBuilder .AddRabbitMQ( $"amqp://{configuration["EventBusConnection"]}", name: "catalog-rabbitmqbus-check", tags: new string[] { "rabbitmqbus" }); } return services; }
最後,新增 HealthCheck 中介軟體來接聽 "/hc" 端點(diǎn):
// HealthCheck middleware app.UseHealthChecks("/hc", new HealthCheckOptions() { Predicate = _ => true, ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse });
查詢微服務(wù)以報(bào)告其健康情況
完成此文章中說明的健康情況檢查設(shè)定並在 Docker 中開始執(zhí)行微服務(wù)之後,您就可以直接從瀏覽器檢查微服務(wù)的健康情況。 您必須在 Docker 主機(jī)中發(fā)佈容器連接埠,以便透過外部 Docker 主機(jī) IP 或 host.docker.internal 存取容器,如圖 8-8 所示。
圖 8-8。 從瀏覽器檢查單一服務(wù)的健康狀態(tài)
在這個(gè)測試中,您可以看到 Catalog.API 微服務(wù) (執(zhí)行於連接埠 5101 上) 良好,並以 JSON 形式傳回 HTTP 狀態(tài) 200 和狀態(tài)資訊。 服務(wù)也已內(nèi)部檢查其 SQL Server 資料庫相依性和RabbitMQ 的健康情況,因此健康情況檢查已自行回報(bào)良好。
使用監(jiān)視程式
監(jiān)視程式是一種可以跨服務(wù)監(jiān)看健康情況和負(fù)載的個(gè)別服務(wù),它會(huì)查詢稍早說明過的 HealthChecks 程式庫以回報(bào)微服務(wù)的健康情況。 這可協(xié)助防止從單一服務(wù)角度無法偵測出的錯(cuò)誤。 監(jiān)視程式也是裝載程式碼的好地方,以針對(duì)已知情況執(zhí)行修復(fù)動(dòng)作,而不需使用者互動(dòng)。
eShopOnContainers 範(fàn)例包含顯示範(fàn)例健康情況檢查報(bào)告的網(wǎng)頁,如圖 8-9 所示。 這是一種最簡單的監(jiān)視程式,因?yàn)樗粫?huì)顯示 eShopOnContainers 中的微服務(wù)和 Web 應(yīng)用程式狀態(tài)。 通常監(jiān)視程式也會(huì)在偵測到健康狀態(tài)不良時(shí)採取動(dòng)作。
幸好,AspNetCore.Diagnostics.HealthChecks 也會(huì)提供 AspNetCore.HealthChecks.UI NuGet 套件,其可用來顯示所設(shè)定 URI 中的健康情況檢查結(jié)果。
圖 8-9。 eShopOnContainers 中的範(fàn)例健康狀態(tài)檢查報(bào)告
總而言之,此監(jiān)視程式服務(wù)會(huì)查詢每個(gè)微服務(wù)的 "/hc" 端點(diǎn)。 其會(huì)執(zhí)行端點(diǎn)中定義的所有健康狀態(tài)檢查,並根據(jù)這所有檢查傳回整體健康狀態(tài)。 HealthChecksUI 輕鬆耗用幾個(gè)設(shè)定項(xiàng)目,以及兩行程式碼,而此程式碼需要新增至監(jiān)視程式服務(wù)的 Startup.cs。
健康情況檢查 UI 的樣本組態(tài)檔:
// Configuration { "HealthChecksUI": { "HealthChecks": [ { "Name": "Ordering HTTP Check", "Uri": "http://host.docker.internal:5102/hc" }, { "Name": "Ordering HTTP Background Check", "Uri": "http://host.docker.internal:5111/hc" }, //... ]} }
新增 HealthChecksUI 的 Program.cs 檔案:
// Program.cs from WebStatus(Watch Dog) service // // Registers required services for health checks builder.Services.AddHealthChecksUI(); // build the app, register other middleware app.UseHealthChecksUI(config => config.UIPath = "/hc-ui");
使用協(xié)調(diào)器時(shí)的健康狀態(tài)檢查
為了監(jiān)視您的微服務(wù)可用性,Kubernetes 和 Service Fabric 這類協(xié)調(diào)器會(huì)傳送測試微服務(wù)的要求,以定期執(zhí)行健康情況檢查。 當(dāng)協(xié)調(diào)器判斷某個(gè)服務(wù)/容器健康狀態(tài)不良時(shí),它會(huì)停止將要求路由至該執(zhí)行個(gè)體。 它通常也會(huì)建立該容器的新執(zhí)行個(gè)體。
比方說,大部分協(xié)調(diào)器可以使用健康狀態(tài)檢查來管理零停機(jī)部署。 只有當(dāng)服務(wù)/容器的狀態(tài)變更為健康狀態(tài)良好時(shí),協(xié)調(diào)器才會(huì)開始將流量路由到服務(wù)/容器的執(zhí)行個(gè)體。
當(dāng)協(xié)調(diào)器執(zhí)行應(yīng)用程式升級(jí)時(shí),健康狀態(tài)監(jiān)視尤為重要。 某些協(xié)調(diào)器 (例如 Azure Service Fabric) 會(huì)分階段升級(jí)服務(wù) — 例如,它們可能會(huì)為每個(gè)應(yīng)用程式升級(jí)進(jìn)行五分之一的叢集介面更新。 在相同時(shí)間升級(jí)的一組節(jié)點(diǎn)即為一個(gè)「升級(jí)網(wǎng)域」。 每個(gè)升級(jí)網(wǎng)域都已升級(jí)並可供使用者使用之後,該升級(jí)網(wǎng)域還必須通過健康狀態(tài)檢查,部署才會(huì)移到下一個(gè)升級(jí)網(wǎng)域。
服務(wù)健康狀態(tài)的另一個(gè)重點(diǎn)是服務(wù)的報(bào)告計(jì)量。 這是 Service Fabric 等協(xié)調(diào)器的一項(xiàng)健康狀態(tài)模型進(jìn)階功能。 使用協(xié)調(diào)器時(shí),計(jì)量非常重要,因?yàn)槠淇捎脕砥胶赓Y源使用狀況。 計(jì)量也是系統(tǒng)健康狀態(tài)的指標(biāo)。 比方說,您的應(yīng)用程式可能有許多微服務(wù),而每個(gè)執(zhí)行個(gè)體都會(huì)報(bào)告每秒要求數(shù) (RPS) 計(jì)量。 如果某一個(gè)服務(wù)比其他服務(wù)使用更多資源 (記憶體、處理器等),協(xié)調(diào)器可以在叢集中移動(dòng)服務(wù)執(zhí)行個(gè)體,以嘗試維護(hù)平均的資源使用率。
請(qǐng)注意,Azure Service Fabric 隨附的健康情況監(jiān)視模型比簡單的健康情況檢查更進(jìn)階。
進(jìn)階監(jiān)視:視覺效果、分析和警示
監(jiān)視的最後一個(gè)部分是視覺化事件資料流、報(bào)告服務(wù)效能,並在偵測到問題時(shí)發(fā)出警示。 您可以使用不同解決方案來進(jìn)行這方面的監(jiān)視。
您可以使用簡單的自訂應(yīng)用程式以顯示服務(wù)狀態(tài),例如在說明 AspNetCore.Diagnostics.HealthChecks 時(shí)介紹過的自訂頁面。 或者,您可以使用 Azure 監(jiān)視器這類更進(jìn)階的工具,以依據(jù)事件資料流來發(fā)出警示。
最後,如果您已儲(chǔ)存所有事件資料流,即可使用 Microsoft Power BI 或 Kibana 或 Splunk 等其他解決方案來視覺化資料。
其他資源
適用於 ASP.NET Core 的 HealthChecks 和 HealthChecks UI
https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks
Service Fabric 健康情況監(jiān)視簡介
https://learn.microsoft.com/azure/service-fabric/service-fabric-health-introduction
Azure 監(jiān)視器
https://azure.microsoft.com/services/monitor/
相關(guān)知識(shí)
保護(hù)視力?做視力健康好少年
生態(tài)環(huán)境部發(fā)佈《“十四五”環(huán)境健康工作規(guī)劃》
健康中國
呵護(hù)青少年視力健康:學(xué)校教室照明改造驗(yàn)收需重視
民生直通車丨謹(jǐn)防“速瘦”“躺瘦”風(fēng)險(xiǎn)——透視“減肥陷阱”
衛(wèi)生部日前發(fā)佈孕産期保健工作管理辦法及規(guī)範(fàn)
關(guān)於印發(fā)《國家環(huán)境保護(hù)環(huán)境與健康工作辦法(試行)》的通知
必瘦站:集團(tuán)背景,集團(tuán)實(shí)力,代言人,皇牌課程,優(yōu)質(zhì)服務(wù),門店信息,
做好重點(diǎn)人群健康監(jiān)測和服務(wù)管理
劉金祥:健康的城市才是幸福的城市
網(wǎng)址: 健康狀態(tài)監(jiān)視 http://www.u1s5d6.cn/newsview496083.html
推薦資訊
- 1發(fā)朋友圈對(duì)老公徹底失望的心情 12775
- 2BMI體重指數(shù)計(jì)算公式是什么 11235
- 3補(bǔ)腎吃什么 補(bǔ)腎最佳食物推薦 11199
- 4性生活姿勢有哪些 盤點(diǎn)夫妻性 10428
- 5BMI正常值范圍一般是多少? 10137
- 6在線基礎(chǔ)代謝率(BMR)計(jì)算 9652
- 7一邊做飯一邊躁狂怎么辦 9138
- 8從出汗看健康 出汗透露你的健 9063
- 9早上怎么喝水最健康? 8613
- 10五大原因危害女性健康 如何保 7828
- 今日水素:陽臺(tái)菜園,居家種出健康芽菜指南
- 運(yùn)動(dòng)女孩的休閑穿搭
- 《居家健康監(jiān)測證明》可在“隨申辦”在線開
- 【便民提示】在線開具“居家健康監(jiān)測證明”
- 健身休閑館如何經(jīng)營管理
- 這個(gè)集運(yùn)動(dòng)、休閑、時(shí)尚為一體的運(yùn)動(dòng)品牌進(jìn)
- 知名運(yùn)動(dòng)休閑服裝品牌
- 江北新區(qū)兩案例入選省級(jí)居家社區(qū)養(yǎng)老服務(wù)典
- 康健園·戰(zhàn)“疫”|慢性病患者如何做好居家
- 北京啟明康健休閑健身中心 (北京市豐臺(tái)區(qū)