Určení prostředků v manifestu služby

Přehled

Aplikace a služby Service Fabric se definují a dají s verzí pomocí souborů manifestu. Přehled ServiceManifest.xml a ApplicationManifest.xml vyšší úrovně najdete v tématu Manifesty aplikací a služeb Service Fabric.

Manifest služby umožňuje deklarovat nebo měnit prostředky, které služba používá, beze změny zkompilovaného kódu. Service Fabric podporuje konfiguraci prostředků koncového bodu pro službu. Přístup k prostředkům, které jsou určeny v manifestu služby, lze řídit pomocí securitygroup v manifestu aplikace. Deklarace prostředků umožňuje tyto prostředky změnit v době nasazení, což znamená, že služba nemusí zavádět nový mechanismus konfigurace. Definice schématu pro soubor ServiceManifest.xml se nainstaluje spolu se sadou Service Fabric SDK a nástroji do složky C:\Program Files\Microsoft SDKs\Service Fabric\schemas\ServiceFabricServiceModel.xsd a je zdokumentována v dokumentaci ke schématu ServiceFabricServiceModel.xsd.

Koncové body

Když je prostředek koncového bodu definovaný v manifestu služby, Service Fabric přiřadí porty z rozsahu portů rezervované aplikace, pokud není port explicitně zadaný. Podívejte se například na koncový bod ServiceEndpoint1 zadaný ve fragmentu manifestu poskytnutém za tímto odstavcem. Kromě toho můžou služby také požadovat konkrétní port v prostředku. Replikám služeb běžícím na různých uzlech clusteru je možné přiřadit různá čísla portů, zatímco repliky služby spuštěné na stejném uzlu sdílejí port. Repliky služeb pak můžou tyto porty používat podle potřeby pro replikaci a naslouchání klientským požadavkům.

Po aktivaci služby, která určuje koncový bod https, Service Fabric nastaví položku řízení přístupu pro port, sváže zadaný certifikát serveru s portem a také udělí identitu, kterou služba spouští jako oprávnění k privátnímu klíči certifikátu. Tok aktivace se vyvolá při každém spuštění Service Fabric nebo při změně deklarace certifikátu aplikace prostřednictvím upgradu. Certifikát koncového bodu bude také monitorován, jestli nechybuje změny nebo prodlužování platnosti, a podle potřeby se budou oprávnění pravidelně znovu využít.

Po ukončení služby Service Fabric vyčistí položku řízení přístupu ke koncovému bodu a odebere vazbu certifikátu. Všechna oprávnění použitá pro privátní klíč certifikátu se ale nevyčistí.

Upozornění

Statické porty by se záměrně neměly překrývat s rozsahem portů aplikace zadaným v ClusterManifestu. Pokud zadáte statický port, přiřaďte ho mimo rozsah portů aplikace, jinak dojde ke konfliktům portů. Ve verzi 6.5CU2 vydáme upozornění na stav , když zjistíme takový konflikt, ale necháme nasazení pokračovat v synchronizaci s chováním dodané verze 6.5. Nasazení aplikace však můžeme zabránit v dalších hlavních verzích.

Ve verzi 7.0 vydáme upozornění na stav , když zjistíme, že využití rozsahu portů aplikace překračuje rámec HostingConfig::ApplicationPortExhaustThresholdPercentage (výchozí 80 %).

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

Pokud je v jednom balíčku služby více balíčků kódu, je potřeba odkazovat také na balíček kódu v části Koncové body . Pokud například ServiceEndpoint2a a ServiceEndpoint2b jsou koncové body ze stejného balíčku služby, které odkazují na různé balíčky kódu, balíček kódu odpovídající jednotlivým koncovým bodům se objasní takto:

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

Další informace o odkazování na koncové body ze souboru nastavení konfiguračního balíčku (settings.xml) najdete v tématu Konfigurace stavových služeb Reliable Services .

Příklad: Zadání koncového bodu HTTP pro vaši službu

Následující manifest služby definuje jeden prostředek koncového bodu TCP a dva prostředky koncového bodu HTTP v elementu <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>

Příklad: Určení koncového bodu HTTPS pro vaši službu

Protokol HTTPS zajišťuje ověřování serveru a používá se také k šifrování komunikace klient-server. Pokud chcete ve službě Service Fabric povolit protokol HTTPS, zadejte protokol v manifestu služby v části Prostředky –> Koncové body –> Koncový bod , jak je znázorněno výše pro koncový bod ServiceEndpoint3.

Poznámka

Během upgradu aplikace nelze změnit protokol služby. Pokud dojde ke změně během upgradu, jedná se o zásadní změnu.

Upozornění

Při použití protokolu HTTPS nepoužívejte stejný port a certifikát pro různé instance služby (nezávisle na aplikaci) nasazené do stejného uzlu. Upgrade dvou různých služeb pomocí stejného portu v různých instancích aplikace způsobí selhání upgradu. Další informace najdete v tématu Upgrade více aplikací pomocí koncových bodů HTTPS .

Tady je příklad ApplicationManifest demonstrující konfiguraci vyžadovanou pro koncový bod HTTPS. Certifikát serveru nebo koncového bodu může být deklarován kryptografickým otiskem nebo běžným názvem předmětu a musí být zadaná hodnota. EndpointRef je odkaz na EndpointResource v ServiceManifest, jehož protokol musí být nastavený na protokol https. Můžete přidat více než jeden koncový bodCertificate.

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

U clusterů s Linuxem je ve výchozím nastavení úložiště MY složka /var/lib/sfcerts.

Příklad úplné aplikace, která využívá koncový bod HTTPS, najdete v tématu Přidání koncového bodu HTTPS do front-end služby ASP.NET Core webového rozhraní API pomocí Kestrelu.

Port ACLing pro koncové body HTTP

Service Fabric automaticky použije koncové body ACL HTTP(S) zadané ve výchozím nastavení. Neprovádí automatické řízení přístupu, pokud koncový bod nemá přidruženou zásadu SecurityAccessPolicy a Service Fabric je nakonfigurovaný tak, aby se spouštěl pomocí účtu s oprávněními správce.

Přepsání koncových bodů v ServiceManifest.xml

V části ApplicationManifest přidejte část ResourceOverrides, která bude mít na stejné hodnotě jako část ConfigOverrides. V této části můžete zadat přepsání pro oddíl Koncové body v oddílu prostředků zadaném v manifestu služby. Přepsání koncových bodů se podporuje v modulu runtime 5.7.217/SDK 2.7.217 a novějším.

Pokud chcete přepsat EndPoint v ServiceManifest pomocí ApplicationParameters, změňte ApplicationManifest takto:

V části ServiceManifestImport přidejte nový oddíl 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>

V části Parametry přidejte následující:

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

Při nasazování aplikace můžete tyto hodnoty předat jako ApplicationParameters. Příklad:

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

Poznámka: Pokud je hodnota zadaná pro daný parametr ApplicationParameter prázdná, vrátíme se k výchozí hodnotě zadané v ServiceManifest pro odpovídající endPointName.

Příklad:

Pokud jste ve službě ServiceManifest zadali

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

Předpokládejme, že hodnota Port1 a Protocol1 pro parametry aplikace je null nebo prázdná. O portu rozhodne ServiceFabric a protokol bude tcp.

Předpokládejme, že zadáte nesprávnou hodnotu. Řekněme, že pro port jste zadali řetězcovou hodnotu Foo místo int. New-ServiceFabricApplication příkaz selže s chybou: The override parameter with name 'ServiceEndpoint1' attribute 'Port1' in section 'ResourceOverrides' is invalid. The value specified is 'Foo' and required is 'int'.

Další kroky

Tento článek vysvětluje, jak definovat koncové body v manifestu služby Service Fabric. Podrobnější příklady najdete tady:

Návod k zabalení a nasazení existující aplikace v clusteru Service Fabric najdete tady: