2016-04-02 9 views
5

Abbiamo un'applicazione Spring-Boot in cui stiamo usando Eureka per scoprire Spring Cloud Config e recuperare le configurazioni. Stiamo integrando Vault per inserire informazioni protette/sensibili e stiamo riscontrando problemi con il caricamento e la risoluzione dei parametri. Il progetto che utilizziamo come client Vault è vault-spring-boot-starter e funziona benissimo fintanto che non lo stiamo usando insieme a config-server tramite eureka.bootstrap PropertySource che ordina

In particolare, l'URL di accesso Eureka contiene parametri/credenziali recuperati da Vault. Con tutti i componenti abilitati, la richiesta Eureka ha esito negativo quando DiscoveryClient tenta di accedere all'URL in cui i parametri non sono ancora stati compilati/sostituiti.

(Example: http://${user}:${pass}.....)

Cercando di specificare @Order e

@AutoConfigureBefore({EurekaClientAutoConfiguration.class, DiscoveryClientConfigServiceAutoConfiguration.class})

nel VaultBootstrapConfiguration del deposito-primavera-boot-starter non sembrano avere alcun impatto. Credo che il problema sia legato all'ordine in cui vengono elaborate le PropertySource, ma non sono in grado di iniettare correttamente il PropertySource di Vault prima di Eureka. Come possiamo istruire la logica custom/Vault PropertySourceLocator per l'esecuzione prima dell'accesso a DiscoveryClient e al server di configurazione?

Aggiornamento

Stiamo usando la versione primavera-cloud Angel.SR6.

Ho aggiunto l'annotazione @ Order (Ordered.HIGHEST_PRECEDENCE) a VaultPropertySourceLocator come consigliato, ma la risoluzione dei parametri continua a non funzionare. Con la registrazione debug Spring abilitata, credo che il PropertySource di Vault sia effettivamente lì, ma per qualche motivo non viene utilizzato. Ho modificato il codice in modo che VaultConfiguration implementi SmartLifecycle e Ordered (con ordine = 0 e phase = Integer.MIN_VALUE) che potrebbero influenzare le cose. Dovrò fare più debug per cercare di isolare cosa sta succedendo.

+0

Quale versione di spring cloud stai usando? – spencergibb

+0

Guardando il codice, è necessario un '@ Ordine' su https://github.com/markramach/vault-spring-boot-starter/blob/master/src/main/java/com/flyover/boot/vault /config/VaultPropertySourceLocator.java – spencergibb

+0

In altre parole, 'PropertySourceLocator supporta il meccanismo di ordinamento delle molle. – spencergibb

risposta

1

Sono stato in grado di risolvere il mio problema. Ho provato alcuni approcci diversi tra cui Spring AOP e LTW che non funzionavano come tentativo di istanziare gli aspetti troppo presto - in modo che VaultPropertySource fosse disponibile prima che il DiscoveryClient di Eureka effettuasse una chiamata.

La mia soluzione di lavoro include:

Per istanziare i fagioli Vault prima di Eureka di fagioli e la configurazione si avvia un'istanza:

  • @Ordered o implementare PriorityOrdered nel VaultPropertySourceLocator. Il mio VaultPropertySourceLocator include anche l'implementazione di poiché stavo vedendo un output non deterministico con parti di un'istanza di bean Eureka che talvolta si verificava prima dei bean Vault. Il mio ordine è Ordered.HIGHEST_PRECEDENCE e la fase è Integer.MIN_VALUE.

Per registrare VaultPropertySource come PropertySource che viene utilizzato per risolvere i parametri quando fagioli Eureka/cablaggio configurazione avviene:

  • Passando riferimento ambiente al VaultPropertySource cui auto-registri si nell'elenco della PropertySources dell'ambiente ed è presente quando i bean Eureka creano un'istanza e imposta la proprietà serviceUrl durante l'istanziazione e la rimozione/risoluzione delle proprietà EurekaClientConfigBean.