Ange resurser i ett tjänstmanifest

Översikt

Service Fabric och tjänster definieras och versionsdelade med hjälp av manifestfiler. En översikt på högre nivå över ServiceManifest.xml och ApplicationManifest.xml finns i Service Fabric och tjänstmanifest.

Tjänstmanifestet gör att resurser som används av tjänsten kan deklareras eller ändras utan att den kompilerade koden ändras. Service Fabric stöder konfiguration av slutpunktsresurser för tjänsten. Åtkomsten till de resurser som anges i tjänstmanifestet kan styras via SecurityGroup i programmanifestet. Deklarationen av resurser gör att dessa resurser kan ändras vid distributionen, vilket innebär att tjänsten inte behöver införa en ny konfigurationsmekanism. Schemadefinitionen för ServiceManifest.xml-filen installeras med Service Fabric SDK och verktyg till C:\Program Files\Microsoft SDK:er\Service Fabric\schemas\ServiceFabricServiceModel.xsd och dokumenteras i schemadokumentationen för ServiceFabricServiceModel.xsd.

Slutpunkter

När en slutpunktsresurs definieras i tjänstmanifestet Service Fabric till portar från det reserverade programmets portintervall när en port inte anges uttryckligen. Titta till exempel på slutpunkten ServiceEndpoint1 som anges i manifestfragmentet som anges efter det här stycket. Dessutom kan tjänster också begära en specifik port i en resurs. Tjänstrepliker som körs på olika klusternoder kan tilldelas olika portnummer, medan repliker av en tjänst som körs på samma nod delar porten. Tjänstreplikerna kan sedan använda dessa portar efter behov för replikering och lyssna efter klientbegäranden.

När du aktiverar en tjänst som anger en https-slutpunkt anger Service Fabric åtkomstkontrollposten för porten, binder det angivna servercertifikatet till porten och beviljar även den identitet som tjänsten kör som behörigheter till certifikatets privata nyckel. Aktiveringsflödet anropas varje gång Service Fabric startar eller när certifikatdeklarationen för programmet ändras via en uppgradering. Slutpunktscertifikatet övervakas också för ändringar/förnyelser och behörigheterna tillämpas regelbundet om det behövs.

När tjänsten avslutas rensar Service Fabric åtkomstkontrollposten för slutpunkten och tar bort certifikatbindningen. Behörigheter som tillämpas på certifikatets privata nyckel rensas dock inte.

Varning

Statiska portar får inte överlappa programportintervallet som anges i ClusterManifest. Om du anger en statisk port tilldelar du den utanför programportintervallet, annars resulterar det i portkonflikter. Med version 6.5CU2 utfärdar vi en hälsovarning när vi identifierar en sådan konflikt men låter distributionen fortsätta synkronisera med det levererade beteendet 6.5. Vi kan dock förhindra programdistributionen från nästa större versioner.

Med version 7.0 utfärdar vi en hälsovarning när vi identifierar användning av programportintervall utöver HostingConfig::ApplicationPortExhaustThresholdPercentage (standardvärdet är 80 %).

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

Om det finns flera kodpaket i ett enda tjänstpaket måste kodpaketet också refereras till i avsnittet Slutpunkter. Om Till exempel ServiceEndpoint2a och ServiceEndpoint2b är slutpunkter från samma tjänstpaket som refererar till olika kodpaket, förtydligas kodpaketet som motsvarar varje slutpunkt på följande sätt:

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

I Konfigurera tillståndsful Reliable Services du läsa mer om att referera till slutpunkter från konfigurationspaketets inställningsfil (settings.xml).

Exempel: Ange en HTTP-slutpunkt för din tjänst

Följande tjänstmanifest definierar en TCP-slutpunktsresurs och två HTTP-slutpunktsresurser i < elementet > Resurser.

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

Exempel: Ange en HTTPS-slutpunkt för din tjänst

HTTPS-protokollet tillhandahåller serverautentisering och används även för kryptering av klient-server-kommunikation. Om du vill aktivera HTTPS på Service Fabric-tjänsten anger du protokollet i avsnittet Resurser ->-slutpunkter ->-slutpunkt i tjänstmanifestet, som visades tidigare för slutpunkten ServiceEndpoint3.

Anteckning

En tjänsts protokoll kan inte ändras under programuppgradering. Om den ändras under uppgraderingen är det en stor ändring.

Varning

När du använder HTTPS ska du inte använda samma port och certifikat för olika tjänstinstanser (oberoende av programmet) som distribuerats till samma nod. Uppgradering av två olika tjänster med samma port i olika programinstanser resulterar i ett uppgraderingsfel. Mer information finns i Uppgradera flera program med HTTPS-slutpunkter.

Här är ett exempel på en ApplicationManifest som demonstrerar konfigurationen som krävs för en HTTPS-slutpunkt. Server-/slutpunktscertifikatet kan deklareras med tumavtryck eller ämnesnamnet och ett värde måste anges. EndpointRef är en referens till EndpointResource i ServiceManifest och vars protokoll måste ha angetts till https-protokollet. Du kan lägga till fler än en 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>

För Linux-kluster använder MY-arkivet som standard mappen /var/lib/sfcerts.

Ett exempel på ett fullständigt program som använder en HTTPS-slutpunkt finns i Lägga till en HTTPS-slutpunkt i en ASP.NET Core Web API-klientdelstjänst med hjälp av Kestrel.

Port-ACLing för HTTP-slutpunkter

Service Fabric automatiskt HTTP(S)-slutpunkter för ACL:er som anges som standard. Den utför inte automatisk åtkomstkontroll om en slutpunkt inte har någon associerad SecurityAccessPolicy och Service Fabric har konfigurerats för att köras med ett konto med administratörsbehörighet.

Åsidosätta slutpunkter i ServiceManifest.xml

I ApplicationManifest lägger du till ett ResourceOverrides-avsnitt som ska vara på samma plats som avsnittet ConfigOverrides. I det här avsnittet kan du ange åsidosättningen för avsnittet Slutpunkter i avsnittet resurser som anges i tjänstmanifestet. Åsidosättning av slutpunkter stöds i runtime 5.7.217/SDK 2.7.217 och senare.

Om du vill åsidosätta EndPoint i ServiceManifest med ApplicationParameters ändrar du ApplicationManifest så här:

I avsnittet ServiceManifestImport lägger du till ett nytt avsnitt, 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>

I Parameter lägger du till nedan:

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

När du distribuerar programmet kan du skicka in dessa värden som ApplicationParameters. Exempel:

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

Obs! Om värdet för en viss ApplicationParameter är tomt går vi tillbaka till standardvärdet som anges i ServiceManifest för motsvarande EndPointName.

Exempel:

Om du har angett i ServiceManifest

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

Anta att värdet Port1 och Protocol1 för programparametrarna är null eller tomt. Porten bestäms av ServiceFabric och protokollet blir tcp.

Anta att du anger ett fel värde. Säg för Port att du har angett strängvärdet "Foo" i stället för ett int. New-ServiceFabricApplication misslyckas med ett fel: The override parameter with name 'ServiceEndpoint1' attribute 'Port1' in section 'ResourceOverrides' is invalid. The value specified is 'Foo' and required is 'int'.

Nästa steg

I den här artikeln förklaras hur du definierar Service Fabric i tjänstmanifestet. Mer detaljerade exempel finns i:

En genomgång av paketering och distribution av ett befintligt program på ett Service Fabric kluster finns i: