Sdílet prostřednictvím


Zadání prostředků v manifestu služby

Přehled

Aplikace a služby Service Fabric jsou definovány a verzemi pomocí souborů manifestu. Přehled ServiceManifest.xml a ApplicationManifest.xml vyšší úrovně najdete v manifestech aplikací a služeb Service Fabric.

Manifest služby umožňuje deklarovat nebo měnit prostředky používané službou beze změny zkompilovaného kódu. Service Fabric podporuje konfiguraci prostředků koncových bodů pro službu. Přístup k prostředkům zadaným v manifestu služby je možné řídit prostřednictvím skupiny zabezpečení v manifestu aplikace. Deklarace prostředků umožňuje, aby se tyto prostředky v době nasazení měnily, což znamená, že služba nemusí zavést nový konfigurační mechanismus. Definice schématu pro soubor ServiceManifest.xml je nainstalována se sadou Service Fabric SDK a nástroji pro C:\Program Files\Microsoft SDKs\Service Fabric\schemas\ServiceFabricServiceModel.xsd a je zdokumentovaná v dokumentaci ke schématu ServiceFabricServiceModel.xsd.

Koncové body

Pokud je prostředek koncového bodu definovaný v manifestu služby, Service Fabric přiřadí porty z vyhrazeného rozsahu portů aplikace, pokud není port explicitně zadaný. Podívejte se například na koncový bod ServiceEndpoint1 zadaný v fragmentu manifestu poskytnutém po tomto odstavci. Kromě toho můžou služby také požadovat konkrétní port v prostředku. Repliky služeb spuštěné 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žby pak můžou tyto porty podle potřeby používat 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, vytvoří vazbu zadaného certifikátu serveru na port a také udělí identitu, která služba běží 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 se také bude monitorovat kvůli změnám nebo prodloužením platnosti a oprávnění se budou podle potřeby pravidelně znovu použít.

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

Upozorňující

Statické porty by se 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 expedované 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 využití rozsahu portů aplikace nad 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 v jednom balíčku služby existuje více balíčků kódu, je potřeba na balíček kódu odkazovat také v části Koncové body . Pokud jsou například koncové body ServiceEndpoint2a a ServiceEndpoint2b ze stejného balíčku služby odkazující na různé balíčky kódu, je balíček kódu odpovídající každému koncovému bodu vysvětlen 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: Zadání koncového bodu HTTPS pro vaši službu

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

Poznámka:

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

Upozorňující

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 naleznete 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 subjektu a musí být zadaná hodnota. EndpointRef je odkaz na EndpointResource ve službě 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>

V případě linuxových clusterů se ve výchozím nastavení uloží 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-endové služby webového rozhraní API ASP.NET Core pomocí Kestrel.

Port ACLing pro koncové body HTTP

Service Fabric automaticky zadá koncové body HTTP(S) seznamu ACL zadané ve výchozím nastavení. Pokud koncový bod nemá přidruženou zásadu SecurityAccessPolicy a Service Fabric je nakonfigurovaný tak, aby běžel pomocí účtu s oprávněními správce, neprovádí automatické řízení přístupu.

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

V souboru ApplicationManifest přidejte oddíl ResourceOverrides, který bude na stejné stejné straně jako configOverrides oddíl. V této části můžete zadat přepsání oddílu Koncové body v části prostředky zadané v manifestu služby. Přepsání koncových bodů je podporováno v modulu runtime 5.7.217/SDK 2.7.217 a novějších.

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 danou hodnotu ApplicationParameter prázdná, vrátíme se k výchozí hodnotě zadané v ServiceManifest pro odpovídající Název Koncového bodu.

Příklad:

Pokud jste zadali serviceManifest

  <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 se rozhodne ServiceFabric a protokol bude tcp.

Předpokládejme, že zadáte nesprávnou hodnotu. Řekněme pro port, že jste místo int zadali řetězcovou hodnotu Foo. Příkaz New-ServiceFabricApplication 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:

Postup balení a nasazení existující aplikace v clusteru Service Fabric najdete tady: