Подтвердить что ты не робот

Ткань службы Несколько экземпляров службы с переопределением конфигурации

В нашем приложении сервисной службы есть служба без состояния, которая предоставляет конечную точку HTTP через OwinCommunicationListener.

Служба ServiceManifest.Xml для этой службы указывает конечную точку службы <Endpoint Name="ServiceEndpoint" Type="Input" Protocol="http" Port="8090" />

Доступ к службе без состояния можно получить через браузер на http://localhost:8090/

То, что мы пытаемся сделать, это создать несколько экземпляров этой службы на разных конечных точках в одном приложении приложения-службы через ApplicationManifest.

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>

Можно ли указать переопределения конфигурации на экземпляр службы через конфигурацию?

Я попытался заставить экземпляры службы прослушиваться на определенном порту, используя их имя службы, чтобы определить, какой порт, который FooInstanceA прослушивает на порту 8090, а FooInstanceB прослушивает 8091.

Очевидно, что в процессе развертывания проявляется мастерство в использовании, потому что, когда FooInstanceB слушает порт, отличный от того, который указан в конфигурации ServiceEndpoint, служба недоступна.

Первая причина заключается в том, что DACL не установлен на конечной точке, это разрешено путем запуска;

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

Это позволяет службам появляться и отображаться здоровыми в Проводнике Fabric, однако FooInstanceB отвечает ошибкой HTTP 503, когда мы получаем доступ с http://localhost:8091/

Как мы можем заставить экземпляры службы прослушивать разные порты?

Я надеюсь, что это понятно, спасибо.

4b9b3361

Ответ 1

Не так уж много вариантов для этого. Вот несколько идей:

  • Создайте несколько экземпляров приложений вместо нескольких сервисов одного и того же типа в приложении. Это позволит вам использовать параметры приложения для настройки поведения конкретной службы.
  • Создайте несколько конфигурационных пакетов в вашем типе сервиса. Каждый пакет конфигурации предназначен для одного из экземпляров службы. Определение того, какой конфигурационный пакет назначается экземпляру службы, должен быть динамическим, возможно, на основе имени экземпляра службы? Разумеется, это отличный вариант, поскольку он объединяет определение службы с количеством экземпляров, которые будут созданы.
  • Реализация пользовательской конфигурации. Возможно, ваша служба предоставляет конечную точку, которая позволяет вам настроить ее после развертывания. Или позвоните в службу другой службы управления, которая предоставляет свою конфигурацию во время активации.

Ответ 2

Вы также можете разрешить службе Fabric назначать порты автоматически, а затем использовать обратный прокси-сервер, который поставляется с Service Fabric.

Ответ 3

Я думаю, что очень хорошая идея иметь службу перезаписи URL-адресов перед кластером SF.

Это может дать вам несколько конечных точек и выполнить переписывание URL, брандмауэры/черную распечатку, https и т.д.

Другой способ заключается в том, чтобы упаковать службу как lib или в Nuget и создать необходимые N сервисы с различными манифестами службы.