2017-02-17 36 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

相关问题