Inserire un'applicazione in un pacchettoPackage an application

L'articolo descrive come inserire un'applicazione di Service Fabric in un pacchetto e prepararla per la distribuzione.This article describes how to package a Service Fabric application and make it ready for deployment.

Layout del pacchettoPackage layout

Il manifesto dell'applicazione, uno o più manifesti dei servizi e gli altri file del pacchetto necessari devono essere organizzati in un layout specifico per la distribuzione in un cluster di Service Fabric.The application manifest, one or more service manifests, and other necessary package files must be organized in a specific layout for deployment into a Service Fabric cluster. I manifesti di esempio di questo articolo dovrebbero essere organizzati nella struttura di directory seguente:The example manifests in this article would need to be organized in the following directory structure:

PS D:\temp> tree /f .\MyApplicationType

D:\TEMP\MYAPPLICATIONTYPE
│   ApplicationManifest.xml
│
└───MyServiceManifest
    │   ServiceManifest.xml
    │
    ├───MyCode
    │       MyServiceHost.exe
    │
    ├───MyConfig
    │       Settings.xml
    │
    └───MyData
            init.dat

Le cartelle sono denominate in modo da corrispondere agli attributi Name di ogni elemento corrispondente.The folders are named to match the Name attributes of each corresponding element. Se ad esempio il manifesto del servizio contenesse due pacchetti di codice denominati MyCodeA e MyCodeB, dovrebbero esistere due cartelle con gli stessi nomi contenenti i file binari necessari per ogni pacchetto di codice.For example, if the service manifest contained two code packages with the names MyCodeA and MyCodeB, then two folders with the same names would contain the necessary binaries for each code package.

Usare SetupEntryPointUse SetupEntryPoint

Gli scenari tipici per l'utilizzo di SetupEntryPoint sono quando è necessario eseguire un file eseguibile prima dell'avvio del servizio o quando è necessario eseguire un'operazione con privilegi elevati.Typical scenarios for using SetupEntryPoint are when you need to run an executable before the service starts or you need to perform an operation with elevated privileges. Ad esempio:For example:

  • Impostazione e inizializzazione di variabili di ambiente necessari per il file eseguibile del servizio.Setting up and initializing environment variables that the service executable needs. Questo non è limitato solo agli eseguibili scritti tramite i modelli di programmazione di Service Fabric.It is not limited to only executables written via the Service Fabric programming models. Ad esempio, npm.exe richiede alcune variabili di ambiente configurate per la distribuzione di un'applicazione node.js.For example, npm.exe needs some environment variables configured for deploying a node.js application.
  • Impostazione del controllo di accesso mediante l'installazione di certificati di sicurezza.Setting up access control by installing security certificates.

Per altre informazioni su come configurare SetupEntryPoint, vedere Configurare i criteri per il punto di ingresso dell'installazione del servizioFor more information on how to configure the SetupEntryPoint, see Configure the policy for a service setup entry point

ConfigurareConfigure

Creare un pacchetto mediante Visual StudioBuild a package by using Visual Studio

Se si usa Visual Studio 2015 per creare un'applicazione, è possibile usare il comando Pacchetto per creare automaticamente un pacchetto corrispondente al layout descritto precedentemente.If you use Visual Studio 2015 to create your application, you can use the Package command to automatically create a package that matches the layout described above.

Per creare un pacchetto, fare clic con il pulsante destro sul progetto dell'applicazione in Esplora soluzioni e scegliere il comando Pacchetto, come mostrato di seguito:To create a package, right-click the application project in Solution Explorer and choose the Package command, as shown below:

Inserire un'applicazione in un pacchetto con Visual Studio

Dopo avere completato la creazione del pacchetto, è possibile vedere la posizione del pacchetto nella finestra Output .When packaging is complete, you can find the location of the package in the Output window. Il passaggio di creazione del pacchetto viene eseguito automaticamente con la distribuzione o il debug di un'applicazione in Visual Studio.The packaging step occurs automatically when you deploy or debug your application in Visual Studio.

Creare un pacchetto dalla riga di comandoBuild a package by command line

È anche possibile creare un pacchetto dell'applicazione a livello di codice usando msbuild.exe.It is also possible to programmatically package up your application using msbuild.exe. Tale operazione viene eseguita da Visual Studio e quindi l'output è lo stesso.Under the hood, Visual Studio is running it so the output is same.

D:\Temp> msbuild HelloWorld.sfproj /t:Package

Testare il pacchettoTest the package

È possibile verificare la struttura del pacchetto in modalità locale tramite PowerShell usando il comando Test-ServiceFabricApplicationPackage .You can verify the package structure locally through PowerShell by using the Test-ServiceFabricApplicationPackage command. Questo comando consente di verificare i problemi di analisi dei manifesti e tutti i riferimenti.This command checks for manifest parsing issues and verify all references. Questo comando si limita a verificare la correttezza strutturale delle directory e i file nel pacchetto.This command only verifies the structural correctness of the directories and files in the package. Non verifica il codice o i contenuti del pacchetto di dati oltre a controllare che tutti i file necessari siano presenti.It doesn't verify any of the code or data package contents beyond checking that all necessary files are present.

