2

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?

Répondre

4

Actuellement, dans Camden et précédemment, les applications doivent être enregistrées dans Eureka avant de pouvoir interroger d'autres applications. Votre appel est probablement trop tôt dans le cycle de vie de l'enregistrement. Il y a un InstanceRegisteredEvent qui peut aider. Il y a des plans pour travailler dans le train de libération de Dalston.

+0

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

+0

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

+0

est-il possible d'écouter un événement qui est invoqué chaque fois que l'application s'inscrit sur le serveur de registre? – bilak