Toepassingen implementeren en verwijderen met FabricClient


Zodra een toepassingstype is verpakt, is het klaar voor implementatie in een Azure Service Fabric-cluster. Implementatie omvat de volgende drie stappen:

  1. Het toepassingspakket uploaden naar het afbeeldingsarchief
  2. Het toepassingstype registreren
  3. Het toepassingspakket verwijderen uit het installatiekopieënarchief
  4. Het toepassingsexemplaren maken

Nadat u een toepassing hebt geïmplementeerd en een exemplaar in het cluster hebt uitgevoerd, kunt u het toepassingsexemplaren en het bijbehorende toepassingstype verwijderen. Verwijder een toepassing volledig uit het cluster door de volgende stappen uit te voeren:

  1. Het actieve toepassingsexemplaren verwijderen (of verwijderen)
  2. Registratie van het toepassingstype ongedaan maken als u dit niet meer nodig hebt

Als u Visual Studio gebruikt voor het implementeren en opsporen van fouten in toepassingen in uw lokale ontwikkelcluster, worden alle voorgaande stappen automatisch afgehandeld via een PowerShell-script. Dit script vindt u in de map Scripts van het toepassingsproject. Dit artikel bevat achtergrondinformatie over wat dat script doet, zodat u dezelfde bewerkingen buiten Visual Studio kunt uitvoeren.

Verbinding maken met het cluster

Verbinding maken naar het cluster door een FabricClient-exemplaar voordat u een van de codevoorbeelden in dit artikel uitvoert. Zie Verbinding maken naar een beveiligd cluster voor voorbeelden van het maken van verbinding met een lokaal ontwikkelcluster of een extern cluster of cluster dat is beveiligd met Behulp van Microsoft Entra ID, X509-certificaten of Windows Active Directory. Voer het volgende voorbeeld uit om verbinding te maken met het lokale ontwikkelcluster:

// Connect to the local cluster.
FabricClient fabricClient = new FabricClient();

Het toepassingspakket uploaden

Stel dat u een toepassing bouwt en verpakt met de naam MyApplication in Visual Studio. De naam van het toepassingstype die wordt vermeld in applicationManifest.xml is standaard 'MyApplicationType'. Het toepassingspakket, dat het benodigde toepassingsmanifest, servicemanifesten en code/config/gegevenspakketten bevat, bevindt zich in C:\Users< username>\Documents\Visual Studio 2019\Projects\MyApplication\MyApplication\pkg\Debug.

Als u het toepassingspakket uploadt, wordt het op een locatie geplaatst die toegankelijk is voor de interne Service Fabric-onderdelen. Service Fabric controleert het toepassingspakket tijdens de registratie van het toepassingspakket. Als u echter het toepassingspakket lokaal wilt controleren (dat wil gezegd vóór het uploaden), gebruikt u de cmdlet Test-ServiceFabricApplicationPackage .

De CopyApplicationPackage-API uploadt het toepassingspakket naar het archief met clusterinstallatiekopieën.

Als het toepassingspakket groot is en/of veel bestanden bevat, kunt u het comprimeren en kopiëren naar het afbeeldingsarchief met behulp van PowerShell. De compressie vermindert de grootte en het aantal bestanden.

Zie Meer informatie over het afbeeldingsarchief verbindingsreeks voor aanvullende informatie over het afbeeldingsarchief en het verbindingsreeks van het afbeeldingsarchief.

Het toepassingspakket registreren

Het toepassingstype en de versie die in het toepassingsmanifest zijn gedeclareerd, zijn beschikbaar voor gebruik wanneer het toepassingspakket is geregistreerd. Het systeem leest het pakket dat in de vorige stap is geüpload, controleert het pakket, verwerkt de inhoud van het pakket en kopieert het verwerkte pakket naar een interne systeemlocatie.

Met de ProvisionApplicationAsync-API wordt het toepassingstype in het cluster geregistreerd en beschikbaar gesteld voor implementatie.

