20

サービス ファブリック アプリケーションには、 を介して HTTP エンドポイントを公開するステートレス サービスが含まれていますOwinCommunicationListener

このサービスの ServiceManifest.Xml は、サービス エンドポイントを指定します<Endpoint Name="ServiceEndpoint" Type="Input" Protocol="http" Port="8090" />

ステートレス サービスは、 http://localhost:8090/のブラウザーを介してアクセスできます。

私たちがやろうとしているのは、ApplicationManifest を使用して、同じ Service Fabric アプリケーション内の異なるエンドポイントでこのサービスの複数のインスタンスをインスタンス化することです。

ServiceManifestImportサービス パッケージをインポートし、アプリケーション レベルでの構成のオーバーライドを可能にします。この方法で ServiceEndpoint をオーバーライドすることはできません。Settings.xml の値のみです。

<ServiceManifestImport>
  <ServiceManifestRef ServiceManifestName="FooServicePkg" ServiceManifestVersion="1.0.0" >
    <ConfigOverrides Name="Config">
      <Settings>
        <SectionName Name="MySettings">
        <Parameter Name="MySetting" Value="SomeValue">
      </Settings>
    </ConfigOverrides>
</ServiceManifestImport>

Service下に複数のノードを指定することで、サービスの名前付きインスタンスを作成できますDefaultServices

<DefaultServices>
  <Service Name="FooInstanceA">
    <StatelessService ServiceTypeName="FooType" InstanceCount="1" />
      <SingletonPartition />
    </StatelessService>
  </Service>
  <Service Name="FooInstanceB">
    <StatelessService ServiceTypeName="FooType" InstanceCount="1" />
      <SingletonPartition />
    </StatelessService>
  </Service>
</DefaultServices>

構成を通じて、サービスのインスタンスごとに構成のオーバーライドを指定することはできますか?

I tried to make the service instances listen on a specific port by using their service name to work out which port so FooInstanceA listens on port 8090 and FooInstanceB listens on 8091.

Clearly Service Fabric is doing some magic during deployment because when FooInstanceB listens on a port other than the one specified on the ServiceEndpoint configuration the service is not accessible.

The first reason is the DACL is not set on the endpoint, this is resolved by running;

netsh http add urlacl http://+:8091/ user=everyone listen=yes

This allows the services to come up and show healthy in the Service Fabric Explorer, however the FooInstanceB is responding with an HTTP 503 error when we access with http://localhost:8091/

How can we get the service instances listening on different ports?

I hope that's clear, thank you.

4

4 に答える 4

7

これを達成するための優れたオプションは多くありません。ここにいくつかのアイデアがあります:

  1. アプリ内で同じ種類のサービスを複数作成するのではなく、複数のアプリケーション インスタンスを作成します。これにより、アプリ パラメーターを使用して特定のサービスの動作を構成できます。
  2. サービス タイプ内に複数の構成パッケージを作成します。各構成パッケージは、サービス インスタンスの 1 つを対象としています。サービス インスタンスが割り当てられている構成パッケージを決定するには、おそらくサービス インスタンスの名前に基づいて、動的にする必要がありますか? もちろん、これはサービス定義と作成されるインスタンスの数を結びつけるため、優れたオプションではありません。
  3. カスタム構成の実装。展開後に構成できるエンドポイントをサービスに公開させることもできます。または、アクティブ化時に構成を提供する他の管理サービスをサービスに呼び出させます。
于 2016-04-29T20:43:23.293 に答える