2016-12-21 1 views
2

Mon objectif consiste à ajouter PropertySource personnalisé à spring-cloud-server. Ce que je veux réaliser est d'obtenir des propriétés personnalisées de cette source personnalisée dans l'application spring-cloud-config-client. En fonction des suggestions de Adding environment repository in spring-config-server J'ai créé l'application spring-cloud-config-server et j'ai séparé le projet spring-cloud-config-custom. Le second est basé sur le code spring-cloud-consul-config. Donc, j'ai créé toutes les classes nécessaires comme CustomPropertySource, CustomPropertySourceLocator, CustomConfigBootstrapConfiguration et ainsi de suite et les configurés en spring.factories. À la fin, j'ai ajouté la dépendance maven à spring-cloud-config-custom à l'intérieur de mon spring-cloud-config-server.Spring cloud config server - comment ajouter PropertySource personnalisé visible dans la méthode findOne() de EnvironmentEncryptorEnvironmentRepository

Jusqu'ici tout va bien. Tout fonctionne bien. Quand je démarre le serveur je peux voir que mon CustomPropertySource est sur la liste de propertySources à l'intérieur du haricot EnviromentRepository injecté à EnvironmentController.

Problème: Lorsque j'envoie la demande GET à @RequestMapping("/{name}/{profiles}/{label:.*}") (en EnvironmentController), injecté EnviromentRepository haricot est utilisé pour trouver la source de propriété demandée (repository.findOne(name, profiles, label) méthode). Malheureusement, ma source de propriété n'a pas pu être trouvée ici. Pourquoi?

J'ai passé beaucoup de temps sur le débogage. J'ai trouvé que la délégation de référentiel findOne() appel de méthode à d'autres dépôts: MultipleJGitEnvironmentRepository qui le délègue à NativeEnvironmentRepository. À l'intérieur de ces délégués, la méthode findOne() n'utilise pas les propriétés propertySource du EnviromentRepository principal injecté dans le contrôleur. Il crée un nouveau référentiel d'environnement avec une nouvelle liste de PropertySources et une nouvelle SpringApplication distincte. À la fin, cette liste ne contient pas mon CustomPropertySource et c'est pourquoi findOne() renvoie emptySources property dans l'objet Environment résultant.

  1. Est-ce que je fais quelque chose de mal?
  2. est-CustomPropertySourceLocator (et/ou ConsulPropertySourceLocator) censé être utilisé (autowired/bootstrap) dans spring-cloud-config-server ou spring-cloud-config-client
  3. peut offrir de nombreux différents types de PropertySources en même temps printemps-nuage-config-serveur, via l'interface REST (dire "différent" je veux dire tout Git, Consul et Zookeeper)?
+0

Quelle version de Spring Cloud utilisez-vous? Jusqu'à très récemment, s'il y avait un autre bean 'EnvironmentRepository' dans le contexte, aucun des beans' EnvironmentRepository' par défaut ne serait créé, donc je suis confus sur la façon dont 'MultipleJGitEnvironmentRepository' ou' NativeEnvironmentRepository' serait créé dans votre cas.Pouvez-vous peut-être fournir un exemple d'application qui illustre le problème que vous voyez? –

+0

J'utilise 1.1.0.RELEASE. – mombip

+0

J'utilise 1.1.0.RELEASE. 'EnvironmentRepository' injecté dans' EnvironmentController' est initialement 'EnvironmentEncryptorEnvironmentRepository'. Il délègue l'appel à 'MultipleJGitEnvironmentRepository' qui hérite de l'implémentation de' AbstractScmEnvironmentRepository'. FindOne() à partir du dernier rend 'NativeEnvironmentRepository' passant' ConfigurableEnvironment' qui contient mon 'CustomPropertySource' dans la source de la propriété' bootstrapProperties'. Il semble que 'NativeEnvironmentRepository' le filtre à cause de la méthode" --spring.cloud.bootstrap.enabled = false "dans la méthode getArgs(). – mombip

Répondre

1

Ce que vous faites est d'ajouter une source de propriété au serveur de configuration lui-même, pas la configuration qu'il sert. Ajout spring-boot-starter-actuator à votre serveur de configuration et l'affichage /env révèle:

{ 
    "profiles": [ 

    ], 
    "server.ports": { 
    "local.server.port": 8888 
    }, 
    "bootstrapProperties:custom": { 
    "test.prop3": "CUSTOM-VALUE-3", 
    "test.prop2": "CUSTOM-VALUE-2", 
    "test.prop1": "CUSTOM-VALUE-1" 
    }, 
} 

Pour ajouter quelque chose qui sera servi par le serveur de configuration, vous devez mettre en œuvre un EnvironmentRepository. La prise en charge d'un composite EnvironmentRepository était de recently added.

+0

Oui, c'est ce que j'ai finalement fait. J'ai implémenté EnvironmentRepository et ça marche bien. Au tout début, j'étais convaincu que 'bootstrapProperties' défini côté serveur devrait être automatiquement accessible aux clients de configuration. Maintenant, je vois, j'avais tort. Donc la conclusion est comme ceci: Autoregistering 'PropertySources' est pour ** l'usage interne seulement ** de l'application qui l'enregistre. Dans mon cas, 'config-server' peut utiliser mon' CustomPropertySource' mais ne pas le publier. Donc, si je comprends bien, il n'y a pas de façon officielle de faire du serveur de configuration pour servir son bootstrap 'PropertySources'. – mombip