2016-05-19 26 views
5

Ho una domanda circa la priorità delle variabili d'ambiente quando si lavora con spring cloud config servercloud Config Primavera Server priorità delle variabili di ambiente

Nel mio servizio ho una proprietà di file locale application.yml con questo contenuto

foo: 
    bar: "some" 
    buz: "some" 
    joe: "some" 

Il il servizio è inoltre connesso a un server di configurazione con un repository di configurazione che contiene un file testservice-api.yml (dove testservice-api è il nome dell'applicazione Spring del servizio). Il contenuto di questo file è:

foo: 
    bar: "some-specific" 

Quindi, con questa configurazione la configurazione in fase di esecuzione si tradurrebbe in questo:

{ 
    "foo.bar": "some-specific", 
    "foo.buz": "some", 
    "foo.joe": "some" 
} 

Ora cerco di ignorare foo.bar e foo.joe con una variabile d'ambiente.

Così ho avviare il servizio con questo comando:

FOO_BAR=some-env FOO_JOE=some-env gradle bootRun

Da quello che ho letto in this part of the spring boot documentation le variabili d'ambiente dovrebbero avere la priorità rispetto alle file di configurazione - anche la molla di documentazione nuvola config non dichiarare sth diverso - quindi mi aspetterei che il risultato sia:

{ 
    "foo.bar": "some-env", 
    "foo.buz": "some", 
    "foo.joe": "some-env" 
} 

Ma invece ottengo:

{ 
    "foo.bar": "some-specific", 
    "foo.buz": "some", 
    "foo.joe": "some-env" 
} 

Quindi solo la configurazione dal file di configurazione locale all'interno del jar viene sostituita dalla variabile di ambiente: la proprietà dal repository di configurazione sembra avere la priorità sulla variabile di ambiente.

Questo è spiegabile - O è un bug? Qualche suggerimento in questo?

Si prega di trovare il codice di esempio qui:

https://github.com/mduesterhoeft/configserver-test

Il README nella repository elenca il problema descritto qui come Use Case 3

+2

Il server di configurazione ha la priorità più alta. – spencergibb

+0

@spencergibb grazie per il suggerimento - che è documentato da qualche parte? Tutto quello che ho trovato è "Queste sono le stesse regole applicate in un'applicazione Spring Boot standalone". - Quindi ho pensato che si applicassero queste regole - https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config –

+0

Dovrebbe be se non lo è, ma sarebbe nella documentazione del cloud di primavera. – spencergibb

risposta

7

definire seguente immobili a git repo (come fonte per la configurazione del server) [per il profilo specificato]: spring.cloud.config: overrideSystemProperties: false overrideNone: true

tenere a mente le proprietà (in particolare, overrideSystemProperties & overrideNone) in bootsrap.yml sono sovrascritte da quelli di config-server per impostazione predefinita

+2

Solo per FYI, per me questo ha funzionato quando l'ho inserito nel file di configurazione git repo per la singola applicazione (il client di configurazione) e non ha funzionato quando l'ho inserito nel file di configurazione git repo per il server di configurazione – Matt

+1

Dopo qualche riflessione , Ho capito che è bello che sia possibile farlo, MA, probabilmente non è una buona idea. L'intero aspetto di inserire un componente * centralizzato * di configurazione è di ottenere solo quella configurazione * centralizzata *. Se inizi a consentirgli di diventare * distributed * config, ci sono 101 modi in cui le cose andranno male. Considera cosa succede se hai bisogno di cambiare una chiave API, che è stata fornita via env var. Dovrai riavviare il servizio. Che punto c'è allora per configurare il server? Usare con cautela! – demaniak

Problemi correlati