Share via


Resources specificeren in een servicemanifest

Overzicht

Service Fabric-toepassingen en -services worden gedefinieerd en geversied met behulp van manifestbestanden. Zie Service Fabric-toepassings- 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 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\schemas\ServiceFabricServiceModel.xsd en wordt beschreven in de schemadocumentatie van ServiceFabricServiceModel.xsd.

Eindpunten

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

Wanneer u een service activeert die een https-eindpunt opgeeft, stelt Service Fabric de vermelding voor toegangsbeheer voor de poort in, verbindt u het opgegeven servercertificaat aan de poort en verleent u 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/vernieuwingen en machtigingen worden indien nodig regelmatig opnieuw toegepast.

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

Waarschuwing

Statische poorten mogen standaard niet overlappen met toepassingspoortbereik dat is opgegeven in het 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 laten we de implementatie gesynchroniseerd blijven met het verzonden 6.5-gedrag. We kunnen echter voorkomen dat de toepassing wordt geïmplementeerd in de volgende grote 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 staan, 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 stateful Reliable Services configureren voor meer informatie over het verwijzen naar eindpunten uit het bestand met configuratiepakketinstellingen (settings.xml).

Voorbeeld: een HTTP-eindpunt opgeven voor uw service

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 wordt 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 belangrijke wijziging.

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. Als u twee verschillende services bijwerken met dezelfde poort in verschillende toepassingsexemplaren, treedt er een upgradefout op. 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 vingerafdruk of algemene naam van 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 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 MY-archief standaard de map /var/lib/sfcerts gebruikt.

Zie Voor een voorbeeld van een volledige toepassing die gebruikmaakt van een HTTPS-eindpunt , een HTTPS-eindpunt toevoegen aan een ASP.NET Core Web API front-endservice met behulp van Kestrel.

Poort-ACLing voor HTTP-eindpunten

Service Fabric gebruikt automatisch ACL HTTP(S)-eindpunten die standaard zijn opgegeven. Er wordt geen automatische ACL uitgevoerd als er geen SecurityAccessPolicy aan een eindpunt is gekoppeld en Service Fabric is geconfigureerd voor uitvoering met behulp van een account met beheerdersbevoegdheden.

Eindpunten in ServiceManifest.xml overschrijven

Voeg in de sectie ApplicationManifest een sectie ResourceOverrides toe. Dit is een hetzelfde niveau 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. Voorbeeld:

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 in het ServiceManifest voor de bijbehorende EndPointName.

Voorbeeld:

Als u in het ServiceManifest 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 is tcp.

Stel dat u een verkeerde waarde opgeeft. Stel voor poort dat u een tekenreekswaarde 'Foo' hebt opgegeven in plaats van een int. De opdracht New-ServiceFabricApplication 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: