Initializer CodePackages
A partir da versão 7.1, o Service Fabric oferece suporte à semântica Initializer CodePackages para contêineres e aplicativos executáveis de convidado. O Initializer CodePackages fornece a oportunidade de executar inicializações no escopo do ServicePackage antes que outros CodePackages iniciem a execução. Sua relação com um ServicePackage é análoga ao que é um SetupEntryPoint para um CodePackage.
Antes de continuar lendo este artigo, recomendamos que você se familiarize com o Modelo de aplicativo do Service Fabric e o Modelo de hospedagem do Service Fabric.
Observação
Initializer CodePackages não tem suporte atualmente para serviços gravados usando o modelo de programação Reliable Services.
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 do falha é reiniciado até que seja concluído com êxito. Vários Initializer CodePackages são permitidos e executados até a conclusão bem-sucedida, sequencialmente, em uma ordem especificada antes de outros CodePackages no ServicePackage iniciarem a execução.
Especificar Initializer CodePackages
Você pode marcar um CodePackage como um Inicializador definindo o atributo Initializer como true no ServiceManifest. Quando há vários Initializer CodePackages, a ordem de execução deles pode ser especificada por meio do atributo ExecOrder. ExecOrder deve ser um inteiro não negativo e só é válido para Initializer CodePackages. Initializer CodePackages com valores menores 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 snippet serviceManifest a seguir descreve três CodePackages, sendo dois dos quais marcados como Inicializadores. Quando esse ServicePackage é ativado, InitCodePackage0 é executado primeiro, pois tem o valor mais baixo 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 será 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
Vejamos 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 do host. Para obter mais informações, consulte Compatibilidade de versão de contêiner do Windows.
O ServiceManifest.xml a seguir baseia-se no snippet 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. Por fim, o WorkloadCodePackage começa a execução. Ele também registra uma mensagem em um arquivo, gera o conteúdo do arquivo para stdout e, em seguida, executa 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. > 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>
O ApplicationManifest.xml a seguir descreve um aplicativo baseado 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>
Após o ServicePackage ser ativado com êxito, o conteúdo de C:\WorkspaceOnHost\log.txt deverá ser o seguinte.
C:\Users\test>type C:\WorkspaceOnHost\log.txt
Hi from InitCodePackage0.
Hi from InitCodePackage1.
Hi from WorkloadCodePackage.
Próximas etapas
Confira os artigos a seguir para obter informações relacionadas.