2017-05-16 2 views
1

Ich versuche, eine Verkapselung zu erhalten, die uri für eine lokale Reverse-Proxy für den Dienst Stoff zu schreiben und ich bin eine harte Zeit, zu entscheiden, wie ich Konfigurierbarkeit für den Hafen nähern will (auch bekannt als "HttpApplicationGatewayEndpoint" im Dienstmanifest oder "reverseProxyEndpointPort" in der Armvorlage). Der beste Weg, den ich mir vorgenommen habe, wäre "GetClusterManifestAsync" vom Fabric-Client aufzurufen und von dort aus zu parsen, aber ich bin auch kein Fan davon aus ein paar Gründen. Zum einen gibt der Aufruf eine Zeichenfolge xml blob zurück, die nicht gegen Änderungen des Manifestschemas geschützt ist. Ich habe auch noch keine Möglichkeit gefunden, den Clustermanager abzufragen, um herauszufinden, auf welchem ​​Knotentyp ich gerade bin, also wenn der Cluster aus einem dummen Grund mehrere Knotentypen hat und jeder einen anderen Reverse-Proxy-Port hat hier ein defensiver Kodierer), der möglicherweise scheitern könnte. Es scheint sehr mühsam zu sein, diese Portnummer dynamisch zu erkennen, und ich habe auf jeden Fall Dinge in der Fabric API verpasst, also irgendwelche Vorschläge, wie Sie dieses Problem angehen können?Service-Fabric Reverse-Proxy-Port Konfigurierbarkeit

Edit:

Ich bin aus dem Beispielprojekt zu sehen, dass es aus einer Konfigurationspaket im Dienst die Portnummer zu bekommen. Ich würde es lieber nicht so machen müssen, denn dann muss ich für jeden Dienst, der dies zum Lesen von Configs benötigt, eine Menge Vortex schreiben. Da dies zur Laufzeit mehr oder weniger eine Konstante ist, scheint es mir so zu sein, dass dies als solche behandelt und irgendwo vom Fabric-Client abgerufen werden könnte.

Antwort

0

Nach einiger Zeit, die ich im Objektbrowser verbracht habe, konnte ich die verschiedenen Teile finden, die ich brauchte, um das richtig zu machen.

public class ReverseProxyPortResolver 
{ 
    /// <summary> 
    /// Represents the port that the current fabric node is configured 
    /// to use when using a reverse proxy on localhost 
    /// </summary> 
    public static AsyncLazy<int> ReverseProxyPort = new AsyncLazy<int>(async()=> 
    { 
     //Get the cluster manifest from the fabric client & deserialize it into a hardened object 
     ClusterManifestType deserializedManifest; 
     using (var cl = new FabricClient()) 
     { 
      var manifestStr = await cl.ClusterManager.GetClusterManifestAsync().ConfigureAwait(false); 
      var serializer = new XmlSerializer(typeof(ClusterManifestType)); 

      using (var reader = new StringReader(manifestStr)) 
      { 
       deserializedManifest = (ClusterManifestType)serializer.Deserialize(reader); 
      } 
     } 

     //Fetch the setting from the correct node type 
     var nodeType = GetNodeType(); 
     var nodeTypeSettings = deserializedManifest.NodeTypes.Single(x => x.Name.Equals(nodeType)); 
     return int.Parse(nodeTypeSettings.Endpoints.HttpApplicationGatewayEndpoint.Port); 
    }); 

    private static string GetNodeType() 
    { 
     try 
     { 
      return FabricRuntime.GetNodeContext().NodeType; 
     } 
     catch (FabricConnectionDeniedException) 
     { 
      //this code was invoked from a non-fabric started application 
      //likely a unit test 
      return "NodeType0"; 
     } 

    } 
} 

Nachrichten in dieser Untersuchung war für mich, dass alle Schema für einen des Service Stoff xml ist System.Fabric.Management.ServiceModel in einer Baugruppe namens squirreled entfernt.

Verwandte Themen