2015-04-20 1 views
2

Spring cloud config client aide à modifier les propriétés en cours d'exécution. Voici 2 façons de le faireComment mettre à jour plusieurs clients d'instance de config de ressort

    dépôt
  1. Mise à jour GIT et appuyez sur/rafraîchissement dans l'application cliente pour obtenir les dernières valeurs
  2. Mettre à jour le client directement en affichant la mise à jour/env et/rafraîchir

problème ici dans les deux approches est qu'il pourrait y avoir plusieurs instances d'application cliente en cours d'exécution dans la fonderie de nuages ​​et au-dessus des appels de repos atteindra l'une des instances laissant l'application dans un état incompatible

Par exemple. POST to/env pourrait toucher l'instance 1 et laisser l'instance 2 avec les anciennes données.

Une solution que je pourrais penser est de frapper continuellement ces points d'extrémité "n" fois en utilisant pour boucler juste pour s'assurer que toute l'instance sera mise à jour, mais c'est une solution brute. Est-ce que n'importe quel corps a une meilleure solution pour cela?

Remarque: Nous déployons notre application dans un environnement PCF privé.

Répondre

4

La solution canonique pour ce problème est Spring Cloud Bus. Si vos applications sont liées à un service RabbitMQ et qu'elles ont le bus sur le chemin de classe, il y aura des points de terminaison/bus/env et/bus/refresh supplémentaires qui diffuseront les messages à toutes les instances. Voir les documents pour plus de détails.

+0

Merci Dave Syer, ça a fonctionné mais pas complètement. Le push et le rafraîchissement git sont reflétés dans les instances, mais pas dans l'étape 2, changement temporaire des propriétés d'env. La mise à jour POST/bus/env du bus cloud n'est pas réfléchie même après le bus/rafraîchissement POST. Après le POST je peux voir les valeurs dans la clé "manager" dans la réponse/env et sur/bus/refresh je voulais les dernières valeurs mais ce n'est pas le cas. Des pensées à ce sujet? Les composants sont dans la portée d'actualisation cependant. – Pradeep

+0

Cela semble être le bon comportement. C'est la même chose que si vous aviez envoyé la requête/env puis un/refresh à une seule instance, n'est-ce pas? –

-1

Spring Cloud Config Server Not Refreshing

voir le code org.springframework.cloud.bootstrap.config.RefreshEndpoint ici:

public synchronized String[] refresh() { 
Map<String, Object> before = extract(context.getEnvironment() 
     .getPropertySources()); 
addConfigFilesToEnvironment(); 
Set<String> keys = changes(before, 
     extract(context.getEnvironment().getPropertySources())).keySet(); 
scope.refreshAll(); 
if (keys.isEmpty()) { 
    return new String[0]; 
} 
context.publishEvent(new EnvironmentChangeEvent(keys)); 
return keys.toArray(new String[keys.size()]); 

}

qui signifie/rafraîchissement point final premier git pull et puis actualisez prises et public un environnementChangeEvent, afin que nous puissions le client le code comme ça.