Resources opgeven in een servicemanifest

Overzicht

Service Fabric toepassingen en services worden gedefinieerd en versierversies met behulp van manifestbestanden. Zie toepassings- en servicemanifests voor ServiceManifest.xml en ApplicationManifest.xml Service Fabric een overzicht op een hoger niveau.

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 eindpuntbronnen 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 voor C:\Program Files\Microsoft SDK's\Service Fabric\schema's\ServiceFabricServiceModel.xsd en wordt beschreven in de schemadocumentatie van ServiceFabricServiceModel.xsd.

Eindpunten

Wanneer een eindpuntresource wordt gedefinieerd in het servicemanifest, wijst Service Fabric poorten toe vanuit het poortbereik van de gereserveerde toepassing wanneer een poort niet expliciet is opgegeven. Bekijk bijvoorbeeld 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 worden uitgevoerd op verschillende clusterknooppunten kunnen verschillende poortnummers worden toegewezen, terwijl replica's van een service die wordt uitgevoerd op hetzelfde knooppunt de poort delen. De servicereplica's kunnen deze poorten vervolgens naar behoefte gebruiken voor replicatie en het luisteren naar clientaanvragen.

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

Nadat de service is beëindigd, Service Fabric de toegangsbeheerinvoer van het eindpunt op en wordt de certificaatbinding verwijderd. Alle machtigingen die worden toegepast op de persoonlijke sleutel van het certificaat, worden echter niet opgeschoond.

Waarschuwing

Statische poorten mogen niet overlappen met het poortbereik van de toepassing dat is opgegeven in ClusterManifest. Als u een statische poort opgeeft, wijst u deze toe buiten het poortbereik van de toepassing, anders leidt dit tot poortconflicten. Met release 6.5CU2 geven we een statuswaarschuwing wanneer we een dergelijk conflict detecteren, maar de implementatie synchroon laten gaan met het verzonden 6.5-gedrag. Het is echter mogelijk dat de implementatie van de toepassing uit de volgende grote releases wordt voorkomen.

Bij release 7.0 geven we een statuswaarschuwing uit wanneer het gebruik van het poortbereik van de toepassing wordt gedetecteerd en het gebruik van het poortbereik verder gaat dan HostingConfig::ApplicationPortExglotThresholdPercentage (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 er ook naar het codepakket worden verwezen in de sectie Eindpunten. Als ServiceEndpoint2a en ServiceEndpoint2b bijvoorbeeld eindpunten zijn van hetzelfde servicepakket dat verwijst 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 Configuring stateful Reliable Services (Stateful eindpunten 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 voor uw service opgeven

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 -> Endpoints -> Endpoint van het servicemanifest, zoals eerder is weergegeven voor eindpunt ServiceEndpoint3.

Notitie

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

Waarschuwing

Wanneer u HTTPS gebruikt, gebruikt u niet dezelfde poort en hetzelfde certificaat 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 toepassings instances leidt tot een upgradefout. Zie Meerdere toepassingen upgraden met HTTPS-eindpunten voor meer informatie.

Hier is een voorbeeld ApplicationManifest dat de configuratie demonstreert die vereist is voor een HTTPS-eindpunt. Het server-/eindpuntcertificaat kan worden gedeclareerd met de algemene naam van de vingerafdruk of het onderwerp 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 Eindpuntcertificate 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 de my store standaard ingesteld op de map /var/lib/sfcerts.

Zie Een HTTPS-eindpunt toevoegen aan een ASP.NET Core Web API-front-endservicemet behulp van Kestrel voor een voorbeeld van een volledige toepassing die gebruik maakt van een HTTPS-eindpunt.

Poort-ACL voor HTTP-eindpunten

Service Fabric worden automatisch ACL HTTP(S)-eindpunten opgegeven die standaard zijn opgegeven. Er wordt geen automatische ACL 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 de ServiceManifest.xml

Voeg in de sectie ApplicationManifest een sectie ResourceOverrides toe. Dit is een op hetzelfde punt als de sectie ConfigOverrides. In deze sectie kunt u de overschrijven 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 het eindpunt in ServiceManifest wilt overschrijven met Behulp van ApplicationParameters, wijzigt u ApplicationManifest als zodanig:

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 parameters hieronder 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 ServiceManifest voor de bijbehorende EndPointName.

Bijvoorbeeld:

Als in het ServiceManifest dat u hebt opgegeven

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

Stel dat de waarde voor Poort1 en Protocol1 voor Toepassingsparameters null of leeg is. De poort wordt bepaald door ServiceFabric en het Protocol wordt 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 is uitgelegd hoe u eindpunten definieert in Service Fabric servicemanifest van uw toepassing. Zie voor meer gedetailleerde voorbeelden:

Voor een overzicht van het verpakken en implementeren van een bestaande toepassing op een Service Fabric cluster, zie: