Inicializáló kódcsomagok
A Service Fabric a 7.1-es verziótól kezdve támogatja a tárolókhoz és vendég végrehajtható alkalmazásokhoz készült Initializer CodePackages szolgáltatást. Az inicializáló CodePackages lehetővé teszik az inicializálásokat a ServicePackage hatókörben, mielőtt más CodePackages-műveletek megkezdik a végrehajtást. A ServicePackage-hez való viszonyuk hasonló ahhoz, amit a SetupEntryPoint egy CodePackage-hoz készült.
Mielőtt folytatnánk ezt a cikket, javasoljuk, hogy ismerkedjen meg a Service Fabric alkalmazásmodelljével és a Service Fabric üzemeltetési modelljével.
Feljegyzés
Az Initializer CodePackages jelenleg nem támogatott a Reliable Services programozási modellel írt szolgáltatások esetében.
Szemantika
Az Inicializáló CodePackage várhatóan sikeresen befejeződik (kilépési kód: 0). A sikertelen Inicializáló CodePackage mindaddig újraindul, amíg az sikeresen be nem fejeződik. Több Inicializáló CodePackage engedélyezett, és a végrehajtás sikeres befejezése után, sorrendben, egy megadott sorrendben történik, mielőtt a ServicePackage más CodePackage-jei megkezdik a végrehajtást.
Initializer CodePackages megadása
A CodePackage inicializálóként való megjelöléséhez állítsa az Initializer attribútumot igaz értékre a ServiceManifestben. Ha több Initializer CodePackage van, a végrehajtás sorrendje az ExecOrder attribútumon keresztül adható meg. Az ExecOrder nem negatív egész szám lehet, és csak az Initializer CodePackages esetében érvényes. Először az ExecOrder alacsonyabb értékeit tartalmazó Inicializáló CodePackage-eket hajtja végre a rendszer. Ha az ExecOrder nincs megadva inicializáló CodePackage-hez, a rendszer 0 alapértelmezett értéket feltételez. Az Azonos ExecOrder értékkel rendelkező Initializer CodePackages relatív végrehajtási sorrendje nincs meghatározva.
Az alábbi ServiceManifest-kódrészlet három CodePackage-et ír le, amelyek közül kettő Inicializálóként van megjelölve. A ServicePackage aktiválása után először az InitCodePackage0 lesz végrehajtva, mivel az ExecOrder értéke a legalacsonyabb. Az InitCodePackage0 sikeres befejezésekor (kilépési kód: 0) a rendszer végrehajtja az InitCodePackage1-et. Végül az InitCodePackage1 sikeres befejezése után a WorkloadCodePackage végrehajtásra kerül.
<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>
Teljes példa az Initializer CodePackages használatával
Tekintsünk meg egy teljes példát az Initializer CodePackages használatával.
Fontos
Az alábbi példa feltételezi, hogy ismeri a Windows tárolóalkalmazások Service Fabric és Docker használatával történő létrehozását.
Ez a példa mcr.microsoft.com/windows/nanoserver:1809 hivatkozik. A Windows Server-tárolók nem kompatibilisek a gazdagép operációs rendszerének összes verziójával. További információkért tekintse meg a Windows tárolóverzió kompatibilitását.
Az alábbi ServiceManifest.xml a korábban ismertetett ServiceManifest-kódrészletre épül. Az InitCodePackage0, az InitCodePackage1 és a WorkloadCodePackage a tárolókat képviselő CodePackage. Aktiváláskor először az InitCodePackage0 lesz végrehajtva. Naplóz egy üzenetet egy fájlba, és kilép. A következő lépés az InitCodePackage1 végrehajtása, amely egy üzenetet is naplóz egy fájlba, és kilép. Végül a WorkloadCodePackage megkezdi a végrehajtást. Emellett naplóz egy üzenetet egy fájlba, a fájl tartalmát stdout-ra adja ki, majd örökre pingel.
<?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>
Az alábbi ApplicationManifest.xml a fent tárgyalt ServiceManifest.xml alapuló alkalmazást ismerteti. Vegye figyelembe, hogy az összes tárolóhoz ugyanazt a kötetcsatlakozást adja meg, azaz a C:\WorkspaceOnHost a C:\WorkspaceOnContainer helyen van csatlakoztatva mindhárom tárolóhoz. A nettó hatás az, hogy az összes tároló ugyanarra a naplófájlra ír az aktiválásuk sorrendjében.
<?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>
A ServicePackage sikeres aktiválása után a C:\WorkspaceOnHost\log.txt tartalma a következő legyen.
C:\Users\test>type C:\WorkspaceOnHost\log.txt
Hi from InitCodePackage0.
Hi from InitCodePackage1.
Hi from WorkloadCodePackage.
Következő lépések
A kapcsolódó információkért tekintse meg az alábbi cikkeket.