Menentukan sumber daya dalam manifes layanan

Gambaran Umum

Aplikasi dan layanan Service Fabric didefinisikan dan dibuat versinya menggunakan file manifes. Untuk gambaran umum tingkat yang lebih tinggi dari ServiceManifest.xml dan ApplicationManifest.xml, lihat manifes aplikasi dan layanan Service Fabric.

Manifes layanan memungkinkan sumber daya yang digunakan oleh layanan untuk dideklarasikan, atau diubah, tanpa mengubah kode yang telah dikompilasi. Service Fabric mendukung konfigurasi sumber daya titik akhir untuk layanan ini. Akses ke sumber daya yang ditentukan dalam manifes layanan dapat dikontrol melalui SecurityGroup dalam manifes aplikasi. Deklarasi sumber daya memungkinkan sumber daya ini diubah pada waktu penyebaran, yang berarti layanan tidak perlu memperkenalkan mekanisme konfigurasi baru. Definisi skema untuk file ServiceManifest.xml diinstal dengan Service Fabric SDK dan alat untuk C:\Program Files\Microsoft SDKs\Service Fabric\schemas\ServiceFabricServiceModel.xsd, dan didokumentasikan dalam dokumentasi skema ServiceFabricServiceModel.xsd.

Titik Akhir

Ketika sumber daya titik akhir didefinisikan dalam manifes layanan, Service Fabric menetapkan port dari rentang port aplikasi yang dipesan ketika port tidak ditentukan secara eksplisit. Misalnya, lihat titik akhir ServiceEndpoint1 yang ditentukan dalam cuplikan manifes yang disediakan setelah paragraf ini. Selain itu, layanan juga dapat meminta port tertentu di sumber daya. Replika servis yang berjalan pada node kluster yang berbeda dapat ditetapkan nomor port yang berbeda, sementara replika layanan yang berjalan pada node yang sama akan menggunakan port secara bersamaan. Replika layanan kemudian dapat menggunakan port ini sesuai kebutuhan untuk replikasi dan mendengarkan permintaan klien.

Setelah mengaktifkan layanan yang menentukan titik akhir https, Service Fabric akan mengatur entri kontrol akses untuk port, mengikat sertifikat server yang ditentukan ke port, dan juga memberikan identitas bahwa layanan berjalan sebagai izin untuk kunci privat sertifikat. Alur aktivasi dipanggil setiap kali Service Fabric dimulai, atau ketika deklarasi sertifikat aplikasi diubah melalui peningkatan. Sertifikat titik akhir juga akan dipantau untuk perubahan/pembaruan, dan izin akan diterapkan kembali secara berkala jika diperlukan.

Setelah penghentian layanan, Service Fabric akan membersihkan entri kontrol akses titik akhir, dan menghapus pengikatan sertifikat. Namun, izin apa pun yang diterapkan pada kunci privat sertifikat tidak akan dibersihkan.

Peringatan

Sesuai peruntukannya, port statis tidak boleh tumpang tindih dengan rentang port aplikasi yang ditentukan dalam ClusterManifest. Jika Anda menentukan port statis, tetapkan port di luar rentang port aplikasi, jika tidak, maka akan mengakibatkan konflik port. Dengan rilis 6.5CU2 kita akan mengeluarkan Peringatan Kesehatan ketika mendeteksi konflik seperti itu tetapi membiarkan penyebaran terus selaras dengan perilaku 6.5 yang dikirimkan. Namun, kita dapat mencegah penyebaran aplikasi dari rilis utama berikutnya.

Dengan rilis 7.0 kita akan mengeluarkan Peringatan Kesehatan ketika mendeteksi penggunaan rentang port aplikasi melampaui HostingConfig::ApplicationPortExhaustThresholdPercentage(default 80%).

<Resources>
  <Endpoints>
    <Endpoint Name="ServiceEndpoint1" Protocol="http"/>
    <Endpoint Name="ServiceEndpoint2" Protocol="http" Port="80"/>
    <Endpoint Name="ServiceEndpoint3" Protocol="https"/>
  </Endpoints>
</Resources>

Jika ada beberapa paket kode dalam satu paket layanan, maka paket kode tersebut juga perlu direferensikan di bagian Titik Akhir. Misalnya, jika ServiceEndpoint2a dan ServiceEndpoint2b adalah titik akhir dari paket layanan yang sama yang merujuk pada paket kode yang berbeda, paket kode yang sesuai dengan setiap titik akhir diklarifikasi sebagai berikut:

<Resources>
  <Endpoints>
    <Endpoint Name="ServiceEndpoint2a" Protocol="http" Port="802" CodePackageRef="Code1"/>
    <Endpoint Name="ServiceEndpoint2b" Protocol="http" Port="801" CodePackageRef="Code2"/>
  </Endpoints>
</Resources>

Lihat Mengonfigurasi Layanan Andal stateful untuk membaca selengkapnya tentang mereferensikan titik akhir dari file pengaturan paket konfigurasi (settings.xml).

Contoh: menentukan titik akhir HTTP untuk layanan Anda

Manifes layanan berikut mendefinisikan satu sumber daya titik akhir TCP dan dua sumber daya titik akhir HTTP dalam elemen <Sumber Daya>.

<?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>

Contoh: menentukan titik akhir HTTPS untuk layanan Anda

Protokol HTTPS menyediakan autentikasi server dan juga digunakan untuk mengenkripsi komunikasi klien-server. Untuk mengaktifkan HTTPS di layanan Service Fabric Anda, tentukan protokol di bagian Sumber Daya -> Titik Akhir -> Titik Akhir manifes layanan, seperti ditunjukkan di awal untuk titik akhir ServiceEndpoint3.

Catatan

Protokol layanan tidak dapat diubah selama peningkatan aplikasi. Jika diubah selama peningkatan, berarti merupakan perubahan yang melanggar.

Peringatan

Saat menggunakan HTTPS, jangan gunakan port dan sertifikat yang sama untuk instans layanan yang berbeda (independen dari aplikasi) yang disebarkan ke node yang sama. Memperbarui dua layanan berbeda menggunakan port yang sama dalam instans aplikasi yang berbeda akan mengakibatkan kegagalan pembaruan. Untuk informasi selengkapnya, lihat Memperbarui beberapa aplikasi dengan titik akhir HTTPS .

Berikut adalah contoh ApplicationManifest yang menunjukkan konfigurasi yang diperlukan untuk titik akhir HTTPS. Sertifikat server/titik akhir dapat dideklarasikan dengan thumbprint atau nama umum subjek, dan nilai harus disediakan. EndpointRef adalah referensi ke EndpointResource di ServiceManifest, dan yang protokolnya harus sudah diatur ke protokol 'https'. Anda dapat menambahkan lebih dari satu 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>

Untuk kluster Linux, penyimpanan SAYA diubah ke default folder /var/lib/sfcerts.

Untuk contoh aplikasi lengkap yang menggunakan titik akhir HTTPS, lihat menambahkan titik akhir HTTPS ke layanan front-end Core Web API ASP.NET menggunakan Kestrel.

Port ACLing untuk Titik Akhir HTTP

Service Fabric akan secara otomatis melakukan ACL HTTP(S) titik akhir yang ditentukan secara default. Ini tidak akan melakukan ACLing otomatis jika titik akhir tidak memiliki SecurityAccessPolicy yang terkait dengannya dan Service Fabric dikonfigurasi untuk berjalan menggunakan akun dengan hak administrator.

Mengesampingkan Titik Akhir di ServiceManifest.xml

Di ApplicationManifest, tambahkan bagian ResourceOverrides, yang akan menjadi sibling ke bagian ConfigOverrides. Di bagian ini, Anda dapat menentukan penimpaan untuk bagian Titik Akhir di bagian sumber daya yang ditentukan dalam manifes Layanan. Penimpaan titik akhir didukung pada runtime 5.7.217/SDK 2.7.217 dan yang lebih tinggi.

Untuk menimpa EndPoint di ServiceManifest menggunakan ApplicationParameters, ubah ApplicationManifest seperti:

Di bagian ServiceManifestImport, tambahkan bagian baru "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>

Dalam Parameters, tambahkan di bawah ini:

  <Parameters>
    <Parameter Name="Port" DefaultValue="" />
    <Parameter Name="Protocol" DefaultValue="" />
    <Parameter Name="Type" DefaultValue="" />
    <Parameter Name="Port1" DefaultValue="" />
    <Parameter Name="Protocol1" DefaultValue="" />
  </Parameters>

Saat menyebarkan aplikasi, Anda dapat meneruskan nilai-nilai ini sebagai ApplicationParameters. Contohnya:

PS C:\> New-ServiceFabricApplication -ApplicationName fabric:/myapp -ApplicationTypeName "AppType" -ApplicationTypeVersion "1.0.0" -ApplicationParameter @{Port='1001'; Protocol='https'; Type='Input'; Port1='2001'; Protocol='http'}

Catatan: Jika nilai yang disediakan untuk ApplicationParameter tertentu kosong, kita kembali ke nilai default yang disediakan di ServiceManifest untuk EndPointName yang sesuai.

Contohnya:

Jika dalam ServiceManifest Anda yang sudah Anda tentukan

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

Asumsikan nilai Port1 dan Protocol1 untuk parameter Aplikasi null atau kosong. Port akan diputuskan oleh ServiceFabric dan Protokol akan tcp.

Misalkan Anda menentukan nilai yang salah. Katakanlah untuk Port Anda menentukan nilai string "Foo" alih-alih int. Perintah New-ServiceFabricApplication akan gagal dengan kesalahan: The override parameter with name 'ServiceEndpoint1' attribute 'Port1' in section 'ResourceOverrides' is invalid. The value specified is 'Foo' and required is 'int'.

Langkah berikutnya

Artikel ini menjelaskan cara menentukan titik akhir dalam manifes layanan Service Fabric. Untuk contoh lebih rinci, lihat:

Untuk melihat-lihat pengemasan dan penyebaran aplikasi yang ada pada kluster Service Fabric, lihat: