Bagikan melalui


Initializer CodePackages

Dimulai dengan versi 7.1, Service Fabric mendukung semantik Initializer CodePackages untuk kontainer dan aplikasi guest executable. Initializer CodePackages memberikan kesempatan untuk melakukan inisialisasi di lingkup ServicePackage sebelum CodePackages lain mulai dieksekusi. Hubungannya dengan ServicePackage dianalogikan dengan apa setupEntryPoint untuk CodePackage.

Sebelum melanjutkan artikel ini, sebaiknya pelajari model aplikasi Service Fabric dan model hosting Service Fabric.

Catatan

Initializer CodePackages saat ini tidak didukung untuk layanan yang ditulis menggunakan model pemrograman Reliable Service.

Semantik

Initializer CodePackages diharapkan berjalan ke penyelesaian yang berhasil (kode keluar 0) . Initializer CodePackages yang gagal dimulai ulang hingga berhasil diselesaikan. Beberapa Initializer CodePackages diizinkan dan dieksekusi untuk berhasil diselesaikan, secara berurutan, dalam urutan yang ditentukan sebelum CodePackages lain di ServicePackage mulai dieksekusi.

Menentukan Initializer CodePackages

Anda dapat menandai CodePackage sebagai Initializer dengan mengatur atribut Initializer ke true di ServiceManifest. Ketika ada beberapa Initializer CodePackages, urutan eksekusi mereka dapat ditentukan melalui atribut ExecOrder. ExecOrder harus merupakan bilangan bulat non-negatif dan hanya berlaku untuk Initializer CodePackages. Initializer CodePackages dengan nilai lebih rendah dari ExecOrder dieksekusi terlebih dahulu. Jika ExecOrder tidak ditentukan untuk Initializer CodePackage, maka diasumsikan nilai default 0. Urutan eksekusi relatif dari Initializer CodePackages dengan nilai ExecOrder yang sama tidak ditentukan.

Cuplikan ServiceManifest berikut ini menggambarkan tiga CodePackages dua di antaranya ditandai sebagai Initializer. Ketika ServicePackage ini diaktifkan, InitCodePackage0 dieksekusi terlebih dahulu karena memiliki nilai ExecOrder terendah. Pada penyelesaian yang berhasil (kode keluar 0) dari InitCodePackage0 dijalankan InitCodePackage1. Akhirnya, setelah berhasil menyelesaikan InitCodePackage1, WorkloadCodePackage dijalankan.

<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>

Contoh lengkap menggunakan Initializer CodePackages

Mari kita lihat contoh lengkap menggunakan Initializer CodePackages.

Penting

Contoh berikut mengasumsikan pengenalan dengan membuat aplikasi kontainer Windows menggunakan Service Fabric dan Docker.

Contoh ini merujuk pada mcr.microsoft.com/windows/nanoserver:1809. Kontainer Windows Server tidak kompatibel di semua versi OS host. Untuk mempelajari selengkapnya, lihat Kompatibilitas Versi Kontainer Windows.

Contoh ServiceManifest.xml dibangun di atas cuplikan ServiceManifest yang dijelaskan sebelumnya. InitCodePackage0, InitCodePackage1, dan WorkloadCodePackage adalah CodePackages yang mewakili kontainer. Setelah aktivasi, InitCodePackage0 dieksekusi terlebih dahulu. Ini mencatat pesan ke sebuah file dan keluar. Selanjutnya, InitCodePackage1 dijalankan yang juga mencatat pesan ke file dan keluar. Akhirnya, WorkloadCodePackage mulai dieksekusi. Ini juga mencatat pesan ke file, mengeluarkan isi file ke stdout dan kemudian ping selamanya.

<?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. &gt; 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. &gt;&gt; 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. &gt;&gt; C:\WorkspaceOnContainer\log.txt &amp;&amp; type C:\WorkspaceOnContainer\log.txt &amp;&amp; ping -t 127.0.0.1 &gt; nul</Commands>
        <EntryPoint>cmd</EntryPoint>
      </ContainerHost>
    </EntryPoint>
  </CodePackage>
</ServiceManifest>

Contoh ApplicationManifest.xml berikut menjelaskan aplikasi berdasarkan aplikasi ServiceManifest.xml yang dibahas di atas. Perhatikan bahwa itu menentukan ikatan Volume yang sama untuk semua kontainer, yaitu C:\WorkspaceOnHost diikat di C:\WorkspaceOnContainer pada ketiga kontainer. Efek bersih adalah bahwa semua kontainer menulis ke file log yang sama dalam urutan pengaktifannya.

<?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>

Setelah ServicePackage berhasil diaktifkan, isi C:\WorkspaceOnHost\log.txt harus sebagai berikut.

C:\Users\test>type C:\WorkspaceOnHost\log.txt
Hi from InitCodePackage0.
Hi from InitCodePackage1.
Hi from WorkloadCodePackage.

Langkah berikutnya

Lihat artikel berikut ini untuk informasi terkait.