CodePackages voor initialisatiefunctie
Vanaf versie 7.1 ondersteunt Service Fabric Initializer CodePackages voor containers en uitvoerbare gasttoepassingen. Initializer CodePackages biedt de mogelijkheid om initialisaties uit te voeren in het ServicePackage-bereik voordat andere CodePackages beginnen met uitvoeren. Hun relatie met een ServicePackage is vergelijkbaar met wat een SetupEntryPoint is voor een CodePackage.
Voordat u verdergaat met dit artikel, raden we u aan vertrouwd te raken met het Service Fabric-toepassingsmodel en het Service Fabric-hostingmodel.
Notitie
Initializer CodePackages worden momenteel niet ondersteund voor services die zijn geschreven met behulp van het Reliable Services-programmeermodel .
Semantiek
Een Initializer CodePackage wordt naar verwachting uitgevoerd tot een geslaagde voltooiing (afsluitcode 0). Een mislukte Initializer CodePackage wordt opnieuw gestart totdat deze is voltooid. Meerdere Initializer CodePackages zijn toegestaan en worden uitgevoerd tot een geslaagde voltooiing, opeenvolgend, in een opgegeven volgorde voordat andere CodePackages in de ServicePackage worden uitgevoerd.
Initializer CodePackages opgeven
U kunt een CodePackage markeren als initialisatiefunctie door het kenmerk Initializer in te stellen op true in het ServiceManifest. Wanneer er meerdere Initializer CodePackages zijn, kan hun uitvoeringsvolgorde worden opgegeven via het kenmerk ExecOrder . ExecOrder moet een niet-negatief geheel getal zijn en is alleen geldig voor Initializer CodePackages. Initializer CodePackages met lagere waarden van ExecOrder worden eerst uitgevoerd. Als ExecOrder niet is opgegeven voor een Initializer CodePackage, wordt een standaardwaarde van 0 aangenomen. De relatieve uitvoeringsvolgorde van Initializer CodePackages met dezelfde waarde van ExecOrder is niet opgegeven.
Het volgende ServiceManifest-fragment beschrijft drie CodePackages waarvan twee zijn gemarkeerd als Initializers. Wanneer deze ServicePackage is geactiveerd, wordt InitCodePackage0 eerst uitgevoerd omdat deze de laagste waarde van ExecOrder heeft. Na een geslaagde voltooiing (afsluitcode 0) van InitCodePackage0 wordt InitCodePackage1 uitgevoerd. Ten slotte wordt WorkloadCodePackage na voltooiing van InitCodePackage1 uitgevoerd.
<CodePackage Name="InitCodePackage0" Version="1.0" Initializer="true" ExecOrder="0">
...
</CodePackage>
<CodePackage Name="InitCodePackage1" Version="1.0" Initializer="true" ExecOrder="1">
...
</CodePackage>
<CodePackage Name="WorkloadCodePackage" Version="1.0">
...
</CodePackage>
Volledig voorbeeld met Initializer CodePackages
Laten we eens kijken naar een volledig voorbeeld met behulp van Initializer CodePackages.
Belangrijk
In het volgende voorbeeld wordt ervan uitgegaan dat u bekend bent met het maken van Windows-containertoepassingen met behulp van Service Fabric en Docker.
In dit voorbeeld wordt verwezen naar mcr.microsoft.com/windows/nanoserver:1809. Windows Server-containers zijn niet compatibel in alle versies van een host-besturingssysteem. Zie Compatibiliteit met Windows-containerversies voor meer informatie.
De volgende ServiceManifest.xml is gebaseerd op het ServiceManifest-fragment dat eerder is beschreven. InitCodePackage0, InitCodePackage1 en WorkloadCodePackage zijn CodePackages die containers vertegenwoordigen. Na activering wordt InitCodePackage0 eerst uitgevoerd. Het registreert een bericht naar een bestand en wordt afgesloten. Vervolgens wordt InitCodePackage1 uitgevoerd, waarmee ook een bericht wordt vastgelegd in een bestand en wordt afgesloten. Ten slotte wordt de uitvoering van WorkloadCodePackage gestart. Het registreert ook een bericht naar een bestand, voert de inhoud van het bestand uit naar stdout en pingt vervolgens voor altijd.
<?xml version="1.0" encoding="UTF-8"?>
<ServiceManifest Name="WindowsInitCodePackageServicePackage" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Description>Windows Init CodePackage Service</Description>
<ServiceTypes>
<StatelessServiceType ServiceTypeName="WindowsInitCodePackageServiceType" UseImplicitHost="true"/>
</ServiceTypes>
<CodePackage Name="InitCodePackage0" Version="1.0" Initializer="true" ExecOrder="0">
<EntryPoint>
<ContainerHost>
<ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
<Commands>/c,echo Hi from InitCodePackage0. > C:\WorkspaceOnContainer\log.txt</Commands>
<EntryPoint>cmd</EntryPoint>
</ContainerHost>
</EntryPoint>
</CodePackage>
<CodePackage Name="InitCodePackage1" Version="1.0" Initializer="true" ExecOrder="1">
<EntryPoint>
<ContainerHost>
<ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
<Commands>/c,echo Hi from InitCodePackage1. >> C:\WorkspaceOnContainer\log.txt</Commands>
<EntryPoint>cmd</EntryPoint>
</ContainerHost>
</EntryPoint>
</CodePackage>
<CodePackage Name="WorkloadCodePackage" Version="1.0">
<EntryPoint>
<ContainerHost>
<ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
<Commands>/c,echo Hi from WorkloadCodePackage. >> C:\WorkspaceOnContainer\log.txt && type C:\WorkspaceOnContainer\log.txt && ping -t 127.0.0.1 > nul</Commands>
<EntryPoint>cmd</EntryPoint>
</ContainerHost>
</EntryPoint>
</CodePackage>
</ServiceManifest>
In de volgende ApplicationManifest.xml wordt een toepassing beschreven op basis van de hierboven besproken ServiceManifest.xml. Houd er rekening mee dat dezelfde volumekoppeling wordt opgegeven voor alle containers, bijvoorbeeld C:\WorkspaceOnHost is gekoppeld aan C:\WorkspaceOnContainer op alle drie de containers. Het netto-effect is dat alle containers naar hetzelfde logboekbestand schrijven in de volgorde waarin ze worden geactiveerd.
<?xml version="1.0" encoding="UTF-8"?>
<ApplicationManifest ApplicationTypeName="WindowsInitCodePackageApplicationType" ApplicationTypeVersion="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Description>Windows Init CodePackage Application</Description>
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="WindowsInitCodePackageServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ContainerHostPolicies CodePackageRef="InitCodePackage0" ContainersRetentionCount="2" RunInteractive="true">
<Volume Source="C:\WorkspaceOnHost" Destination="C:\WorkspaceOnContainer" IsReadOnly="false" />
</ContainerHostPolicies>
<ContainerHostPolicies CodePackageRef="InitCodePackage1" ContainersRetentionCount="2" RunInteractive="true">
<Volume Source="C:\WorkspaceOnHost" Destination="C:\WorkspaceOnContainer" IsReadOnly="false" />
</ContainerHostPolicies>
<ContainerHostPolicies CodePackageRef="WorkloadCodePackage" ContainersRetentionCount="2" RunInteractive="true">
<Volume Source="C:\WorkspaceOnHost" Destination="C:\WorkspaceOnContainer" IsReadOnly="false" />
</ContainerHostPolicies>
</Policies>
</ServiceManifestImport>
<DefaultServices>
<Service Name="WindowsInitCodePackageService" ServicePackageActivationMode="ExclusiveProcess">
<StatelessService ServiceTypeName="WindowsInitCodePackageServiceType" InstanceCount="1">
<SingletonPartition />
</StatelessService>
</Service>
</DefaultServices>
</ApplicationManifest>
Zodra servicepackage is geactiveerd, moet de inhoud van C:\WorkspaceOnHost\log.txt het volgende zijn.
C:\Users\test>type C:\WorkspaceOnHost\log.txt
Hi from InitCodePackage0.
Hi from InitCodePackage1.
Hi from WorkloadCodePackage.
Volgende stappen
Zie de volgende artikelen voor verwante informatie.