2015-12-08 15 views
17

Nasza aplikacja do obsługi usług obejmuje usługę bezstanową, która udostępnia punkt końcowy HTTP przez OwinCommunicationListener.Service Fabric Wiele instancji usługi z zastąpieniem konfiguracji

ServiceManifest.Xml za tę usługę określa punktu końcowego usługi <Endpoint Name="ServiceEndpoint" Type="Input" Protocol="http" Port="8090" />

bezstanowej usługi można następnie uzyskać za pośrednictwem przeglądarki na http://localhost:8090/

co staramy się robić to wystąpienia wielu wystąpień tej usługi na różne punkty końcowe w tej samej aplikacji Service Fabric za pośrednictwem ApplicationManifest.

Importuje nasz pakiet usług i umożliwia nadpisanie konfiguracji na poziomie aplikacji. Nie jesteśmy w stanie przesłonić ServiceEndpoint ten sposób, tylko wartości w 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> 

możemy utworzyć nazwany wystąpień usługi poprzez określenie wielokrotności Service węzły pod

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

Czy możliwe jest określenie nadpisań konfiguracji na wystąpienie usługi poprzez konfigurację?

Próbowałem zrobić instancje usług słuchania na określonym porcie, używając ich nazwy usługi pracować który port tak FooInstanceA nasłuchuje na porcie 8090 i FooInstanceB nasłuchuje 8091.

Wyraźnie usługi Fabric robi jakąś magię podczas wdrażania, ponieważ gdy FooInstanceB nasłuchuje na porcie innym niż ten określony w konfiguracji ServiceEndpoint, usługa nie jest dostępna.

Pierwszym powodem jest to, że lista DACL nie jest ustawiona na punkcie końcowym, jest to rozwiązywane przez uruchomienie;

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

Pozwala to usługi wymyślić i pokazać zdrowy w służbie Fabric Explorer, jednak FooInstanceB reaguje z HTTP 503 błąd, gdy mamy dostęp z http://localhost:8091/

Jak możemy uzyskać instancji serwisowych słuchanie na różnych portach?

Mam nadzieję, że to jasne, dziękuję.

+3

Czy kiedykolwiek to rozwiązałeś? Jeśli tak, czy nie myślisz podsumowując odpowiedź? – FlavorScape

+0

Mam podobny problem. Mam jeden typ usługi, który chciałbym utworzyć wiele instancji z różnymi konfiguracjami. Teraz muszę zarejestrować inny typ usługi z tymi samymi, z wyjątkiem jednego parametru. Jestem zaskoczony, że SF nie ma możliwości przekazania dodatkowych parametrów do instancji serwisowych, oczekiwałbym, że będzie to powszechne miejsce. –

Odpowiedz

6

Nie ma wiele doskonałych opcji, aby to osiągnąć. Oto kilka pomysłów:

  1. Tworzenie wielu wystąpień aplikacji zamiast wielu usług tego samego typu w obrębie aplikacji. To pozwoliłoby ci użyć parametrów aplikacji do skonfigurowania zachowania konkretnej usługi.
  2. Tworzenie wielu pakietów konfiguracyjnych w ramach typu usługi. Każdy pakiet konfiguracyjny będzie przeznaczony dla jednej z instancji serwisowych. Ustalenie, który pakiet konfiguracyjny jest przypisany do instancji usługi, musi być dynamiczne, być może oparte na nazwie instancji usługi? Oczywiście nie jest to dobra opcja, ponieważ łączy definicję usługi z liczbą utworzonych instancji.
  3. Własna konfiguracja. Być może Twoja usługa ujawnia punkt końcowy, który umożliwia skonfigurowanie go po wdrożeniu.Lub zlecić usługę innej usłudze zarządzania, która zapewnia jej konfigurację w momencie aktywacji.
+0

Dla numeru 2, jak czytasz nazwę instancji usługi? Wydaje się, że zawierają tylko długi identyfikator, który wydaje się losowy dla instancji. Jeśli instancja ulegnie awarii/uruchomieniu, przydzielany jest nowy ID. Trzeba by uzyskać identyfikator oparty na indeksie, co obecnie nie wydaje się możliwe. – FrankerZ

+0

Nie widzę, jak opcje # 1 i # 2 rozwiążą jego problem, a także # 3 nie pomaga, ponieważ musi on pracować nad błędną decyzją projektową punktów końcowych tkaniny usługowej, które są mocno zakodowane w manifeście usługi. Żadna z tych 3 sugestii nie pominie faktu, że nadal musisz powiedzieć materiałowi serwisowemu, które porty słuchać, aby słuchać. –

+0

Czy istnieje możliwość implementacji http i https za pomocą dwóch różnych aplikacji ApplicationManifest? – Ghebrehiywet

2

Można również zezwolić firmie Service Fabric na automatyczne przypisanie portów, a następnie użyć odwrotnego proxy, który jest dostarczany z usługą Service Fabric.

0

Myślę, że to bardzo dobry pomysł, aby mieć usługę przepisywania adresu URL przed klastrem SF.

Może to zapewnić wiele punktów końcowych i możliwość przepisywania adresów URL, zapory/czarny wpis, https itp.

Innym sposobem jest spakowanie usługi jako biblioteki lib lub w Nuget i utworzenie potrzebnych usług N za pomocą różnych manifestów usług.

+0

OK, więc tworzymy 2 nazwane usługi w tkaninie usługowej. Service1 i Service2. Teraz, w jaki sposób załadować saldo żądań do usługi 1/usługa 2 za pośrednictwem 'ServiceProxy.Create'? – FrankerZ

+0

Nie za pomocą ServiceProxy.Create else potrzebujesz logiki zrozumienia jej 2 usług. Jeśli korzystasz z http i powinieneś wtedy większość bramek do przepisywania adresu URL może to zrobić, np. Ngix. Na rozmieszczeniu Blue Green jest coś: https://blogs.msdn.microsoft.com/cloud_solution_architect/2016/10/17/bluegreen-deployments-in-service-fabric/ – user1496062

Powiązane problemy