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 za pomocą 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 jawnie określony. 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ług uruchomione w różnych węzłach klastra mogą mieć przypisane 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ść, którą usługa jest uruchomiona 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 jest zmieniana za pośrednictwem uaktualnienia. Certyfikat punktu końcowego będzie również monitorowany pod kątem zmian/odnowień, a uprawnienia będą okresowo ponownie stosować w razie potrzeby.

Po zakończeniu działania usługi usługa Service Fabric wyczyści wpis kontroli dostępu do 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 zostanie wyświetlone ostrzeżenie o kondycji , gdy wykryjemy taki konflikt, ale pozwolimy na kontynuowanie synchronizacji wdrożenia z dostarczonym zachowaniem 6.5. Jednak możemy uniemożliwić wdrożenie aplikacji w następnych głównych wersjach.

W wersji 7.0 zostanie wyświetlone ostrzeżenie o kondycji , gdy wykryjemy, że 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

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

Nie można zmienić protokołu usługi podczas uaktualniania aplikacji. W przypadku zmiany podczas uaktualniania jest 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 i 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 domyślnie jest folderem /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 ASP.NET Core przy użyciu usługi Kestrel.

Przenoszenie aclowania 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 zostanie 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 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 Parametry aplikacji. 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.

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, 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: