2017-02-17 37 views
0

我已經安裝有兩個服務,一個標準的ASPNET核心API,並按照這裏的指導另一個節點快遞app的應用程序:不轉發服務織物命名服務到端點分配給客戶可執行

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-deploy-existing-app

當我在本地部署應用程序,我可以使用命名服務打AspNetCore應用程序,如:

http://localhost:19081/sf_node_test_02/AspNetCore/api/values

同樣,我也希望能夠打API使用這個地址我的客人可執行的:

http://localhost:19081/sf_node_test_02/NodeApp

但是,這是行不通的。 如果我使用該服務的直接鏈接,例如: http://localhost:30032/我可以看到節點JS應用程序實際上是在按預期工作。

現在,我知道運行ASPNET核心應用程序被明確發送它監聽地址返回給命名服務,但客人可執行文件是不是讓解釋了爲什麼他們會表現不同的時候。另外,從我的理解服務織物的當前版本不提供客戶可執行大約一個動態分配的端口信息,因此,必須在服務端點進行硬編碼,並在應用程序偵聽同一端口上。

E.g.如果我有:

<Endpoint Name="NodeAppTypeEndpoint" Port="30032" Protocol="http" Type="Input" UriScheme="http"/> 

然後在應用程序的NodeJS我也要有:

const port = process.env.PORT || 30032; 
app.listen(port,() => { 
    console.log(`Listening on port: ${port}`); 
}); 

在這兩個地方注意的30032。

從文檔:

而且你可以要求服務布到這個端點發布到 命名服務,以便其他服務可以發現端點地址 這項服務。這使您能夠在 作爲訪客可執行文件的服務之間進行通信。所公佈的端點地址的形式UriScheme的 :// IPAddressOrFQDN:端口/ PathSuffix。 UriScheme和 PathSuffix是可選屬性。 IPAddressOrFQDN是IP地址 或完全合格的域名這個可執行文件被放置在 的節點,它是爲您計算。

我理解這意味着,如果我的ServiceManifest.xml既有UseImplicitHost="true"那麼就應該自動放棄命名服務由端點描述構建的URL。

http://localhost:19081/sf_node_test_02/NodeApp -> http://localhost:30032

它是糾正服務織物會自動給命名服務,這個監聽地址這項服務?

有沒有辦法讓我檢查命名服務中的映射? 這會讓我知道它是否具有我的節點應用程序的條目,但它與我期望的不同,或者實際上沒有條目。

如果它沒有條目,那麼我不知道該客戶可執行應用程序在雲中部署時如何對公衆可見。

回答

1

您可以使用QueryManagerFabricClient列出羣集中服務的已註冊端點。這應該顯示您的節點服務是否有端點。

var fabricClient = new FabricClient(); 
var applicationList = fabricClient.QueryManager.GetApplicationListAsync().GetAwaiter().GetResult(); 
foreach (var application in applicationList) 
{ 
    var serviceList = fabricClient.QueryManager.GetServiceListAsync(application.ApplicationName).GetAwaiter().GetResult(); 
    foreach (var service in serviceList) 
    { 
     var partitionListAsync = fabricClient.QueryManager.GetPartitionListAsync(service.ServiceName).GetAwaiter().GetResult(); 
     foreach (var partition in partitionListAsync) 
     { 
      var replicas = fabricClient.QueryManager.GetReplicaListAsync(partition.PartitionInformation.Id).GetAwaiter().GetResult(); 
      foreach (var replica in replicas) 
      { 
       if (!string.IsNullOrWhiteSpace(replica.ReplicaAddress)) 
       { 
        var replicaAddress = JObject.Parse(replica.ReplicaAddress); 
        foreach (var endpoint in replicaAddress["Endpoints"]) 
        { 
         var endpointAddress = endpoint.First().Value<string>(); 
         Console.WriteLine($"{service.ServiceName} {endpointAddress} {endpointAddress}"); 
        } 
       } 
      } 
     } 
    } 
} 
+0

我最終重新部署,第二次終端被正確識別。我不確定爲什麼它第一次不起作用。 所以到具體的問題: 1.是否正確的服務結構會自動給這個服務這個監聽地址的命名服務? 是的。無論如何我要檢查命名服務中的映射嗎? 是的,這個答案是如何檢查映射 –

+0

謝謝你的代碼片段。這對我非常有幫助。 – BeHappy

相關問題