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 Manifesty aplikacji i 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 pliku ServiceManifest.xml jest zainstalowana przy użyciu zestawu SDK usługi Service Fabric i narzędzi do folderu 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 kodu 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ługi mogą następnie używać tych portów zgodnie z potrzebami 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ąż 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ślonych 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 zostanie wyświetlone ostrzeżenie o kondycji , gdy wykryjemy taki konflikt, ale pozwolimy na kontynuowanie synchronizacji wdrożenia z zachowaniem dostarczonym w wersji 6.5. Jednak możemy zapobiec wdrożeniu aplikacji z kolejnych głównych wersji.

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 jest 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 tematem 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

Następujący 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

Podczas uaktualniania aplikacji nie można zmienić protokołu usługi. Jeśli zostanie ona 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 za pomocą 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 wartość musi być podana. 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 MÓJ 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 biblioteki Kestrel.

Przenoszenie acling dla punktów końcowych HTTP

Usługa Service Fabric automatycznie wyświetli punkty końcowe HTTP listy ACL określone domyślnie. Nie będzie ona wykonywać automatycznego stosowania ACL, jeśli punkt końcowy nie ma skojarzonej z nią zasady zabezpieczeńAccessPolicy , a usługa Service Fabric jest skonfigurowana do uruchamiania 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 w 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 i nowszym.

Aby zastąpić program EndPoint w narzędziu 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. 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 odpowiadającego parametru EndPointName.

Przykład:

Jeśli w podanym pliku ServiceManifest

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

Załóżmy, że wartość Port1 i Protocol1 dla 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, jak definiować punkty końcowe w manifeście usługi Service Fabric. Aby uzyskać bardziej szczegółowe przykłady, zobacz:

Aby zapoznać się z przewodnikiem po pakowaniu i wdrażaniu istniejącej aplikacji w klastrze usługi Service Fabric, zobacz: