printemps nuage avec RestTemplate // Ruban / Eureka - nouvelle tentative lorsque le serveur non disponible

voix
3

J'ai réussi à obtenir avec succès mon client RestTemplate découvrir le service à distance à l'aide Eureka et renvoyer les appels vers l'aide du ruban comme décrit dans la documentation. Au fond, il était juste une question d'ajouter les annotations suivantes de ma classe d'application et laissez la magie du printemps-Boot le reste:

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableDiscoveryClient

(PS: vous avez remarqué que je utilise nuage de printemps: snapshot-1.0.0 BUILD et non 1.0.0.M3 - mais cela ne semble pas affecter mon problème).

Lorsque deux instances de service sont mis en marche, le client reste-modèle charge avec succès les demandes d'équilibre entre les deux. Toutefois, le client ne sera pas fallback à la deuxième instance si la première est arrêtée avant que les avis d'équilibrage de charge Eureka, à la place une exception est levée.

D'où ma question: est-il possible de configurer le RestTemplate / ruban / pile Eureka pour recommencer automatiquement l'appel à une autre instance si celle choisie premier lieu ne sont pas disponibles? proxy Zuul et les clients feindre font « hors de la boîte », donc je crois que la bibliothèque possède les caractéristiques nécessaires ...

Toute idée / indice?

Thx, / Bertrand

Créé 14/12/2014 à 11:08
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
4

Le RestTemplatesupport lui - même ne sait pas comment faire une nouvelle tentative (alors que le client Feindre et le support de proxy au printemps - Cloud ne, comme vous avez remarqué). Je pense que cela est probablement une bonne choses parce qu'il vous donne la possibilité d'ajouter vous - même. Par exemple, en utilisant Retry Spring vous pouvez le faire dans un style simple déclaratif:

@Retryable
public Object doSomething() {
   // use your RestTemplate here
}

(et ajoutez @EnableRetryà votre @Configuration). Il fait une belle combinaison avec @HystrixCommand(du printemps Nuage / Javanica):

@HystrixCommand
@Retryable
public Object doSomething() {
   // use your RestTemplate here
}

Sous cette forme, chaque échec compte pour les mesures du disjoncteur (on pourrait peut-être changer cela, ou peut-être il est logique de le laisser comme ça), même si la nouvelle tentative est couronnée de succès.

Créé 15/12/2014 à 06:25
source utilisateur

voix
0

Je ne pouvais pas à travailler avec les deux @HystrixCommand et @Retryable, quelle que soit l'ordre des annotations sur la classe @Configuration ou sur la méthode @Retryable due à l'ordre des intercepteurs. Je résolus en créant une autre classe avec l'ensemble correspondant de méthodes et avait les méthodes @HystrixCommand annoté délégué à la méthode @Retryable correspondante dans la deuxième classe. Vous pourriez probablement les deux classes implémentent la même interface. Ce genre est d'une douleur dans le cul, mais jusqu'à ce que l'ordre peut être configuré, cela est tout ce que je pouvais trouver. Toujours en attente d'une véritable solution de Dave Syer et les gars de nuages ​​de printemps.

public class HystrixWrapper {
    @Autowired
    private RetryableWrapper retryableWrapper;

    @HystrixCommand
    public Response doSomething(...) {
        return retryableWrapper.doSomething(...);
    }
}

public class RetryableWrapper {
    @Autowired
    private RestTemplate restTemplate;

    @Retryable
    public Response doSomething(...) {
        // do something with restTemplate;
    }
}
Créé 12/10/2015 à 19:18
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more