Megosztás a következőn keresztül:


Állapotfigyelés

Tipp.

Ez a tartalom egy részlet a .NET-alkalmazásokhoz készült .NET-alkalmazásokhoz készült eBook, .NET Microservices Architecture című eBookból, amely elérhető a .NET Docs-on vagy egy ingyenesen letölthető PDF-fájlként, amely offline módban is olvasható.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Az állapotfigyelés közel valós idejű információkat biztosít a tárolók és mikroszolgáltatások állapotáról. Az állapotmonitorozás kritikus fontosságú az üzemeltetési mikroszolgáltatások több aspektusa szempontjából, és különösen fontos, ha a vezénylők fázisokban hajtanak végre részleges alkalmazásfrissítéseket, amint azt később ismertetik.

A mikroszolgáltatás-alapú alkalmazások gyakran szívveréseket vagy állapotellenőrzéseket használnak, hogy a teljesítményfigyelőik, ütemezőik és vezénylőik nyomon követhessék a szolgáltatások sokaságát. Ha a szolgáltatások nem tudnak valamilyen "Életben vagyok" jelzést küldeni igény szerint vagy ütemezés szerint, előfordulhat, hogy az alkalmazás kockázatokkal szembesül a frissítések telepítésekor, vagy csak túl későn észleli a hibákat, és nem tudja leállítani azokat a kaszkádolt hibákat, amelyek jelentős leállásokhoz vezethetnek.

A tipikus modellben a szolgáltatások jelentéseket küldenek az állapotukról, és az adatok összesítése az alkalmazás állapotának általános áttekintéséhez történik. Ha vezénylőt használ, egészségügyi információkat adhat meg a vezénylő fürtjének, hogy a fürt ennek megfelelően működjön. Ha az alkalmazáshoz testre szabott, kiváló minőségű állapotjelentésbe fektet be, sokkal könnyebben észlelheti és kijavíthatja a futó alkalmazás problémáit.

Állapotellenőrzések végrehajtása ASP.NET Core-szolgáltatásokban

ASP.NET Core-mikroszolgáltatás vagy webalkalmazás fejlesztésekor használhatja az ASP .NET Core 2.2-ben (Microsoft.Extensions.Diagnostics.HealthChecks) megjelent beépített állapot-ellenőrzési funkciót. A ASP.NET alapvető funkciókhoz hasonlóan az állapot-ellenőrzések szolgáltatásokkal és köztes szoftverekkel is rendelkeznek.

Az állapot-ellenőrzési szolgáltatások és a köztes szoftverek könnyen használhatók, és olyan képességeket biztosítanak, amelyekkel ellenőrizheti, hogy az alkalmazáshoz szükséges külső erőforrások (például egy SQL Server-adatbázis vagy egy távoli API) megfelelően működnek-e. Ha ezt a funkciót használja, eldöntheti azt is, hogy mit jelent az erőforrás kifogástalan állapota, amint azt később elmagyarázzuk.

A funkció hatékony használatához először konfigurálnia kell a szolgáltatásokat a mikroszolgáltatásokban. Másodszor, szüksége van egy előtérbeli alkalmazásra, amely lekérdezi az állapotjelentéseket. Ez az előtér-alkalmazás lehet egyéni jelentéskészítő alkalmazás, vagy maga a vezénylő, amely ennek megfelelően reagál az állapotra.

A HealthChecks funkció használata a háttérbeli ASP.NET mikroszolgáltatásokban

Ebben a szakaszban megtudhatja, hogyan implementálhatja a HealthChecks funkciót egy minta ASP.NET Core 8.0 Web API-alkalmazásban a Microsoft.Extensions.Diagnostics.HealthChecks csomag használatakor. Ennek a funkciónak az implementációját egy nagy méretű mikroszolgáltatásban, például az eShopOnContainersben a következő szakaszban ismertetik.

Először meg kell határoznia, hogy mi minősül kifogástalan állapotnak az egyes mikroszolgáltatásokhoz. A mintaalkalmazásban meghatározzuk, hogy a mikroszolgáltatás kifogástalan állapotú-e, ha az API HTTP-en keresztül érhető el, és a kapcsolódó SQL Server-adatbázis is elérhető.

A .NET 8-ban a beépített API-k segítségével konfigurálhatja a szolgáltatásokat, és így adhat hozzá állapotellenőrzést a mikroszolgáltatáshoz és annak függő SQL Server-adatbázisához:

// 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" });

Az előző kódban a services.AddHealthChecks() metódus egy alapszintű HTTP-ellenőrzést konfigurál, amely egy 200-ás állapotkódot ad vissza "Kifogástalan" értékkel. A bővítménymetódus emellett konfigurál egy egyéni SqlConnectionHealthCheck beállítást, AddCheck() amely ellenőrzi a kapcsolódó SQL Database állapotát.

A AddCheck() metódus egy új állapotellenőrzést ad hozzá egy megadott névvel és a típus IHealthCheckimplementálásával. Az AddCheck metódussal több állapotellenőrzést is hozzáadhat, így egy mikroszolgáltatás csak akkor ad "kifogástalan" állapotot, ha az összes ellenőrzése kifogástalan.

