azure-service-fabric

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)

  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.
  2. 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 .
  3. 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.
  4. Todo esto funciona.
  5. 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.
  6. Para hacer esto, sé que tengo que escribir una política (en C # muy probablemente) para buscar esta información desde algún lugar.
  7. 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.
  8. 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.
  9. 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.