azure-service-fabric - 如何通过API管理动态发现服务结构中托管的服务?

标签 azure-service-fabric

  • 可以说我在服务结构集群中托管了服务A和B。他们分别在端口7001和7002上监听(在群集内部)。
  • 让我们配置服务结构负载平衡器以监听端口8001并将请求转发到服务A的端口7001(群集内),并监听端口8002并将请求转发到端口7002(群集内的)服务。 B.
  • 可以说,我为服务A和B配置了API管理,并将请求路由到负载均衡器上的适当端口。
  • 这一切正常。
  • 现在,我不想为每个服务手动映射URL路由,而是要动态发现服务结构中托管的服务(来自API管理),并在运行时动态路由请求。
  • 为此,我知道我必须编写一个策略(最有可能使用C#)从某个地方查找此信息。
  • 但是我不确定要查询什么来查找服务矩阵群集中托管的负载平衡端口和服务。
  • 我想在同一服务结构集群中创建另一个服务C,并使用它(来自API管理)来提供集群的内部信息。
  • 但是我无法找到一种方法来查找本地服务端口信息或负载平衡的服务端口信息。

  • 我该怎么办?

    最佳答案

    这是一种发现群集中运行的服务和端点的方法。 (请记住,您也需要监视更改。)

    private static void ListEndpoints()
    {
        var resolver = ServicePartitionResolver.GetDefault();
        var fabricClient = new FabricClient();
        var apps = fabricClient.QueryManager.GetApplicationListAsync().Result;
        foreach (var app in apps)
        {
            Console.WriteLine($"Discovered application:'{app.ApplicationName}");
    
            var services = fabricClient.QueryManager.GetServiceListAsync(app.ApplicationName).Result;
            foreach (var service in services)
            {
                Console.WriteLine($"Discovered Service:'{service.ServiceName}");
    
                var partitions = fabricClient.QueryManager.GetPartitionListAsync(service.ServiceName).Result;
                foreach (var partition in partitions)
                {
                    Console.WriteLine($"Discovered Service Partition:'{partition.PartitionInformation.Kind} {partition.PartitionInformation.Id}");
    
    
                    ServicePartitionKey key;
                    switch (partition.PartitionInformation.Kind)
                    {
                        case ServicePartitionKind.Singleton:
                            key = ServicePartitionKey.Singleton;
                            break;
                        case ServicePartitionKind.Int64Range:
                            var longKey = (Int64RangePartitionInformation)partition.PartitionInformation;
                            key = new ServicePartitionKey(longKey.LowKey);
                            break;
                        case ServicePartitionKind.Named:
                            var namedKey = (NamedPartitionInformation)partition.PartitionInformation;
                            key = new ServicePartitionKey(namedKey.Name);
                            break;
                        default:
                            throw new ArgumentOutOfRangeException("partition.PartitionInformation.Kind");
                    }
                    var resolved = resolver.ResolveAsync(service.ServiceName, key, CancellationToken.None).Result;
                    foreach (var endpoint in resolved.Endpoints)
                    {
                        Console.WriteLine($"Discovered Service Endpoint:'{endpoint.Address}");
                    }
                }
            }
        }
    }
    

    您可以使用PowerShell与负载均衡器进行通信:
    Get-AzureRmLoadBalancer
    

    最后,您需要提出一种将负载均衡器后端端口与服务端点自己匹配的方法。

    关于azure-service-fabric - 如何通过API管理动态发现服务结构中托管的服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38518214/

    相关文章:

    具有 IPv6 和 IPv4 前端支持的 Azure 负载均衡器

    powershell - 无法通过 Powershell 或 Visual Studio 连接到安全的 Azure Service Fabric 群集

    azure-service-fabric - Azure Service Fabric 中 Actor 和服务项目之间的行为差​​异

    Azure Service Fabric 出站 IP 地址

    queue - Service Fabric - 主复制队列使用阈值

    botframework - 机器人 channel 注册 - 将此消息发送到您的机器人时出错 : HTTP status code Unauthorized

    c# - 无法访问基本的 Fabric Azure WebAPI OWIN 无状态服务

    c# - 将 LocalDB 与 Service Fabric 结合使用

    azure-service-fabric - Azure Service Fabric - 部署失败,剩余 1 个分区

    c# - 可靠集合应用程序(组装)是否特定?