PS D:\temp> Test-ServiceFabricApplicationPackage .\MyApplicationType
False
Test-ServiceFabricApplicationPackage : The EntryPoint MySetup.bat is not found.
FileName: C:\Users\servicefabric\AppData\Local\Temp\TestApplicationPackage_7195781181\nrri205a.e2h\MyApplicationType\MyServiceManifest\ServiceManifest.xml

Questo errore indica che il file MySetup.bat a cui viene fatto riferimento nel manifesto del servizio SetupEntryPoint manca nel pacchetto di codice.This error shows that the MySetup.bat file referenced in the service manifest SetupEntryPoint is missing from the code package. Dopo aver aggiunto il file mancante, la verifica dell'applicazione ha esito positivo:After the missing file is added, the application verification passes:

PS D:\temp> tree /f .\MyApplicationType

D:\TEMP\MYAPPLICATIONTYPE
│   ApplicationManifest.xml
│
└───MyServiceManifest
    │   ServiceManifest.xml
    │
    ├───MyCode
    │       MyServiceHost.exe
    │       MySetup.bat
    │
    ├───MyConfig
    │       Settings.xml
    │
    └───MyData
            init.dat

PS D:\temp> Test-ServiceFabricApplicationPackage .\MyApplicationType
True
PS D:\temp>

Se l'applicazione include parametri applicazione definiti, è possibile passarli in Test-ServiceFabricApplicationPackage per una convalida appropriata.If your application has application parameters defined, you can pass them in Test-ServiceFabricApplicationPackage for proper validation.

Se si conosce il cluster in cui verrà distribuita l'applicazione, si consiglia di passarlo nel parametro ImageStoreConnectionString.If you know the cluster where the application will be deployed, it is recommended you pass in the ImageStoreConnectionString parameter. In questo caso, il pacchetto viene convalidato rispetto alle versioni precedenti dell'applicazione già in esecuzione nel cluster.In this case, the package is also validated against previous versions of the application that are already running in the cluster. Ad esempio, la convalida può rilevare se sia già stato distribuito un pacchetto con la stessa versione ma con contenuti differenti.For example, the validation can detect whether a package with the same version but different content was already deployed.

Una volta che l'applicazione viene inserita correttamente in un pacchetto e passa la convalida, valutare se sia necessaria la compressione in base alle dimensioni e al numero dei file.Once the application is packaged correctly and passes validation, evaluate based on the size and the number of files if compression is needed.

Comprimere un pacchettoCompress a package

Quando un pacchetto è di grandi dimensioni o dispone di molti file, è possibile comprimerlo per velocizzare la distribuzione.When a package is large or has many files, you can compress it for faster deployment. La compressione riduce il numero di file e le dimensioni del pacchetto.Compression reduces the number of files and the package size. Per un pacchetto dell'applicazione compresso, l'operazione di caricamento potrebbe richiedere più tempo rispetto al caricamento del pacchetto non compresso, in particolare se è stato eseguito il factoring del tempo di compressione. Tuttavia, le operazioni di registrazione e annullamento della registrazione del tipo di applicazione sono più veloci per un pacchetto dell'applicazione compresso.For a compressed application package, Uploading the application package may take longer compared to uploading the uncompressed package (specially if compression time is factored in), but registering and un-registering the application type are faster for a compressed application package.

Il meccanismo di distribuzione è lo stesso per i pacchetti compressi e per quelli non compressi.The deployment mechanism is same for compressed and uncompressed packages. Se il pacchetto è compresso, viene archiviato come tale nell'archivio immagini del cluster e viene decompresso nel nodo prima dell'esecuzione dell'applicazione.If the package is compressed, it is stored as such in the cluster image store and it's uncompressed on the node before the application is run. La compressione sostituisce il pacchetto di Service Fabric valido con la versione compressa.The compression replaces the valid Service Fabric package with the compressed version. La cartella deve fornire le autorizzazioni di scrittura.The folder must allow write permissions. La compressione di un pacchetto già compresso non apporta modifiche.Running compression on an already compressed package yields no changes.

È possibile comprimere un pacchetto eseguendo il comando Copy-ServiceFabricApplicationPackage con lo switch CompressPackage.You can compress a package by running the Powershell command Copy-ServiceFabricApplicationPackage with CompressPackage switch. È possibile decomprimere il pacchetto con lo stesso comando, usando lo switch UncompressPackage.You can uncompress the package with the same command, using UncompressPackage switch.

Il comando seguente comprime il pacchetto senza copiarlo nell'archivio immagini.The following command compresses the package without copying it to the image store. È possibile copiare un pacchetto compresso in uno o più cluster Service Fabric, in base alle esigenze, us il comando Copy-ServiceFabricApplicationPackage senza il flag SkipCopy.You can copy a compressed package to one or more Service Fabric clusters, as needed, using Copy-ServiceFabricApplicationPackage without the SkipCopy flag. Ora il pacchetto include i file compressi per i pacchetti code, config e data.The package now includes zipped files for the code, config, and data packages. Il manifesto dell'applicazione e i manifesti del servizio non sono compressi in quanto necessari per numerose operazioni interne, come la condivisione dei pacchetti e l'estrazione del nome e della versione del tipo di applicazione per determinate convalide.The application manifest and the service manifests are not zipped, because they are needed for many internal operations (like package sharing, application type name and version extraction for certain validations). La compressione dei manifesti renderebbe inefficienti tali operazioni.Zipping the manifests would make these operations inefficient.

