Dela via


Ange resurser i ett tjänstmanifest

Översikt

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

Med tjänstmanifestet kan resurser som används av tjänsten 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. Resursdeklarationen gör att dessa resurser kan ändras vid distributionen, vilket innebär att tjänsten inte behöver införa någon ny konfigurationsmekanism. Schemadefinitionen för ServiceManifest.xml-filen installeras med Service Fabric SDK och verktyg till C:\Program Files\Microsoft SDKs\Service Fabric\schemas\ServiceFabricServiceModel.xsd och dokumenteras i dokumentationen för ServiceFabricServiceModel.xsd-schema.

Slutpunkter

När en slutpunktsresurs definieras i tjänstmanifestet tilldelar Service Fabric portar från det reserverade programportintervallet när en port inte uttryckligen anges. 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örigheter tillämpas regelbundet igen efter behov.

När tjänsten har avslutats 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 bör inte överlappa med programportintervallet som anges i ClusterManifest. Om du anger en statisk port tilldelar du den utanför programmets portintervall, annars uppstår 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 synkroniseras med det levererade 6.5-beteendet. 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(standard 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>

Mer information om hur du refererar till slutpunkter från konfigurationspaketets inställningsfil (settings.xml) finns i Konfigurera tillståndskänsliga Reliable Services .

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

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

<?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 tidigare visades för slutpunkten ServiceEndpoint3.

Kommentar

Det går inte att ändra en tjänsts protokoll under programuppgraderingen. Om den ändras under uppgraderingen är det en icke-bakåtkompatibel ä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å ApplicationManifest som visar den konfiguration som krävs för en HTTPS-slutpunkt. Server-/slutpunktscertifikatet kan deklareras med tumavtryck eller ämnesnamn 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 mer ä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 är MY Store 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 till en ASP.NET Core Web API-klientdelstjänst med hjälp av Kestrel.

Port-ACL för HTTP-slutpunkter

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

Åsidosättande slutpunkter i ServiceManifest.xml

I avsnittet ApplicationManifest lägger du till ett ResourceOverrides-avsnitt, som kommer att vara ett syskon till avsnittet ConfigOverrides. I det här avsnittet kan du ange åsidosättningen för avsnittet Slutpunkter i avsnittet resurser som anges i tjänstmanifestet. Övergripande slutpunkter stöds i runtime 5.7.217/SDK 2.7.217 och senare.

För att åsidosätta EndPoint i ServiceManifest med ApplicationParameters ändrar du ApplicationManifest som sådan:

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 parametertillägget 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. Till 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.

Till exempel:

Om du angav i ServiceManifest

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

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

Anta att du anger ett fel värde. Anta att för Port har du angett ett strängvärde "Foo" i stället för en int. Kommandot 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 beskrivs hur du definierar slutpunkter i Service Fabrics tjänstmanifest. Mer detaljerade exempel finns i:

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