Resources opgeven in een servicemanifest

Overzicht

Service Fabric-toepassingen en -services worden gedefinieerd en geversied met behulp van manifestbestanden. Zie Service Fabric-toepassing en servicemanifesten voor een overzicht op een hoger niveau van ServiceManifest.xml en ApplicationManifest.xml.

Met het servicemanifest kunnen resources die door de service worden gebruikt, worden gedeclareerd of gewijzigd zonder de gecompileerde code te wijzigen. Service Fabric ondersteunt de configuratie van eindpuntresources voor de service. De toegang tot de resources die zijn opgegeven in het servicemanifest, kan worden beheerd via de SecurityGroup in het toepassingsmanifest. Met de declaratie van resources kunnen deze resources tijdens de implementatie worden gewijzigd, wat betekent dat de service geen nieuw configuratiemechanisme hoeft te introduceren. De schemadefinitie voor het ServiceManifest.xml-bestand wordt geïnstalleerd met de Service Fabric SDK en hulpprogramma's op C:\Program Files\Microsoft SDKs\Service Fabric\schemas\ServiceFabricServiceModel.xsd en wordt beschreven in de schemadocumentatie ServiceFabricServiceModel.xsd.

Eindpunten

Wanneer een eindpuntresource is gedefinieerd in het servicemanifest, wijst Service Fabric poorten toe vanuit het poortbereik van de gereserveerde toepassing wanneer een poort niet expliciet is opgegeven. Kijk bijvoorbeeld naar het eindpunt ServiceEndpoint1 dat is opgegeven in het manifestfragment dat na deze alinea is opgegeven. Daarnaast kunnen services ook een specifieke poort in een resource aanvragen. Aan servicereplica's die op verschillende clusterknooppunten worden uitgevoerd, kunnen verschillende poortnummers worden toegewezen, terwijl replica's van een service die op hetzelfde knooppunt wordt uitgevoerd, de poort delen. De servicereplica's kunnen deze poorten vervolgens indien nodig gebruiken voor replicatie en luisteren naar clientaanvragen.

Bij het activeren van een service die een HTTPS-eindpunt opgeeft, stelt Service Fabric de toegangsbeheervermelding voor de poort in, verbindt het opgegeven servercertificaat met de poort en verleent ook de identiteit die de service uitvoert als machtigingen voor de persoonlijke sleutel van het certificaat. De activeringsstroom wordt aangeroepen telkens wanneer Service Fabric wordt gestart of wanneer de certificaatdeclaratie van de toepassing wordt gewijzigd via een upgrade. Het eindpuntcertificaat wordt ook gecontroleerd op wijzigingen/verlengingen en machtigingen worden zo nodig periodiek opnieuw toegepast.

Na het beëindigen van de service schoont Service Fabric de vermelding voor toegangsbeheer voor eindpunten op en verwijdert de certificaatbinding. Alle machtigingen die worden toegepast op de persoonlijke sleutel van het certificaat, worden echter niet opgeschoond.

Waarschuwing

Statische poorten mogen standaard niet overlappen met het poortbereik van de toepassing dat is opgegeven in de ClusterManifest. Als u een statische poort opgeeft, wijst u deze toe buiten het bereik van de toepassingspoort, anders leidt dit tot poortconflicten. Met versie 6.5CU2 geven we een statuswaarschuwing wanneer we een dergelijk conflict detecteren, maar laten we de implementatie synchroon doorgaan met het verzonden 6.5-gedrag. We kunnen echter voorkomen dat de toepassing wordt geïmplementeerd vanaf de volgende primaire releases.

Met release 7.0 geven we een statuswaarschuwing wanneer we detecteren dat het gebruik van het poortbereik van de toepassing verder gaat dan HostingConfig::ApplicationPortExhaustThresholdPercentage (standaard 80%).

<Resources>
  <Endpoints>
    <Endpoint Name="ServiceEndpoint1" Protocol="http"/>
    <Endpoint Name="ServiceEndpoint2" Protocol="http" Port="80"/>
    <Endpoint Name="ServiceEndpoint3" Protocol="https"/>
  </Endpoints>
</Resources>

Als er meerdere codepakketten in één servicepakket zijn, moet ook naar het codepakket worden verwezen in de sectie Eindpunten . Als ServiceEndpoint2a en ServiceEndpoint2b bijvoorbeeld eindpunten van hetzelfde servicepakket zijn die verwijzen naar verschillende codepakketten, wordt het codepakket dat overeenkomt met elk eindpunt als volgt verduidelijkt:

<Resources>
  <Endpoints>
    <Endpoint Name="ServiceEndpoint2a" Protocol="http" Port="802" CodePackageRef="Code1"/>
    <Endpoint Name="ServiceEndpoint2b" Protocol="http" Port="801" CodePackageRef="Code2"/>
  </Endpoints>
</Resources>

Raadpleeg Stateful Reliable Services configureren voor meer informatie over het verwijzen naar eindpunten in het configuratiepakketinstellingenbestand (settings.xml).

Voorbeeld: een HTTP-eindpunt voor uw service opgeven

Het volgende servicemanifest definieert één TCP-eindpuntresource en twee HTTP-eindpuntresources in het <element Resources> .

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

Voorbeeld: een HTTPS-eindpunt opgeven voor uw service

Het HTTPS-protocol biedt serververificatie en wordt ook gebruikt voor het versleutelen van client-servercommunicatie. Als u HTTPS wilt inschakelen voor uw Service Fabric-service, geeft u het protocol op in de sectie Resources -> Eindpunten -> Eindpunt van het servicemanifest, zoals eerder is weergegeven voor het eindpunt ServiceEndpoint3.

Notitie

Het protocol van een service kan niet worden gewijzigd tijdens de upgrade van de toepassing. Als deze tijdens de upgrade wordt gewijzigd, is dit een wijziging die fouten veroorzaakt.

Waarschuwing

Wanneer u HTTPS gebruikt, moet u niet dezelfde poort en hetzelfde certificaat gebruiken voor verschillende service-exemplaren (onafhankelijk van de toepassing) die op hetzelfde knooppunt zijn geïmplementeerd. Het upgraden van twee verschillende services met dezelfde poort in verschillende toepassingsexemplaren resulteert in een upgradefout. Zie Meerdere toepassingen upgraden met HTTPS-eindpunten voor meer informatie.

Hier volgt een voorbeeld van ApplicationManifest waarin de configuratie wordt gedemonstreerd die vereist is voor een HTTPS-eindpunt. Het server-/eindpuntcertificaat kan worden gedeclareerd met een vingerafdruk of een algemene onderwerpnaam en er moet een waarde worden opgegeven. EndpointRef is een verwijzing naar EndpointResource in ServiceManifest en waarvan het protocol moet zijn ingesteld op het https-protocol. U kunt meer dan één EndpointCertificate toevoegen.

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

Voor Linux-clusters wordt in het ARCHIEF MIJN standaard de map /var/lib/sfcerts gebruikt.

Zie Een HTTPS-eindpunt toevoegen aan een front-endservice van een ASP.NET Core web-API met behulp van Kestrel voor een voorbeeld van een volledige toepassing die gebruikmaakt van een HTTPS-eindpunt.

Poort-ACLing voor HTTP-eindpunten

Service Fabric zal automatisch ACL HTTP(S)-eindpunten die standaard worden opgegeven. Er wordt geen automatische ACLing uitgevoerd als aan een eindpunt geen SecurityAccessPolicy is gekoppeld en Service Fabric is geconfigureerd om te worden uitgevoerd met behulp van een account met beheerdersbevoegdheden.

Eindpunten in ServiceManifest.xml overschrijven

Voeg in het ApplicationManifest een sectie ResourceOverrides toe. Dit is hetzelfde als de sectie ConfigOverrides. In deze sectie kunt u de onderdrukking voor de sectie Eindpunten opgeven in de sectie resources die is opgegeven in het servicemanifest. Het overschrijven van eindpunten wordt ondersteund in runtime 5.7.217/SDK 2.7.217 en hoger.

Als u EndPoint in ServiceManifest wilt overschrijven met behulp van ApplicationParameters, wijzigt u het ApplicationManifest als volgt:

Voeg in de sectie ServiceManifestImport een nieuwe sectie 'ResourceOverrides' toe.

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

Voeg in de onderstaande parameters toe:

  <Parameters>
    <Parameter Name="Port" DefaultValue="" />
    <Parameter Name="Protocol" DefaultValue="" />
    <Parameter Name="Type" DefaultValue="" />
    <Parameter Name="Port1" DefaultValue="" />
    <Parameter Name="Protocol1" DefaultValue="" />
  </Parameters>

Tijdens het implementeren van de toepassing kunt u deze waarden doorgeven als ApplicationParameters. Bijvoorbeeld:

PS C:\> New-ServiceFabricApplication -ApplicationName fabric:/myapp -ApplicationTypeName "AppType" -ApplicationTypeVersion "1.0.0" -ApplicationParameter @{Port='1001'; Protocol='https'; Type='Input'; Port1='2001'; Protocol='http'}

Opmerking: als de opgegeven waarde voor een bepaalde ApplicationParameter leeg is, gaan we terug naar de standaardwaarde die is opgegeven in de ServiceManifest voor de bijbehorende EndPointName.

Bijvoorbeeld:

Als u in het ServiceManifest hebt opgegeven

  <Resources>
    <Endpoints>
      <Endpoint Name="ServiceEndpoint1" Protocol="tcp"/>
    </Endpoints>
  </Resources>

Stel dat de waarde port1 en protocol1 voor toepassingsparameters null of leeg is. De poort wordt bepaald door ServiceFabric en het protocol is tcp.

Stel dat u een verkeerde waarde opgeeft. Stel dat u voor Poort een tekenreekswaarde 'Foo' hebt opgegeven in plaats van een int. New-ServiceFabricApplication opdracht mislukt met een fout: The override parameter with name 'ServiceEndpoint1' attribute 'Port1' in section 'ResourceOverrides' is invalid. The value specified is 'Foo' and required is 'int'.

Volgende stappen

In dit artikel wordt uitgelegd hoe u eindpunten definieert in het servicemanifest van Service Fabric. Zie voor meer gedetailleerde voorbeelden:

Zie voor een overzicht van het verpakken en implementeren van een bestaande toepassing in een Service Fabric-cluster: