Service Fabric 命名服务未转发到分配给来宾可执行文件的端点

Posted

技术标签:

【中文标题】Service Fabric 命名服务未转发到分配给来宾可执行文件的端点【英文标题】:Service Fabric Naming Service not forwarding to endpoint assigned to Guest Executable 【发布时间】:2017-07-07 15:31:51 【问题描述】:

我已经按照此处的指南设置了一个包含两个服务的应用程序,一个是标准的 aspnet core api,另一个是 node express 应用程序:

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/ 我可以看到 node js 应用程序实际上正在按预期工作。

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

例如如果我有:

<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。

来自文档:

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

我将其解释为,如果我的ServiceManifest.xml 有两个UseImplicitHost="true",那么它应该自动为命名服务提供由端点描述构造的 url。

http://localhost:19081/sf_node_test_02/NodeApp -&gt; http://localhost:30032

服务结构会自动为命名服务提供此服务的侦听地址是否正确?

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

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

【问题讨论】:

【参考方案1】:

您可以使用FabricClientQueryManager 列出集群中服务的注册端点。这应该会显示您的节点服务是否有端点。

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

【讨论】:

我最终重新部署并且第二次正确识别端点。我不确定为什么它第一次不起作用。那么具体问题:1.服务结构是否会自动给命名服务这个服务的这个监听地址?是的。 2. 无论如何我可以检查命名服务中的映射吗?是的,这个答案是如何检查映射 感谢您提供代码 sn-p。这对我很有帮助。

以上是关于Service Fabric 命名服务未转发到分配给来宾可执行文件的端点的主要内容,如果未能解决你的问题,请参考以下文章

在 Service Fabric AD 应用程序上分配服务主体管理员角色

Service Fabric 对无状态服务的远程调用未返回、卡住

Service Fabric 运行时未从 Actor 服务实例回收未使用的内存

Service Fabric 未处理的异常和最佳做法

Service Fabric:将枚举类移动到不同的项目

Service Fabric 错误:未授权连接