2016-07-22 6 views
3
  1. Lets sagen, dass ich Service A und B in Service-Fabric-Cluster gehostet haben. Sie hören (innerhalb des Clusters) auf Port 7001 bzw. 7002.
  2. Lassen Sie mich sagen, dass ich den Service Fabric Load Balancer auf Port 8001 zu überwachen konfigurieren und die Anforderung an Port 7001 (innerhalb des Clusters) für Service A weiterleiten und auf Port 8002 abhören und die Anforderung an Port 7002 weiterleiten (innerhalb des Clusters) für Service B.
  3. Nehmen wir an, dass ich API-Verwaltung für Service A und B konfiguriere und die Anforderungen an die entsprechenden Ports auf dem Lastenausgleich weiterleiten.
  4. Das alles funktioniert.
  5. Anstatt die URL-Route für jeden Dienst manuell zuzuordnen, möchte ich nun Dienste, die in Service Fabric gehostet werden (aus der API-Verwaltung), dynamisch ermitteln und die Anforderung zur Laufzeit dynamisch weiterleiten.
  6. Um dies zu tun, ich weiß, ich muss eine Richtlinie schreiben (in C# höchstwahrscheinlich), um diese Informationen von irgendwo nachzuschlagen.
  7. Aber ich bin mir nicht sicher, was genau zu laden last-ausgeglichene Ports und Dienste im Service-Fabric-Cluster abfragen.
  8. Ich dachte daran, einen anderen Service C im selben Service-Fabric-Cluster zu erstellen und ihn (aus der API-Verwaltung) zu verwenden, um die Insiderinformationen des Clusters bereitzustellen.
  9. Ich konnte jedoch keine Möglichkeit finden, entweder lokale Service-Port-Informationen nachzuschlagen oder ausgewogene Service-Port-Informationen zu laden.

Wie gehe ich vor?Wie kann ich in Service Fabric gehostete Services dynamisch aus der API-Verwaltung ermitteln?

Antwort

14

Hier finden Sie eine Möglichkeit, Dienste und Endpoints zu erkennen, die im Cluster ausgeführt werden. (Beachten Sie, dass Sie benötigen, um zu Änderungen zu überwachen.)

private static void ListEndpoints() 
{ 
    var resolver = ServicePartitionResolver.GetDefault(); 
    var fabricClient = new FabricClient(); 
    var apps = fabricClient.QueryManager.GetApplicationListAsync().Result; 
    foreach (var app in apps) 
    { 
     Console.WriteLine($"Discovered application:'{app.ApplicationName}"); 

     var services = fabricClient.QueryManager.GetServiceListAsync(app.ApplicationName).Result; 
     foreach (var service in services) 
     { 
      Console.WriteLine($"Discovered Service:'{service.ServiceName}"); 

      var partitions = fabricClient.QueryManager.GetPartitionListAsync(service.ServiceName).Result; 
      foreach (var partition in partitions) 
      { 
       Console.WriteLine($"Discovered Service Partition:'{partition.PartitionInformation.Kind} {partition.PartitionInformation.Id}"); 


       ServicePartitionKey key; 
       switch (partition.PartitionInformation.Kind) 
       { 
        case ServicePartitionKind.Singleton: 
         key = ServicePartitionKey.Singleton; 
         break; 
        case ServicePartitionKind.Int64Range: 
         var longKey = (Int64RangePartitionInformation)partition.PartitionInformation; 
         key = new ServicePartitionKey(longKey.LowKey); 
         break; 
        case ServicePartitionKind.Named: 
         var namedKey = (NamedPartitionInformation)partition.PartitionInformation; 
         key = new ServicePartitionKey(namedKey.Name); 
         break; 
        default: 
         throw new ArgumentOutOfRangeException("partition.PartitionInformation.Kind"); 
       } 
       var resolved = resolver.ResolveAsync(service.ServiceName, key, CancellationToken.None).Result; 
       foreach (var endpoint in resolved.Endpoints) 
       { 
        Console.WriteLine($"Discovered Service Endpoint:'{endpoint.Address}"); 
       } 
      } 
     } 
    } 
} 

Sie können mit dem Loadbalancer kommunizieren Powershell mit:

Get-AzureRmLoadBalancer 

Schließlich müssen Sie einen Weg zu entwickeln, um Vergleichen Sie Loadbalancer-Backend-Ports mit den Serviceendpunkten selbst.

+0

Ich war eine Weile weg. Das ist fantastisch. Vielen Dank. – Raghu

+0

Während dies gut ist, spiegelt dies keine Änderungen aufgrund von Skalierung wider. (Wenn Sie diesen Code ausführen, öffnen Sie den Explorer (Port 19080) und wählen Sie, um einen Dienst für mehr oder weniger Instanzen zu skalieren, und führen Sie diesen Code erneut aus (aber starten Sie den ausgeführten Dienst nicht neu) vorherige Endpunkte – Vaccano