2017-05-16 81 views
1

我正在嘗試編寫一個封裝以獲得服務結構的本地反向代理的URI,並且我很難決定如何處理端口的可配置性(稱爲服務清單中的「HttpApplicationGatewayEndpoint」或arm模板中的「reverseProxyEndpointPort」)。我認爲這樣做的最好方法是從光纖客戶端調用「GetClusterManifestAsync」,並從那裏解析它,但由於幾個原因,我也不是這樣的粉絲。首先,調用返回一個字符串xml blob,它不會防止對清單模式的更改。我還沒有找到一種方法來查詢集羣管理器以找出我當前正在使用的節點類型,所以如果出於某種愚蠢的原因,集羣有多種節點類型,並且每個節點類型都有不同的反向代理端口(只是存在一個防守編碼器),這可能會失敗。似乎需要花費很多努力才能動態發現端口號,而且我之前肯定錯過了結構api中的任何內容,因此有關如何解決此問題的任何建議?服務結構反向代理端口的可配置性

編輯:

我從它從配置包中的服務獲得的端口號項目的例子看。我寧願不必這樣做,因爲那樣我將不得不爲每個需要使用它讀取配置並傳遞它的服務編寫大量的樣板文件。因爲這在運行時或多或少是一個常量,所以在我看來,這可以被視爲這樣並從織物客戶端的某個地方獲取?

回答

0

在對象瀏覽器花了一段時間後,我能夠找到所需的各個部分,以便正確完成此操作。

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"; 
     } 

    } 
} 

新聞我在本次調查的是,所有的模式對於任何服務織物XML的是在一個名爲System.Fabric.Management.ServiceModel組裝squirreled路程。