Określanie zasobów w manifeście usługi
Omówienie
Aplikacje i usługi Service Fabric są definiowane i wersjonowane przy użyciu plików manifestu. Aby zapoznać się z ogólnym omówieniem ServiceManifest.xml i ApplicationManifest.xml, zobacz Service Fabric application and service manifests (Manifesty aplikacji i usług usługi Service Fabric).
Manifest usługi umożliwia zadeklarowanie lub zmianę zasobów używanych przez usługę bez zmiany skompilowanego kodu. Usługa Service Fabric obsługuje konfigurację zasobów punktu końcowego dla usługi. Dostęp do zasobów określonych w manifeście usługi można kontrolować za pośrednictwem grupy zabezpieczeń w manifeście aplikacji. Deklaracja zasobów umożliwia zmianę tych zasobów w czasie wdrażania, co oznacza, że usługa nie musi wprowadzać nowego mechanizmu konfiguracji. Definicja schematu dla pliku ServiceManifest.xml jest instalowana przy użyciu zestawu SDK usługi Service Fabric i narzędzi do katalogu C:\Program Files\Microsoft SDKs\Service Fabric\schemas\ServiceFabricServiceModel.xsd i jest udokumentowana w dokumentacji schematu ServiceFabricServiceModel.xsd.
Punkty końcowe
Gdy zasób punktu końcowego jest zdefiniowany w manifeście usługi, usługa Service Fabric przypisuje porty z zakresu portów aplikacji zarezerwowanej, gdy port nie jest określony jawnie. Na przykład zapoznaj się z punktem końcowym ServiceEndpoint1 określonym w fragmencie manifestu podanym po tym akapicie. Ponadto usługi mogą również żądać określonego portu w zasobie. Repliki usługi uruchomione w różnych węzłach klastra można przypisać różne numery portów, podczas gdy repliki usługi uruchomionej w tym samym węźle współużytkuje port. Repliki usług mogą następnie używać tych portów w razie potrzeby do replikacji i nasłuchiwania żądań klientów.
Po aktywowaniu usługi, która określa punkt końcowy https, usługa Service Fabric ustawi wpis kontroli dostępu dla portu, powiąże określony certyfikat serwera z portem, a także przyzna tożsamość uruchomioną przez usługę jako uprawnienia do klucza prywatnego certyfikatu. Przepływ aktywacji jest wywoływany za każdym razem, gdy usługa Service Fabric jest uruchamiana lub gdy deklaracja certyfikatu aplikacji zostanie zmieniona za pośrednictwem uaktualnienia. Certyfikat punktu końcowego będzie również monitorowany pod kątem zmian/odnawiania, a uprawnienia będą okresowo ponownie stosować w razie potrzeby.
Po zakończeniu usługi usługa Service Fabric wyczyści wpis kontroli dostępu punktu końcowego i usunie powiązanie certyfikatu. Jednak wszystkie uprawnienia zastosowane do klucza prywatnego certyfikatu nie zostaną wyczyszczone.
Ostrzeżenie
Zgodnie z projektem porty statyczne nie powinny nakładać się na zakres portów aplikacji określony w pliku ClusterManifest. Jeśli określisz port statyczny, przypisz go poza zakresem portów aplikacji, w przeciwnym razie spowoduje to konflikty portów. W wersji 6.5CU2 wydamy ostrzeżenie o kondycji, gdy wykryjemy taki konflikt, ale niech wdrożenie będzie nadal synchronizowane z dostarczonym zachowaniem wersji 6.5. Możemy jednak uniemożliwić wdrożenie aplikacji w następnych głównych wersjach.
W wersji 7.0 zostanie wyświetlone ostrzeżenie o kondycji, gdy wykryjemy użycie zakresu portów aplikacji wykracza poza wartość HostingConfig::ApplicationPortExhaustThresholdPercentage (domyślnie 80%).
<Resources>
<Endpoints>
<Endpoint Name="ServiceEndpoint1" Protocol="http"/>
<Endpoint Name="ServiceEndpoint2" Protocol="http" Port="80"/>
<Endpoint Name="ServiceEndpoint3" Protocol="https"/>
</Endpoints>
</Resources>
Jeśli w jednym pakiecie usługi istnieje wiele pakietów kodu, należy również odwołać się do pakietu kodu w sekcji Punkty końcowe . Jeśli na przykład serviceEndpoint2a i ServiceEndpoint2b są punktami końcowymi z tego samego pakietu usługi odwołującego się do różnych pakietów kodu, pakiet kodu odpowiadający każdemu punktowi końcowemu zostanie wyjaśniony w następujący sposób:
<Resources>
<Endpoints>
<Endpoint Name="ServiceEndpoint2a" Protocol="http" Port="802" CodePackageRef="Code1"/>
<Endpoint Name="ServiceEndpoint2b" Protocol="http" Port="801" CodePackageRef="Code2"/>
</Endpoints>
</Resources>
Zapoznaj się z artykułem Konfigurowanie stanowych usług Reliable Services , aby dowiedzieć się więcej na temat odwoływania się do punktów końcowych z pliku ustawień pakietu konfiguracji (settings.xml).
Przykład: określanie punktu końcowego HTTP dla usługi
Poniższy manifest usługi definiuje jeden zasób punktu końcowego TCP i dwa zasoby punktu końcowego HTTP w elemecie <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>
Przykład: określanie punktu końcowego HTTPS dla usługi
Protokół HTTPS zapewnia uwierzytelnianie serwera i jest również używany do szyfrowania komunikacji klient-serwer. Aby włączyć protokół HTTPS w usłudze Service Fabric, określ protokół w sekcji Zasoby —> punkty końcowe —> punkt końcowy manifestu usługi, jak pokazano wcześniej dla punktu końcowego ServiceEndpoint3.
Uwaga
Nie można zmienić protokołu usługi podczas uaktualniania aplikacji. Jeśli zmiana zostanie zmieniona podczas uaktualniania, będzie to zmiana powodująca niezgodność.
Ostrzeżenie
W przypadku korzystania z protokołu HTTPS nie używaj tego samego portu i certyfikatu dla różnych wystąpień usługi (niezależnie od aplikacji) wdrożonych w tym samym węźle. Uaktualnienie dwóch różnych usług przy użyciu tego samego portu w różnych wystąpieniach aplikacji spowoduje niepowodzenie uaktualnienia. Aby uzyskać więcej informacji, zobacz Uaktualnianie wielu aplikacji przy użyciu punktów końcowych HTTPS.
Oto przykład ApplicationManifest demonstrujący konfigurację wymaganą dla punktu końcowego HTTPS. Certyfikat serwera/punktu końcowego może być zadeklarowany przez odcisk palca lub nazwę pospolitą podmiotu, a należy podać wartość. Element EndpointRef jest odwołaniem do elementu EndpointResource w programie ServiceManifest i którego protokół musi być ustawiony na protokół "https". Możesz dodać więcej niż jeden element 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>
W przypadku klastrów systemu Linux magazyn MY jest domyślnie przechowywany w folderze /var/lib/sfcerts.
Aby zapoznać się z przykładem pełnej aplikacji korzystającej z punktu końcowego HTTPS, zobacz Dodawanie punktu końcowego HTTPS do usługi frontonu internetowego interfejsu API platformy ASP.NET Core przy użyciu usługi Kestrel.
Przenoszenie portów dla punktów końcowych HTTP
Usługa Service Fabric automatycznie wyświetli punkty końcowe HTTP listy ACL określone domyślnie. Jeśli punkt końcowy nie ma skojarzonej z nim zasady SecurityAccessPolicy, usługa Service Fabric nie będzie wykonywać automatycznego przełączania przy użyciu konta z uprawnieniami administratora.
Zastępowanie punktów końcowych w ServiceManifest.xml
W sekcji ApplicationManifest dodaj sekcję ResourceOverrides, która będzie elementem równorzędnym do sekcji ConfigOverrides. W tej sekcji można określić przesłonięć dla sekcji Punkty końcowe w sekcji zasobów określonej w manifeście usługi. Zastępowanie punktów końcowych jest obsługiwane w środowisku uruchomieniowym 5.7.217/SDK 2.7.217 lub nowszym.
Aby zastąpić program EndPoint w programie ServiceManifest przy użyciu parametrów ApplicationParameters, zmień parametr ApplicationManifest w następujący sposób:
W sekcji ServiceManifestImport dodaj nową sekcję "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>
W obszarze Parametry dodaj poniżej:
<Parameters>
<Parameter Name="Port" DefaultValue="" />
<Parameter Name="Protocol" DefaultValue="" />
<Parameter Name="Type" DefaultValue="" />
<Parameter Name="Port1" DefaultValue="" />
<Parameter Name="Protocol1" DefaultValue="" />
</Parameters>
Podczas wdrażania aplikacji można przekazać te wartości jako ApplicationParameters. Na przykład:
PS C:\> New-ServiceFabricApplication -ApplicationName fabric:/myapp -ApplicationTypeName "AppType" -ApplicationTypeVersion "1.0.0" -ApplicationParameter @{Port='1001'; Protocol='https'; Type='Input'; Port1='2001'; Protocol='http'}
Uwaga: Jeśli wartość podana dla danego parametru ApplicationParameter jest pusta, wróćmy do wartości domyślnej podanej w pliku ServiceManifest dla odpowiedniego parametru EndPointName.
Na przykład:
Jeśli w pliku ServiceManifest określono
<Resources>
<Endpoints>
<Endpoint Name="ServiceEndpoint1" Protocol="tcp"/>
</Endpoints>
</Resources>
Załóżmy, że wartość Port1 i Protocol1 parametrów aplikacji ma wartość null lub jest pusta. Port zostanie podjęty przez usługę ServiceFabric, a protokół będzie tcp.
Załóżmy, że określisz nieprawidłową wartość. Załóżmy, że dla portu określono wartość ciągu "Foo" zamiast int. Polecenie New-ServiceFabricApplication zakończy się niepowodzeniem z powodu błędu: The override parameter with name 'ServiceEndpoint1' attribute 'Port1' in section 'ResourceOverrides' is invalid. The value specified is 'Foo' and required is 'int'.
Następne kroki
W tym artykule wyjaśniono sposób definiowania punktów końcowych w manifeście usługi Service Fabric. Aby uzyskać bardziej szczegółowe przykłady, zobacz:
Aby zapoznać się z omówieniem tworzenia pakietów i wdrażania istniejącej aplikacji w klastrze usługi Service Fabric, zobacz: