Určení prostředků v manifestu služby
Přehled
Service Fabric aplikace a služby jsou definovány a oceněny pomocí souborů manifestu. Vyšší přehled o funkcích a ServiceManifest.xml ApplicationManifest.xml najdete v Service Fabric manifestů aplikacía služeb.
Manifest služby umožňuje deklarovat nebo změnit prostředky používané službou beze změny zkompilovaný kód. Service Fabric podporuje konfiguraci prostředků koncového bodu 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 změnit tyto prostředky v době nasazení, což znamená, že služba nemusí zavádět nový konfigurační mechanismus. Definice schématu pro soubor ServiceManifest.xml se instaluje spolu se sadou Service Fabric SDK a nástroji do složky 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 porty z vyhrazeného rozsahu portů aplikace, pokud není port explicitně zadaný. Podívejte se například na koncový bod ServiceEndpoint1 zadaný ve fragmentu manifestu zadaném po tomto odstavci. Služby mohou také požádat o konkrétní port v prostředku. Replikám služby běžící 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í tento port. Repliky služby pak mohou tyto porty podle potřeby použít pro replikaci a naslouchání požadavkům klientů.
Po aktivaci služby, která určuje koncový bod https, nastaví Service Fabric položku řízení přístupu pro port, sváže zadaný certifikát serveru s portem a také udělí identitě, že služba běží jako oprávnění k privátnímu klíči certifikátu. Tok aktivace se vyvolá při Service Fabric spuštění nebo při změně deklarace certifikátu aplikace prostřednictvím upgradu. U certifikátu koncového bodu se také budou monitorovat změny nebo prodloužení a oprávnění se budou pravidelně podle potřeby opakovaně nasaovat.
Po ukončení služby Service Fabric vyčistí položku řízení přístupu koncového bodu a odebere vazbu certifikátu. Žádná oprávnění použitá na privátní klíč certifikátu se však nevyčištěna.
Upozornění
Statické porty by se neměly překrývat s rozsahem portů aplikace zadaným v souboru ClusterManifest. 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 při zjištění takového konfliktu upozornění na stav, ale umožníme, aby nasazení pokračovalo v synchronizaci s dodaného chování 6.5. Nasazení aplikace ale můžeme zabránit v dalších hlavních verzích.
Ve verzi 7.0 zobrazíme upozornění na stav, když zjistíme, že využití rozsahu portů aplikace překračuje hodnotu HostingConfig::ApplicationPortExhaustThresholdPercentage (výchozí hodnota je 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, pak je potřeba na balíček kódu také odkazovat v části Koncové body. Pokud jsou například ServiceEndpoint2a a ServiceEndpoint2b koncové body ze stejného balíčku služby odkazující na různé balíčky kódu, balíček kódu odpovídající jednotlivým koncovým bodům je 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 Reliable Services souboru nastavení konfiguračního balíčku najdete v tématu Konfigurace stavových settings.xml).
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 zajišťuje ověřování serveru a používá se také k šifrování komunikace mezi klientem a serverem. Pokud chcete povolit HTTPS ve službě Service Fabric, zadejte protokol v části Resources -> Endpoints -> Endpoint (Prostředky -> Koncové body -> Koncový bod) manifestu služby, jak je znázorněno dříve pro koncový bod ServiceEndpoint3.
Poznámka
Protokol služby není možné během upgradu aplikace změnit. Pokud se během upgradu změní, jedná se o změnu narušování.
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é na stejném uzlu. Upgrade dvou různých služeb pomocí stejného portu v různých instancích aplikace bude mít za následek selhání upgradu. Další informace najdete v tématu Upgrade více aplikací pomocí koncových bodů HTTPS.
Tady je příklad ApplicationManifestu demonstrující konfiguraci požadovanou pro koncový bod HTTPS. Certifikát serveru nebo koncového bodu může být deklarován kryptografický otisk nebo běžný název subjektu a musí být poskytnuta hodnota. EndpointRef je odkaz na EndpointResource v ServiceManifestu, jehož protokol musí být nastavený na protokol https. Můžete přidat více než jeden 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>
Pro clustery s Linuxem je výchozí úložiště MY ve složce /var/lib/sfcerts.
Příklad úplné aplikace, která použí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.
ACL portu pro koncové body HTTP
Service Fabric ve výchozím nastavení automaticky zadáte koncové body HTTP(S) seznamu ACL. Neprovádí automatické ACL, pokud ke koncovému bodu není přidružená vlastnost 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 souboru ApplicationManifest přidejte oddíl ResourceOverrides, který bude na stejné úrovni jako oddíl ConfigOverrides. V této části můžete zadat přepsání pro část Koncové body v části resources zadané v manifestu služby. Přepisová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 Soubor ApplicationManifest takto:
V části ServiceManifestImport přidejte novou část 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>
Do čá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_aplikace prázdná, vrátíme se k výchozí hodnotě zadané v souboru ServiceManifest pro odpovídající název_koncového_bodu.
Příklad:
Pokud jste v souboru ServiceManifest zadali
<Resources>
<Endpoints>
<Endpoint Name="ServiceEndpoint1" Protocol="tcp"/>
</Endpoints>
</Resources>
Předpokládejme, že hodnota Port1 a Protokol1 pro parametry aplikace má hodnotu null nebo je prázdná. O portu bude rozhodovat 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 typu 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ětlil, jak definovat koncové body Service Fabric manifestu služby. Podrobnější příklady najdete v těchto tématu:
Další informace o balení a nasazení existující aplikace do clusteru Service Fabric najdete v těchto materiálech: