azure service fabric - ¿Cómo puedo descubrir dinámicamente los servicios alojados en la estructura de servicio desde la administración de API?
azure-service-fabric (1)
- Digamos que tengo el servicio A y B alojado en el clúster de estructura de servicio. Escuchan (dentro del clúster) en el puerto 7001 y 7002 respectivamente.
- Digamos que configuro el equilibrador de carga de la estructura de servicio para escuchar en el puerto 8001 y reenviar la solicitud al puerto 7001 (dentro del clúster) para el servicio A y escuchar en el puerto 8002 y reenviar la solicitud al puerto 7002 (dentro del clúster) para el servicio B .
- Digamos que configuro la administración de API para el servicio A y B y enruto las solicitudes a los puertos apropiados en el equilibrador de carga.
- Todo esto funciona.
- Ahora, en lugar de asignar manualmente la ruta de url para cada servicio, me gustaría descubrir dinámicamente los servicios alojados en la estructura de servicio (desde la administración de API) y enrutar la solicitud en tiempo de ejecución dinámicamente.
- Para hacer esto, sé que tengo que escribir una política (en C # muy probablemente) para buscar esta información desde algún lugar.
- Pero no estoy seguro de qué preguntar exactamente para buscar puertos y servicios con carga equilibrada alojados en el clúster de estructura de servicio.
- Pensé en crear otro servicio C en el mismo clúster de estructura de servicio y usarlo (desde la administración de API) para proporcionar la información interna del clúster.
- Pero no pude encontrar una manera de buscar información del puerto de servicio local o cargar información de puerto de servicio equilibrado.
¿Cómo lo hago?
Aquí hay una manera de descubrir servicios y puntos finales que se ejecutan en el clúster. (Tenga en cuenta que también necesitará monitorear los cambios).
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}");
}
}
}
}
}
Puede comunicarse con el equilibrador de carga mediante PowerShell:
Get-AzureRmLoadBalancer
Finalmente, deberá encontrar una manera de hacer coincidir los puertos de back-end del equilibrador de carga con los puntos finales de servicio usted mismo.