服务结构命名服务不转发到分配给Guest Executable

时间:2017-02-17 23:37:02

标签: azure-service-fabric

我已经设置了一个带有两个服务的应用程序,一个是标准的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 app实际上正在按预期工作。

现在,我知道在运行AspNet核心应用程序时,它明确地将其侦听地址发送回命名服务,但是guest虚拟机可执行文件并不能解释为什么它们可能表现不同。另外,根据我的理解,当前版本的服务结构不向访客可执行文件提供有关动态分配端口的信息,因此必须在服务端点中进行硬编码,并在应用程序中进行硬编码以侦听同一端口。

E.g。如果我有:

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

然后在nodejs app中我还必须:

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

两地都注意到30032。

来自文档:

  

此外,您可以要求Service Fabric将此端点发布到   命名服务,以便其他服务可以发现端点地址   这项服务。这使您能够进行通信   作为客户可执行文件的服务。发布的端点地址是   形式为UriScheme:// IPAddressOrFQDN:Port / PathSuffix。 UriScheme和   PathSuffix是可选属性。 IPAddressOrFQDN是IP地址   或此可执行文件放置的节点的完全限定域名   在,它是为你计算的。

我将此解释为如果我的ServiceManifest.xml同时具有UseImplicitHost="true",则它应自动为命名服务提供由端点描述构建的网址。

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

服务架构是否会自动为命名服务提供此服务的收听地址?

我有没有检查命名服务中的映射? 这会让我知道它是否有我的节点应用程序的条目,但它与我期望的不同,或者实际上它没有条目。

如果它没有条目,那么我不知道在云中部署时,该公共可执行应用程序如何对公众可见。

1 个答案:

答案 0 :(得分:1)

您可以使用QueryManager FabricClient列出群集中服务的已注册端点。这应该揭示节点服务是否有端点。

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