PS D:\temp> tree /f .\MyApplicationType

D:\TEMP\MYAPPLICATIONTYPE
│   ApplicationManifest.xml
│
└───MyServiceManifest
    │   ServiceManifest.xml
    │
    ├───MyCode
    │       MyServiceHost.exe
    │       MySetup.bat
    │
    ├───MyConfig
    │       Settings.xml
    │
    └───MyData
            init.dat
PS D:\temp> Copy-ServiceFabricApplicationPackage -ApplicationPackagePath .\MyApplicationType -CompressPackage -SkipCopy

PS D:\temp> tree /f .\MyApplicationType

D:\TEMP\MYAPPLICATIONTYPE
│   ApplicationManifest.xml
│
└───MyServiceManifest
       ServiceManifest.xml
       MyCode.zip
       MyConfig.zip
       MyData.zip

In alternativa è possibile comprimere e copiare il pacchetto con Copy-ServiceFabricApplicationPackage in un unico passaggio.Alternatively, you can compress and copy the package with Copy-ServiceFabricApplicationPackage in one step. Se il pacchetto è grande, specificare un timeout sufficiente per consentire la compressione del pacchetto e il caricamento nel cluster.If the package is large, provide a high enough timeout to allow time for both the package compression and the upload to the cluster.

PS D:\temp> Copy-ServiceFabricApplicationPackage -ApplicationPackagePath .\MyApplicationType -ApplicationPackagePathInImageStore MyApplicationType -ImageStoreConnectionString fabric:ImageStore -CompressPackage -TimeoutSec 5400

Internamente, Service Fabric calcola i checksum per la convalida dei pacchetti dell'applicazione.Internally, Service Fabric computes checksums for the application packages for validation. Quando si usa la compressione, i checksum vengono calcolati nelle versioni compresse di ciascun pacchetto.When using compression, the checksums are computed on the zipped versions of each package. Se è stata copiata una versione non compressa del pacchetto dell'applicazione e si desidera usare la compressione per il medesimo pacchetto, è necessario modificare la versione dei pacchetti code, config e data per evitare la mancata corrispondenza del checksum.If you copied an uncompressed version of your application package, and you want to use compression for the same package, you must change the versions of the code, config, and data packages to avoid checksum mismatch. Se i pacchetti rimangono invariati, anziché cambiare la versione, è possibile usare diff provisioning.If the packages are unchanged, instead of changing the version, you can use diff provisioning. Con questa opzione non si include il pacchetto invariato ma si fa solo riferimento a esso dal manifesto del servizio.With this option, do not include the unchanged package instead reference it from the service manifest.

Analogamente, se è stata caricata una versione compressa del pacchetto e si vuole usare un pacchetto non compresso, è necessario aggiornare la versione per evitare la mancata corrispondenza del checksum.Similarly, if you uploaded a compressed version of the package and you want to use an uncompressed package, you must update the versions to avoid the checksum mismatch.

Il pacchetto è ora corretto, convalidato e compresso (se necessario). Pertanto, è pronto per la distribuzione in uno o più cluster di Service Fabric.The package is now packaged correctly, validated, and compressed (if needed), so it is ready for deployment to one or more Service Fabric clusters.

Comprimere i pacchetti quando si distribuisce con Visual StudioCompress packages when deploying using Visual Studio

È possibile indicare a Visual Studio di comprimere i pacchetti in fase di distribuzione, aggiungendo l'elemento CopyPackageParameters al profilo di pubblicazione, e di impostare l'attributo CompressPackage su true.You can instruct Visual Studio to compress packages on deployment, by adding the CopyPackageParameters element to your publish profile, and set the CompressPackage attribute to true.

    <PublishProfile xmlns="http://schemas.microsoft.com/2015/05/fabrictools">
        <ClusterConnectionParameters ConnectionEndpoint="mycluster.westus.cloudapp.azure.com" />
        <ApplicationParameterFile Path="..\ApplicationParameters\Cloud.xml" />
        <CopyPackageParameters CompressPackage="true"/>
    </PublishProfile>

Passaggi successiviNext steps

Distribuire e rimuovere applicazioni con PowerShell: descrive come usare PowerShell per gestire le istanze dell'applicazioneDeploy and remove applications describes how to use PowerShell to manage application instances

Gestire i parametri dell'applicazione per più ambienti: descrive come configurare parametri e variabili di ambiente per istanze di applicazione diverse.Managing application parameters for multiple environments describes how to configure parameters and environment variables for different application instances.

Configurare i criteri di sicurezza per l'applicazione: descrive come eseguire i servizi nell'ambito dei criteri di sicurezza per limitare l'accesso.Configure security policies for your application describes how to run services under security policies to restrict access.