SqlConnectionHealthCheckegy egyéni osztály, amely implementál IHealthCheckegy kapcsolati sztring konstruktorparaméterként, és egy egyszerű lekérdezést hajt végre annak ellenőrzésére, hogy az SQL-adatbázishoz való kapcsolat sikeres-e. Akkor adja HealthCheckResult.Healthy() vissza, ha a lekérdezést sikeresen végrehajtották, és FailureStatus egy tényleges kivétellel, amikor meghiúsul.

// 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();
    }
}

Vegye figyelembe, Select 1 hogy az előző kódban az adatbázis állapotának ellenőrzésére használt lekérdezés. A mikroszolgáltatások rendelkezésre állásának monitorozásához a Kuberneteshez hasonló vezénylők rendszeresen végeznek állapot-ellenőrzéseket a mikroszolgáltatások tesztelésére irányuló kérések küldésével. Fontos, hogy az adatbázis-lekérdezések hatékonyak maradjanak, hogy ezek a műveletek gyorsak legyenek, és ne eredményezhessenek nagyobb erőforrás-kihasználtságot.

Végül adjon hozzá egy köztes szoftvert, amely az URL-címre /hcválaszol:

// Program.cs from .NET 8 Web Api sample

app.MapHealthChecks("/hc");

A végpont <yourmicroservice>/hc meghívásakor futtatja az indítási osztály metódusában AddHealthChecks() konfigurált összes állapotellenőrzést, és megjeleníti az eredményt.

HealthChecks implementáció az eShopOnContainersben

Az eShopOnContainers mikroszolgáltatásai több szolgáltatásra támaszkodnak a feladat elvégzéséhez. Az eShopOnContainers mikroszolgáltatása például Catalog.API számos szolgáltatástól függ, például az Azure Blob Storage-tól, az SQL Servertől és a RabbitMQ-tól. Ezért több állapotellenőrzést is hozzáadtunk a AddCheck() módszerrel. Minden függő szolgáltatáshoz hozzá kell adni egy egyéni IHealthCheck implementációt, amely meghatározza a megfelelő állapotot.

Az AspNetCore.Diagnostics.HealthChecks nyílt forráskódú projekt úgy oldja meg ezt a problémát, hogy egyéni állapot-ellenőrzési implementációkat biztosít az egyes vállalati szolgáltatásokhoz, amelyek a .NET 8-ra épülnek. Minden állapot-ellenőrzés különálló NuGet-csomagként érhető el, amely könnyen hozzáadható a projekthez. Az eShopOnContainers széles körben használja őket minden mikroszolgáltatásában.

A mikroszolgáltatásban például a Catalog.API következő NuGet-csomagok lettek hozzáadva:

Screenshot of the AspNetCore.Diagnostics.HealthChecks NuGet packages.

8-7. ábra. Custom Health Checks implementálva a Catalog.API-ban az AspNetCore.Diagnostics.HealthChecks használatával

A következő kódban a rendszer hozzáadja az állapot-ellenőrzési implementációkat minden függő szolgáltatáshoz, majd konfigurálja a köztes szoftvert:

// 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;
}

Végül adja hozzá a HealthCheck köztes szoftvert a "/hc" végpont figyeléséhez:

// HealthCheck middleware
app.UseHealthChecks("/hc", new HealthCheckOptions()
{
    Predicate = _ => true,
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

Mikroszolgáltatások lekérdezése az állapotuk jelentéséhez

Ha konfigurálta az állapot-ellenőrzéseket a cikkben leírtak szerint, és a Mikroszolgáltatás a Dockerben fut, közvetlenül ellenőrizheti a böngészőből, hogy kifogástalan állapotban van-e. Közzé kell tennie a tárolóportot a Docker-gazdagépen, hogy a tárolót a külső Docker-gazdagép IP-címén vagy a host.docker.internal8–8. ábrán látható módon érhesse el.

Screenshot of the JSON response returned by a health check.

8-8. ábra. Egyetlen szolgáltatás állapotának ellenőrzése böngészőből

Ebben a tesztben láthatja, hogy a mikroszolgáltatás (amely az Catalog.API 5101-ös porton fut) kifogástalan állapotú, a 200-os HTTP-állapotot és az állapotinformációkat adja vissza a JSON-ban. A szolgáltatás az SQL Server-adatbázis függőségének és a RabbitMQ-nak az állapotát is ellenőrizte, így az állapot-ellenőrzés kifogástalan állapotúnak minősült.

Watchdogok használata

A watchdog egy különálló szolgáltatás, amely figyelheti az állapotot és a terhelést a szolgáltatások között, és a korábban bevezetett kódtár lekérdezésével jelentést készíthet a HealthChecks mikroszolgáltatások állapotáról. Ez segíthet megelőzni azokat a hibákat, amelyek egyetlen szolgáltatás nézete alapján nem észlelhetők. A watchdogok olyan kódokat is üzemeltethetnek, amelyek felhasználói beavatkozás nélkül végezhetnek szervizelési műveleteket az ismert feltételekhez.

Az eShopOnContainers minta egy olyan weblapot tartalmaz, amely a 8–9. ábrán látható módon megjeleníti a mintaállapot-ellenőrzési jelentéseket. Ez a legegyszerűbb watchdog, amelyet használhat, mivel csak az eShopOnContainers mikroszolgáltatásainak és webalkalmazásainak állapotát mutatja. A figyelők általában akkor is végeznek műveleteket, ha nem megfelelő állapotokat észlelnek.

Szerencsére az AspNetCore.Diagnostics.HealthChecks AspNetCore.HealthChecks.UI NuGet-csomagot is biztosít, amely a konfigurált URI-k állapot-ellenőrzési eredményeinek megjelenítésére használható.

Screenshot of the Health Checks UI eShopOnContainers health statuses.

8-9. ábra. Állapot-ellenőrzési mintajelentés az eShopOnContainersben

Összefoglalva, ez a watchdog szolgáltatás lekérdezi az egyes mikroszolgáltatások "/hc" végpontját. Ez végrehajtja a benne definiált összes állapotellenőrzést, és az összes ellenőrzéstől függően egy teljes állapotot ad vissza. A HealthChecksUI könnyen használható néhány konfigurációs bejegyzéssel és két sornyi kóddal, amelyeket hozzá kell adni a watchdog szolgáltatás Startup.cs .

Mintakonfigurációs fájl az állapot-ellenőrzési felhasználói felülethez:

// 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"
      },
      //...
    ]}
}

