Partilhar via


CodePackages do Inicializador

A partir da versão 7.1, o Service Fabric suporta Initializer CodePackages para contêineres e aplicativos executáveis convidados. Initializer CodePackages fornece a oportunidade de executar inicializações no escopo ServicePackage antes que outros CodePackages comecem a execução. Seu relacionamento com um ServicePackage é análogo ao que um SetupEntryPoint é para um CodePackage.

Antes de prosseguir com este artigo, recomendamos familiarizar-se com o modelo de aplicativo do Service Fabric e o modelo de hospedagem do Service Fabric.

Nota

Atualmente, não há suporte para CodePackages do inicializador para serviços escritos usando o modelo de programação de Serviços Confiáveis.

Semântica

Espera-se que um Initializer CodePackage seja executado até a conclusão bem-sucedida (código de saída 0). Um Initializer CodePackage com falha é reiniciado até ser concluído com êxito. Vários Initializer CodePackages são permitidos e são executados para conclusão bem-sucedida, sequencialmente, em uma ordem especificada antes que outros CodePackages no ServicePackage comecem a ser executados.

Especificando CodePackages do inicializador

Você pode marcar um CodePackage como um Initializer definindo o atributo Initializer como true no ServiceManifest. Quando há vários Initializer CodePackages, sua ordem de execução pode ser especificada por meio do atributo ExecOrder . ExecOrder deve ser um inteiro não negativo e só é válido para Initializer CodePackages. CodePackages do inicializador com valores mais baixos de ExecOrder são executados primeiro. Se ExecOrder não for especificado para um Initializer CodePackage, um valor padrão de 0 será assumido. A ordem de execução relativa de Initializer CodePackages com o mesmo valor de ExecOrder não é especificada.

O trecho ServiceManifest a seguir descreve três CodePackages, dois dos quais são marcados como inicializadores. Quando este ServicePackage é ativado, InitCodePackage0 é executado primeiro, pois tem o menor valor de ExecOrder. Após a conclusão bem-sucedida (código de saída 0) de InitCodePackage0, InitCodePackage1 é executado. Finalmente, após a conclusão bem-sucedida de InitCodePackage1, WorkloadCodePackage é executado.

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

Exemplo completo usando Initializer CodePackages

Vamos ver um exemplo completo usando Initializer CodePackages.

Importante

O exemplo a seguir pressupõe familiaridade com a criação de aplicativos de contêiner do Windows usando o Service Fabric e o Docker.

Este exemplo faz referência a mcr.microsoft.com/windows/nanoserver:1809. Os contêineres do Windows Server não são compatíveis em todas as versões de um sistema operacional host. Para saber mais, consulte Compatibilidade de versão de contêiner do Windows.

O ServiceManifest.xml a seguir se baseia no trecho ServiceManifest descrito anteriormente. InitCodePackage0, InitCodePackage1 e WorkloadCodePackage são CodePackages que representam contêineres. Após a ativação, InitCodePackage0 é executado primeiro. Ele registra uma mensagem em um arquivo e sai. Em seguida, InitCodePackage1 é executado, que também registra uma mensagem em um arquivo e sai. Finalmente, o WorkloadCodePackage começa a execução. Ele também registra uma mensagem em um arquivo, envia o conteúdo do arquivo para stdout e, em seguida, pings para sempre.

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

A ApplicationManifest.xml a seguir descreve um aplicativo com base no ServiceManifest.xml discutido acima. Observe que ele especifica a mesma montagem de volume para todos os contêineres, ou seja , C:\WorkspaceOnHost é montado em C:\WorkspaceOnContainer em todos os três contêineres. O efeito líquido é que todos os contêineres gravam no mesmo arquivo de log na ordem em que são ativados.

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

Depois que o ServicePackage tiver sido ativado com êxito, o conteúdo de C:\WorkspaceOnHost\log.txt deve ser o seguinte.

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

Próximos passos

Consulte os seguintes artigos para obter informações relacionadas.