J'ai un service qui exécute certains scripts init après le démarrage de l'application (implémenté avec ApplicationListener<ApplicationReadyEvent>
). Dans ce script, je dois appeler un autre service avec RestTemplate
qui est @LoadBalanced
. Lorsque l'appel au service est appelé, il n'y a aucune information sur les instances de service distant car le serveur de découverte n'a pas été contacté à ce moment-là (je suppose).initialisation de client ruban équilibrée par charge contre le service de découverte (eureka)
java.lang.IllegalStateException: No instances available for api-service
at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:79)
est donc là la manière comment obtenir la liste des services disponibles à partir du serveur de découverte au démarrage de l'application, avant mon script d'initialisation exécutera?
Merci
modifier: Le problème est plus lié à fait, que dans l'environnement actuel (dev) tous les services sont liés ensemble dans un seul service (api-service). Donc, de l'intérieur de l'api-service, j'essaie d'appeler client api-service @LoadBalanced qui ne sait pas à propos de soi? Puis-je enregistrer un auditeur ou quelque chose de similaire pour savoir quand api-service (auto) sera disponible?
here sont les exemples d'applications. Je suis principalement intéressé par la façon d'avoir travailler this method
Edit2:
Maintenant, il pourrait être la solution pour créer EurekaListener
public static class InitializerListener implements EurekaEventListener {
private EurekaClient eurekaClient;
private RestOperations restTemplate;
public InitializerListener(EurekaClient eurekaClient, RestOperations restTemplate) {
this.eurekaClient = eurekaClient;
this.restTemplate = restTemplate;
}
@Override
public void onEvent(EurekaEvent event) {
if (event instanceof StatusChangeEvent) {
if (((StatusChangeEvent) event).getStatus().equals(InstanceInfo.InstanceStatus.UP)) {
ResponseEntity<String> helloResponse = restTemplate.getForEntity("http://api-service/hello-controller/{name}", String.class, "my friend");
logger.debug("Response from controller is {}", helloResponse.getBody());
eurekaClient.unregisterEventListener(this);
}
}
}
}
puis l'enregistrer comme ceci:
EurekaEventListener initializerListener = new InitializerListener(discoveryClient, restTemplate);
discoveryClient.registerEventListener(initializerListener);
Toutefois, cette opération n'est exécutée que lorsque l'application est enregistrée pour la première fois dans le service de reconnaissance. La prochaine fois que j'arrête l'api-service et que je l'exécute à nouveau, l'événement n'est pas publié. Y a-t-il un autre événement que je peux attraper?
même lorsque je change l'événement en 'InstanceRegisteredEvent' j'obtiens la même exception (aucune instance disponible - j'ai poussé ça à github). Y at-il autre chose qui peut m'aider? Je peux voir que l'objet de configuration de l'événement peut être converti en 'EurekaInstanceConfigBean' et à partir de là je peux obtenir l'adresse IP et le port du service cible, mais je pense que dans ce cas je ne peux pas utiliser le modèle de repos @LoadBalanced. Si je peux d'une manière ou d'une autre vous aider à enquêter sur ce problème, faites-le moi savoir. J'ai besoin d'avoir cette fonctionnalité dans le projet actuel. Merci – bilak
J'ai créé l'écouteur (voir la question éditée) mais il y a un problème que ce n'est pas exécuté chaque fois que l'application est redémarrée. – bilak
est-il possible d'écouter un événement qui est invoqué chaque fois que l'application s'inscrit sur le serveur de registre? – bilak