Program.cs HealthChecksUI-t hozzáadó fájl:

// 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");

Állapotellenőrzés vezénylők használatakor

A mikroszolgáltatások rendelkezésre állásának monitorozásához az olyan vezénylők, mint a Kubernetes és a Service Fabric, rendszeresen végeznek állapot-ellenőrzéseket a mikroszolgáltatások tesztelésére irányuló kérések küldésével. Ha egy vezénylő megállapítja, hogy egy szolgáltatás/tároló állapota nem megfelelő, leállítja a kérések átirányítását az adott példányra. Emellett általában létrehoz egy új példányt a tárolóból.

A legtöbb vezénylő például állapotellenőrzéssel kezelheti a leállási idő nélküli üzemelő példányokat. A vezénylő csak akkor indítja el a forgalmat a szolgáltatás-/tárolópéldányok felé, ha a szolgáltatás/tároló állapota kifogástalan állapotúra változik.

Az állapotfigyelés különösen akkor fontos, ha egy vezénylő alkalmazásfrissítést hajt végre. Egyes vezénylők (például az Azure Service Fabric) fázisokban frissítik a szolgáltatásokat – például a fürtfelület egyötödét frissíthetik minden alkalmazásfrissítéshez. Az egyidejűleg frissített csomópontokat frissítési tartománynak nevezzük. Miután az egyes frissítési tartományok frissültek, és elérhetők a felhasználók számára, a frissítési tartománynak állapot-ellenőrzéseket kell végrehajtania, mielőtt az üzembe helyezés a következő frissítési tartományra kerül.

A szolgáltatás állapotának egy másik aspektusa a szolgáltatásból származó metrikák jelentése. Ez bizonyos vezénylők, például a Service Fabric állapotmodelljének fejlett képessége. A metrikák azért fontosak a vezénylők használatakor, mert az erőforrás-használat kiegyensúlyozására szolgálnak. A metrikák a rendszerállapot mutatói is lehetnek. Előfordulhat például, hogy egy alkalmazás sok mikroszolgáltatással rendelkezik, és minden példány másodpercenként egy kérelem (RPS) metrikát jelent. Ha egy szolgáltatás több erőforrást (memóriát, processzort stb.) használ, mint egy másik szolgáltatás, a vezénylő áthelyezheti a szolgáltatáspéldányokat a fürtben, hogy megpróbálja fenntartani az erőforrások kihasználtságát.

Vegye figyelembe, hogy az Azure Service Fabric saját Állapotfigyelő modellel rendelkezik, amely fejlettebb az egyszerű állapotellenőrzéseknél.

Speciális monitorozás: vizualizáció, elemzés és riasztások

A figyelés utolsó része az eseménystream vizualizációja, a szolgáltatás teljesítményéről való jelentéskészítés és a probléma észlelésekor történő riasztás. A figyelés ezen aspektusára különböző megoldásokat használhat.

A szolgáltatások állapotát megjelenítő egyszerű egyéni alkalmazásokat használhat, például az AspNetCore.Diagnostics.HealthChecks ismertetésekor megjelenő egyéni oldalt. Vagy használhat fejlettebb eszközöket, például az Azure Monitort , hogy riasztásokat gyűjtsön az események streamje alapján.

Végül, ha az összes eseménystreamet tárolja, a Microsoft Power BI vagy más megoldások, például a Kibana vagy a Splunk használatával vizualizálhatja az adatokat.

További erőforrások