De GetApplicationTypeListAsync-API biedt informatie over alle geregistreerde toepassingstypen. U kunt deze API gebruiken om te bepalen wanneer de registratie is voltooid.

Een toepassingspakket verwijderen uit het installatiekopieënarchief

Het is raadzaam het toepassingspakket te verwijderen nadat de toepassing is geregistreerd. Als u toepassingspakketten verwijdert uit het installatiekopieënarchief, worden systeembronnen vrijgemaakt. Ongebruikte toepassingspakketten verbruiken schijfopslag en leiden tot prestatieproblemen van toepassingen. Verwijder het toepassingspakket uit het installatiekopieënarchief met behulp van de RemoveApplicationPackage-API .

Een toepassingsexemplaren maken

U kunt een toepassing instantiëren vanuit elk toepassingstype dat is geregistreerd met behulp van de CreateApplicationAsync-API . De naam van elke toepassing moet beginnen met het 'fabric:' -schema en moet uniek zijn voor elk toepassingsexemplaren (binnen een cluster). Sstandaardservices gedefinieerd in het toepassingsmanifest van het doeltoepassingstype worden ook aangemaakt.

Er kunnen meerdere toepassingsexemplaren worden gemaakt voor elke versie van een geregistreerd toepassingstype. Elk toepassingsexemplaren worden geïsoleerd uitgevoerd, met een eigen werkmap en een set processen.

Als u wilt zien welke benoemde toepassingen en services worden uitgevoerd in het cluster, voert u de GetApplicationListAsync - en GetServiceListAsync-API's uit.

Een service-exemplaar maken

U kunt een service instantiëren vanuit een servicetype met behulp van de CreateServiceAsync-API . Als de service wordt gedeclareerd als een standaardservice in het toepassingsmanifest, wordt de service geïnstantieerd wanneer de toepassing wordt geïnstantieerd. Als u de CreateServiceAsync-API aanroept voor een service die al is geïnstantieerd, wordt een uitzondering van het type FabricException geretourneerd. De uitzondering bevat een foutcode met de waarde FabricErrorCode.ServiceAlreadyExists.

Een service-exemplaar verwijderen

Wanneer een service-exemplaar niet meer nodig is, kunt u dit verwijderen uit het actieve toepassingsexemplaren door de DeleteServiceAsync-API aan te roepen.

Waarschuwing

Deze bewerking kan niet worden omgekeerd en de servicestatus kan niet worden hersteld.

Een toepassingsexemplaren verwijderen

Wanneer een toepassingsexemplaren niet meer nodig zijn, kunt u het permanent verwijderen met behulp van de DeleteApplicationAsync-API . DeleteApplicationAsync verwijdert automatisch alle services die deel uitmaken van de toepassing, waardoor alle servicestatus definitief wordt verwijderd.

Waarschuwing

Deze bewerking kan niet worden omgekeerd en de toepassingsstatus kan niet worden hersteld.

Registratie van een toepassingstype ongedaan maken

Wanneer een bepaalde versie van een toepassingstype niet meer nodig is, moet u de registratie van die specifieke versie van het toepassingstype ongedaan maken met behulp van de API Unregister-ServiceFabricApplicationType . Bij het ongedaan maken van de registratie van ongebruikte versies van toepassingstypen wordt opslagruimte vrijgemaakt die wordt gebruikt door het installatiekopieënarchief. Een versie van een toepassingstype kan niet worden geregistreerd zolang er geen toepassingen worden geïnstantieerd op basis van die versie van het toepassingstype. Het toepassingstype kan ook geen toepassingsupgrades in behandeling hebben, verwijst naar die versie van het toepassingstype.

Problemen oplossen

Copy-ServiceFabricApplicationPackage vraagt om een ImageStore Verbinding maken ionString

