- 假设我在 Service Fabric 集群中托管了服务 A 和 B。它们分别在端口 7001 和 7002 上侦听(在集群内部)。
- 假设我将服务结构负载均衡器配置为侦听端口 8001 并将请求转发到服务 A 的端口 7001(集群内部),侦听端口 8002 并将请求转发到服务 B 的端口 7002(集群内部) 。
- 假设我为服务 A 和 B 配置 API 管理,并将请求路由到负载均衡器上的适当端口。
- 这一切都有效。
- 现在,我不想手动映射每个服务的 url 路由,而是希望动态发现服务结构中托管的服务(通过 API 管理)并在运行时动态路由请求。
- 为此,我知道我必须编写一个策略(最有可能使用 C#)来从某处查找此信息。
- 但我不确定到底要查询什么来查找服务结构集群中托管的负载平衡端口和服务。
- 我想到在同一个 Service Fabric 集群中创建另一个服务 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
最后,您需要自己想出一种将负载均衡器后端端口与服务端点相匹配的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)