CodePackages للمهيئ

بدءًا من الإصدار 7.1 ، تدعم Service Fabric Initializer CodePackages للحاويات وتطبيقات الضيف القابلة للتنفيذ . توفر Initializer CodePackages الفرصة لإجراء عَمليات تهيئة في نطاق ServicePackage قبل بدء تنفيذ CodePackages الأخرى. علاقتهم بـ ServicePackage مماثلة لما هو SetupEntryPoint لـ CodePackage.

قبل متابعة هذه المقالة، نوصي بالتعرف على نموذج تطبيق Service Fabric ونموذجاستضافة Service Fabric.

ملاحظة

لا يتم حاليا دعم Initializer CodePackages للخدمات المكتوبة باستخدام نموذج برمجة الخدمات الموثوقة.

الدلالات

من المُتوقع تشغيل Initializer CodePackage إلى الإكمال بنجاح (رمز الخروج 0). يتم إعادة تشغيل Initializer CodePackages الفاشل حتى يكتمل بنجاح. يسمح بـ "حزم CodePackages" متعددة التهيئة ويتم تنفيذها إلى الإكمال الناجح، بالتتابع، بترتيب محدد قبل أن تبدأ عمليات تنفيذ CodePackages الأخرى في ServicePackage.

تحديد Initializer CodePackages

يمكنك وضع علامة على CodePackage كبادئ بواسطة تعيين سِمة Initializer إلى true في ServiceManifest. عندما يكون هناك العديد من حزم Initializer CodePackages، يمكن تحديد ترتيب التنفيذ الخاص بهم عبر السمة Execorder. يجب أن يكون ExecOrder عددا صحيحا غير سالب وهو صالح فقط لـ Initializer CodePackages. يتم تنفيذ Initializer CodePackages مَع قيم أقل من ExecOrder أولا. إذا لم يتم تحديد ExecOrder ل CodePackage التهيئة، يتم افتراض قيمة افتراضية من 0. أمر التنفيذ النسبي لـ Initializer CodePackages بنفس قيمة ExecOrder غير محدد.

يصف مقتطف ServiceManifest التالي ثلاثة CodePackages يتم وضع علامة على اثنين مِنها على أنها مهيأة. عند تنشيط حزمة الخدمة هذه، يتم تنفيذ InitCodePackage0 أولا نظرا لأنه يحتوي على أقل قيمة لـ ExecOrder. عند الانتهاء بنجاح (رمز الخروج 0) من InitCodePackage0، InitCodePackage1 يتم تنفيذهم. أخيرا، عند الانتهاء بنجاح من InitCodePackage1، يتم تنفيذ WorkloadCodePackage.

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

المثال الكامل باستخدام Initializer CodePackages

لنلقي نظرة على مثال كامل باستخدام Initializer CodePackages.

هام

يَفترض المثال التالي الإلمام بكيفية إنشاء تطبيقات حاوية Windows باستخدام Service Fabric وDocker.

يُشير هذا المثال إلى mcr.microsoft.com/windows/nanoserver:1809. حاويات Windows Server غير متوافقة عبر جميع إصدارات نظام التشغيل المضيف OS. لمَعرفة المزيد، راجع التوافق مع إصدار حاوية Windows.

يَعتمد ServiceManifest.xml التالي على مقتطف ServiceManifest الموضح سابقا. InitCodePackage0 و InitCodePackage1 و WorkloadCodePackage هي CodePackages التي تُمثل الحاويات. عِند التنشيط، يتم تنفيذ InitCodePackage0 أولا. فإنه يسجل رسالة إلى ملف والخروج. بعد ذلك، يتم تنفيذ InitCodePackage1 الذي يسجل أيضا رسالة إلى ملف ويخرج. وأخيرا، يبدأ تنفيذ حزمة WorkloadCodePackage. كما أنه يسجل رسالة إلى ملف، ويخرج محتويات الملف إلى stdout ثم ينقر فوق إلى الأبد.

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

يصف ApplicationManifest.xml التالي تطبيقا يستند إلى ServiceManifest.xml التي تمت مناقشتها أعلاه. لاحظ أنه يحدد تحميل وحدة التخزين نفسها لكافة الحاويات، أي C:\WorkspaceOnHost يتم تحميل في C:\WorkspaceOnContainer على كافة الحاويات الثلاث. التأثير الصافي هو أن جميع الحاويات تُكتب إلى نفس ملف السجل بالترتيب الذي يتم تنشيطها به.

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

بمجرد تفعيل ServicePackage بنجاح، يجب أن تكون محتويات C:\WorkspaceOnHost\log.txt كما يلي.

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

الخطوات التالية

راجع المقالات التالية للحُصول على معلومات ذات صلة.