De Service Fabric SDK-omgeving moet al de juiste standaardinstellingen hebben ingesteld. Maar indien nodig moet de ImageStore Verbinding maken ionString voor alle opdrachten overeenkomen met de waarde die het Service Fabric-cluster gebruikt. U vindt de ImageStore Verbinding maken ionString in het clustermanifest, opgehaald met behulp van de opdrachten Get-ServiceFabricClusterManifest en Get-ImageStore Verbinding maken ionStringFromClusterManifest:

PS C:\> Get-ImageStoreConnectionStringFromClusterManifest(Get-ServiceFabricClusterManifest)

De cmdlet Get-ImageStore Verbinding maken ionStringFromClusterManifest, die deel uitmaakt van de Service Fabric SDK PowerShell-module, wordt gebruikt om het installatiekopiearchief op te halen verbindingsreeks. Voer het volgende uit om de SDK-module te importeren:

Import-Module "$ENV:ProgramFiles\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK\ServiceFabricSDK.psm1"

De ImageStore Verbinding maken ionString vindt u in het clustermanifest:

<ClusterManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" Name="Server-Default-SingleNode" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">

    [...]

    <Section Name="Management">
      <Parameter Name="ImageStoreConnectionString" Value="file:D:\ServiceFabric\Data\ImageStore" />
    </Section>

    [...]

Zie Meer informatie over het afbeeldingsarchief verbindingsreeks voor aanvullende informatie over het afbeeldingsarchief en het verbindingsreeks van het afbeeldingsarchief.

Groot toepassingspakket implementeren

Probleem: Time-out voor copyApplicationPackage-API voor een groot toepassingspakket (volgorde van GB). Probeer:

  • Geef een grotere time-out op voor de methode CopyApplicationPackage , met timeout parameter. De time-out is standaard 30 minuten.
  • Controleer de netwerkverbinding tussen uw broncomputer en cluster. Als de verbinding traag is, kunt u overwegen een machine met een betere netwerkverbinding te gebruiken. Als de clientcomputer zich in een andere regio bevindt dan het cluster, kunt u overwegen om een clientcomputer in een dichtere of dezelfde regio als het cluster te gebruiken.
  • Controleer of u externe beperking hebt bereikt. Wanneer het installatiekopieënarchief bijvoorbeeld is geconfigureerd voor het gebruik van Azure Storage, kan uploaden worden beperkt.

Probleem: Het uploaden van het pakket is voltooid, maar er treedt een time-out op voor de ProvisionApplicationAsync-API . Proberen:

  • Comprimeer het pakket voordat u naar het installatiekopiearchief kopieert. De compressie vermindert de grootte en het aantal bestanden, wat op zijn beurt de hoeveelheid verkeer vermindert en het werk dat Service Fabric moet uitvoeren. De uploadbewerking kan langzamer zijn (met name als u de compressietijd opneemt), maar het toepassingstype registreren en de registratie ervan ongedaan maken is sneller.
  • Geef een grotere time-out op voor de ProvisionApplicationAsync-API met timeout parameter.

Toepassingspakket met veel bestanden implementeren

Probleem: Er treedt een time-out op van ProvisionApplicationAsync voor een toepassingspakket met veel bestanden (volgorde van duizenden). Probeer:

Voorbeeld van code

Het volgende voorbeeld kopieert een toepassingspakket naar het installatiekopiearchief en richt het toepassingstype in. Vervolgens wordt in het voorbeeld een toepassingsexemplaren gemaakt en wordt er een service-exemplaar gemaakt. Ten slotte wordt in het voorbeeld het toepassingsexemplaren verwijderd, wordt het toepassingstype ongedaan gemaakt en wordt het toepassingspakket uit het installatiekopiearchief verwijderd.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Threading.Tasks;

using System.Fabric;
using System.Fabric.Description;
using System.Threading;

namespace ServiceFabricAppLifecycle
{
class Program
{
static void Main(string[] args)
{

    string clusterConnection = "localhost:19000";
    string appName = "fabric:/MyApplication";
    string appType = "MyApplicationType";
    string appVersion = "1.0.0";
    string serviceName = "fabric:/MyApplication/Stateless1";
    string imageStoreConnectionString = "file:C:\\SfDevCluster\\Data\\ImageStoreShare";
    string packagePathInImageStore = "MyApplication";
    string packagePath = "C:\\Users\\username\\Documents\\Visual Studio 2019\\Projects\\MyApplication\\MyApplication\\pkg\\Debug";
    string serviceType = "Stateless1Type";

    // Connect to the cluster.
    FabricClient fabricClient = new FabricClient(clusterConnection);

    // Copy the application package to a location in the image store
    try
    {
        fabricClient.ApplicationManager.CopyApplicationPackage(imageStoreConnectionString, packagePath, packagePathInImageStore);
        Console.WriteLine("Application package copied to {0}", packagePathInImageStore);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("Application package copy to Image Store failed: ");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Provision the application.  "MyApplicationV1" is the folder in the image store where the application package is located. 
    // The application type with name "MyApplicationType" and version "1.0.0" (both are found in the application manifest) 
    // is now registered in the cluster.            
    try
    {
        fabricClient.ApplicationManager.ProvisionApplicationAsync(packagePathInImageStore).Wait();

        Console.WriteLine("Provisioned application type {0}", packagePathInImageStore);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("Provision Application Type failed:");

        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Delete the application package from a location in the image store.
    try
    {
        fabricClient.ApplicationManager.RemoveApplicationPackage(imageStoreConnectionString, packagePathInImageStore);
        Console.WriteLine("Application package removed from {0}", packagePathInImageStore);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("Application package removal from Image Store failed: ");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    //  Create the application instance.
    try
    {
        ApplicationDescription appDesc = new ApplicationDescription(new Uri(appName), appType, appVersion);
        fabricClient.ApplicationManager.CreateApplicationAsync(appDesc).Wait();
        Console.WriteLine("Created application instance of type {0}, version {1}", appType, appVersion);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("CreateApplication failed.");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Create the stateless service description.  For stateful services, use a StatefulServiceDescription object.
    StatelessServiceDescription serviceDescription = new StatelessServiceDescription();
    serviceDescription.ApplicationName = new Uri(appName);
    serviceDescription.InstanceCount = 1;
    serviceDescription.PartitionSchemeDescription = new SingletonPartitionSchemeDescription();
    serviceDescription.ServiceName = new Uri(serviceName);
    serviceDescription.ServiceTypeName = serviceType;

    // Create the service instance.  If the service is declared as a default service in the ApplicationManifest.xml,
    // the service instance is already running and this call will fail.
    try
    {
        fabricClient.ServiceManager.CreateServiceAsync(serviceDescription).Wait();
        Console.WriteLine("Created service instance {0}", serviceName);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("CreateService failed.");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Delete a service instance.
    try
    {
        DeleteServiceDescription deleteServiceDescription = new DeleteServiceDescription(new Uri(serviceName));

        fabricClient.ServiceManager.DeleteServiceAsync(deleteServiceDescription);
        Console.WriteLine("Deleted service instance {0}", serviceName);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("DeleteService failed.");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Delete an application instance from the application type.
    try
    {
        DeleteApplicationDescription deleteApplicationDescription = new DeleteApplicationDescription(new Uri(appName));

        fabricClient.ApplicationManager.DeleteApplicationAsync(deleteApplicationDescription).Wait();
        Console.WriteLine("Deleted application instance {0}", appName);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("DeleteApplication failed.");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Un-provision the application type.
    try
    {
        fabricClient.ApplicationManager.UnprovisionApplicationAsync(appType, appVersion).Wait();
        Console.WriteLine("Un-provisioned application type {0}, version {1}", appType, appVersion);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("Un-provision application type failed: ");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    Console.WriteLine("Hit enter...");
    Console.Read();
}        
}
}

Volgende stappen

Service Fabric-toepassingsupgrade

Inleiding tot Service Fabric-status

Problemen met een Service Fabric-service vaststellen en oplossen

Een toepassing modelleren in Service Fabric