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. > 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>
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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk