Specificare le risorse in un manifesto del servizio
Panoramica
Le applicazioni e i servizi di Service Fabric vengono definiti e sottoposti al controllo delle versioni usando i file manifesto. Per una panoramica generale di ServiceManifest.xml e ApplicationManifest.xml, vedere Manifesti dell'applicazione e del servizio di Service Fabric.
Il manifesto del servizio consente alle risorse di essere usate dal servizio per essere dichiarate o modificate senza modificare il codice compilato. Service Fabric supporta la configurazione delle risorse dell'endpoint del servizio. È possibile controllare l'accesso alle risorse specificate nel manifesto del servizio tramite SecurityGroup nel manifesto dell'applicazione. La dichiarazione delle risorse consente a queste ultime di essere modificate in fase di distribuzione, in questo modo il servizio non deve introdurre un nuovo meccanismo di configurazione. La definizione dello schema per il file ServiceManifest.xml viene installata con Service Fabric SDK e gli strumenti in C:\Programmi\Microsoft SDKs\Service Fabric\schemas\ServiceFabricServiceModel.xsd ed è presente nella documentazione dello schema ServiceFabricServiceModel.xsd.
Endpoint
Quando una risorsa dell'endpoint viene definita nel manifesto del servizio, Service Fabric assegna le porte dall'intervallo di porte riservate dell'applicazione se la porta non è esplicitamente specificata. Ad esempio, esaminare l'endpoint ServiceEndpoint1 specificato nel frammento di manifesto fornito dopo questo paragrafo. Inoltre, i servizi possono richiedere anche una porta specifica in una risorsa. Alle repliche del servizio in esecuzione sui diversi nodi del cluster possono essere assegnati diversi numeri di porta, mentre le repliche di un servizio in esecuzione nello stesso nodo condividono la porta. Le repliche del servizio possono quindi usare queste porte in base alle esigenze per la replica e l'ascolto delle richieste client.
Quando si attiva un servizio che specifica un endpoint HTTPS, Service Fabric imposta la voce di controllo di accesso per la porta, associa il certificato server specificato alla porta e concede anche l'identità in esecuzione come autorizzazioni per la chiave privata del certificato. Il flusso di attivazione viene richiamato ogni volta che si avvia Service Fabric o quando la dichiarazione di certificato dell'applicazione viene modificata tramite un aggiornamento. Il certificato dell'endpoint verrà monitorato anche per le modifiche/rinnovi e le autorizzazioni verranno riapplicate periodicamente in base alle esigenze.
Al termine del servizio, Service Fabric pulisce la voce di controllo di accesso dell'endpoint e rimuove l'associazione di certificati. Tuttavia, tutte le autorizzazioni applicate alla chiave privata del certificato non verranno rimosse.
Avviso
Per impostazione predefinita, le porte statiche non devono sovrapporsi all'intervallo di porte dell'applicazione specificato in ClusterManifest. Se si specifica una porta statica, assegnarla all'esterno dell'intervallo di porte dell'applicazione, in caso contrario genererà conflitti di porta. Con la versione 6.5CU2 verrà generato un Avviso di integrità quando viene rilevato un conflitto di questo tipo, ma la distribuzione continuerà a essere sincronizzata con il comportamento della versione 6.5. Tuttavia, la distribuzione dell'applicazione potrà essere impedita nelle prossime versioni principali.
Con la versione 7.0 verrà generato un Avviso di integrità quando viene rilevato l'utilizzo dell'intervallo di porte dell'applicazione superiore a HostingConfig::ApplicationPortExhaustThresholdPercentage (valore predefinito 80%).
<Resources>
<Endpoints>
<Endpoint Name="ServiceEndpoint1" Protocol="http"/>
<Endpoint Name="ServiceEndpoint2" Protocol="http" Port="80"/>
<Endpoint Name="ServiceEndpoint3" Protocol="https"/>
</Endpoints>
</Resources>
Se sono presenti più pacchetti di codice in un singolo pacchetto del servizio, è necessario fare riferimento anche al pacchetto di codice nella sezione Endpoint. Ad esempio, se ServiceEndpoint2a e ServiceEndpoint2b sono endpoint dello stesso pacchetto del servizio che fanno riferimento a pacchetti di codice diversi, il pacchetto di codice corrispondente a ogni endpoint viene definito come indicato di seguito:
<Resources>
<Endpoints>
<Endpoint Name="ServiceEndpoint2a" Protocol="http" Port="802" CodePackageRef="Code1"/>
<Endpoint Name="ServiceEndpoint2b" Protocol="http" Port="801" CodePackageRef="Code2"/>
</Endpoints>
</Resources>
Per altre informazioni sugli endpoint di riferimento del file delle impostazioni del pacchetto di configurazione (settings.xml), vedere Configurazione di Reliable Services con stato .
Esempio: specificare un endpoint HTTP per il servizio
Il manifesto del servizio seguente definisce una risorsa di endpoint TCP e due risorse di endpoint HTTP nell'elemento <Risorse>.
<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="Stateful1Pkg"
Version="1.0.0"
xmlns="http://schemas.microsoft.com/2011/01/fabric"
xmlns:xsd="https://www.w3.org/2001/XMLSchema"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
<ServiceTypes>
<!-- This is the name of your ServiceType.
This name must match the string used in the RegisterServiceType call in Program.cs. -->
<StatefulServiceType ServiceTypeName="Stateful1Type" HasPersistedState="true" />
</ServiceTypes>
<!-- Code package is your service executable. -->
<CodePackage Name="Code" Version="1.0.0">
<EntryPoint>
<ExeHost>
<Program>Stateful1.exe</Program>
</ExeHost>
</EntryPoint>
</CodePackage>
<!-- Config package is the contents of the Config directory under PackageRoot that contains an
independently updateable and versioned set of custom configuration settings for your service. -->
<ConfigPackage Name="Config" Version="1.0.0" />
<Resources>
<Endpoints>
<!-- This endpoint is used by the communication listener to obtain the port number on which to
listen. Note that if your service is partitioned, this port is shared with
replicas of different partitions that are placed in your code. -->
<Endpoint Name="ServiceEndpoint1" Protocol="http"/>
<Endpoint Name="ServiceEndpoint2" Protocol="http" Port="80"/>
<Endpoint Name="ServiceEndpoint3" Protocol="https"/>
<Endpoint Name="ServiceEndpoint4" Protocol="https" Port="14023"/>
<!-- This endpoint is used by the replicator for replicating the state of your service.
This endpoint is configured through the ReplicatorSettings config section in the Settings.xml
file under the ConfigPackage. -->
<Endpoint Name="ReplicatorEndpoint" />
</Endpoints>
</Resources>
</ServiceManifest>
Esempio: specificare un endpoint HTTPS per il servizio
Il protocollo HTTPS fornisce l’autenticazione del server e viene anche usato per crittografare la comunicazione del client-server. Per abilitare il protocollo HTTPS nel servizio di Service Fabric, specificare il protocollo nella sezione Risorse -> Endpoint -> Endpoint del manifesto del servizio, come illustrato in precedenza per l'endpoint ServiceEndpoint3.
Nota
Un protocollo del servizio non può essere modificato durante l'aggiornamento dell'applicazione. Se viene modificato durante l'aggiornamento, si tratta di una modifica importante.
Avviso
Quando si usa HTTPS, non usare la stessa porta e lo stesso certificato per diverse istanze del servizio (indipendenti dall'applicazione) distribuite nello stesso nodo. L'aggiornamento di due servizi diversi mediante la stessa porta in istanze dell'applicazione diverse comporterà un errore di aggiornamento. Per altre informazioni, vedere Aggiornamento di più applicazioni con endpoint HTTPS.
Di seguito è riportato un esempio di ApplicationManifest che illustra la configurazione necessaria per un endpoint HTTPS. Il certificato server/endpoint può essere dichiarato tramite identificazione personale o nome comune del soggetto e deve essere specificato un valore. EndpointRef è un riferimento a EndpointResource in ServiceManifest e il cui protocollo deve essere impostato sul protocollo "https". È possibile aggiungere più Endpointcertificate.
<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest ApplicationTypeName="Application1Type"
ApplicationTypeVersion="1.0.0"
xmlns="http://schemas.microsoft.com/2011/01/fabric"
xmlns:xsd="https://www.w3.org/2001/XMLSchema"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
<Parameters>
<Parameter Name="Stateful1_MinReplicaSetSize" DefaultValue="3" />
<Parameter Name="Stateful1_PartitionCount" DefaultValue="1" />
<Parameter Name="Stateful1_TargetReplicaSetSize" DefaultValue="3" />
</Parameters>
<!-- Import the ServiceManifest from the ServicePackage. The ServiceManifestName and ServiceManifestVersion
should match the Name and Version attributes of the ServiceManifest element defined in the
ServiceManifest.xml file. -->
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="Stateful1Pkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<Policies>
<EndpointBindingPolicy CertificateRef="SslCertByTP" EndpointRef="ServiceEndpoint3"/>
<EndpointBindingPolicy CertificateRef="SslCertByCN" EndpointRef="ServiceEndpoint4"/>
</Policies>
</ServiceManifestImport>
<DefaultServices>
<!-- The section below creates instances of service types when an instance of this
application type is created. You can also create one or more instances of service type by using the
Service Fabric PowerShell module.
The attribute ServiceTypeName below must match the name defined in the imported ServiceManifest.xml file. -->
<Service Name="Stateful1">
<StatefulService ServiceTypeName="Stateful1Type" TargetReplicaSetSize="[Stateful1_TargetReplicaSetSize]" MinReplicaSetSize="[Stateful1_MinReplicaSetSize]">
<UniformInt64Partition PartitionCount="[Stateful1_PartitionCount]" LowKey="-9223372036854775808" HighKey="9223372036854775807" />
</StatefulService>
</Service>
</DefaultServices>
<Certificates>
<EndpointCertificate Name="SslCertByTP" X509FindValue="FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0" X509StoreName="MY" />
<EndpointCertificate Name="SslCertByCN" X509FindType="FindBySubjectName" X509FindValue="ServiceFabric-EndpointCertificateBinding-Test" X509StoreName="MY" />
</Certificates>
</ApplicationManifest>
Per i cluster Linux, l'archivio MY predefinito è la cartella /var/lib/sfcerts.
Per un esempio di applicazione completa che usa un endpoint HTTPS, vedere Aggiungere un endpoint HTTPS a un servizio front-end dell'API Web principale di ASP.NET usando Kestrel.
Elenco di controllo di accesso alle porte per gli endpoint HTTP
Service Fabric eseguirà automaticamente gli endpoint ACL HTTP(S) specificati per impostazione predefinita. Non eseguirà un elenco di controllo di accesso automatico se a un endpoint non è associata una SecurityAccessPolicy e se Service Fabric è configurato per l'esecuzione usando un account con privilegi di amministratore.
Override degli endpoint in ServiceManifest.xml
In ApplicationManifest aggiungere una sezione ResourceOverride che sarà un elemento di pari livello della sezione ConfigOverrides. In questa sezione è possibile specificare l'override per la sezione Endpoint nella sezione delle risorse specificata in ServiceManifest. L'override degli endpoint è supportato nel runtime 5.7.217/SDK 2.7.217 e versioni successive.
Per eseguire l'override di EndPoint in ServiceManifest usando ApplicationParameters, modificare ApplicationManifest come riportato di seguito:
Nella sezione ServiceManifestImport aggiungere una nuova sezione "ResourceOverrides".
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="Stateless1Pkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<ResourceOverrides>
<Endpoints>
<Endpoint Name="ServiceEndpoint" Port="[Port]" Protocol="[Protocol]" Type="[Type]" />
<Endpoint Name="ServiceEndpoint1" Port="[Port1]" Protocol="[Protocol1] "/>
</Endpoints>
</ResourceOverrides>
<Policies>
<EndpointBindingPolicy CertificateRef="SslCertByTP" EndpointRef="ServiceEndpoint"/>
</Policies>
</ServiceManifestImport>
In Parameters aggiungere quanto riportato di seguito:
<Parameters>
<Parameter Name="Port" DefaultValue="" />
<Parameter Name="Protocol" DefaultValue="" />
<Parameter Name="Type" DefaultValue="" />
<Parameter Name="Port1" DefaultValue="" />
<Parameter Name="Protocol1" DefaultValue="" />
</Parameters>
Durante la distribuzione dell'applicazione è possibile trasmettere questi valori come ApplicationParameters. Ad esempio:
PS C:\> New-ServiceFabricApplication -ApplicationName fabric:/myapp -ApplicationTypeName "AppType" -ApplicationTypeVersion "1.0.0" -ApplicationParameter @{Port='1001'; Protocol='https'; Type='Input'; Port1='2001'; Protocol='http'}
Nota: se i valori forniti per determinati ApplicationParameters sono vuoti, si torna al valore predefinito fornito in ServiceManifest per l'EndPointName corrispondente.
Ad esempio:
Se in ServiceManifest è stato specificato
<Resources>
<Endpoints>
<Endpoint Name="ServiceEndpoint1" Protocol="tcp"/>
</Endpoints>
</Resources>
Si presupponga che i valori Port1 e Protocol1 per i parametri di Aplication siano null o vuoti. La porta verrà definita da ServiceFabric e il protocollo sarà tcp.
Si supponga di specificare un valore errato. Si presupponga che per la porta sia stato specificato un valore stringa "Foo" anziché di tipo int. Il comando New-ServiceFabricApplication avrà esito negativo con l'errore seguente: The override parameter with name 'ServiceEndpoint1' attribute 'Port1' in section 'ResourceOverrides' is invalid. The value specified is 'Foo' and required is 'int'.
Passaggi successivi
Questo articolo ha illustrato come definire gli endpoint nel manifesto del servizio di Service Fabric. Per esempi più dettagliati, vedere:
Per una procedura dettagliata sulla creazione di pacchetti e sulla distribuzione di un'applicazione esistente in un cluster di Service Fabric, vedere: