2016-05-19 30 views
5

Mam pytanie dotyczące pierwszeństwa zmiennych środowiskowych podczas pracy z spring cloud config serverWiosna Chmura Config Server Priority zmiennych środowiskowych

W mojej służbie Mam lokalne właściwości pliku application.yml z tej zawartości

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

usługa jest również połączona z serwerem konfiguracji z repozytorium konfiguracji, które zawiera plik testservice-api.yml (gdzie testservice-api to nazwa usługi wiosennej usługi). Zawartość tego pliku jest:

foo: 
    bar: "some-specific" 

Więc z tej konfiguracji konfiguracja przy starcie spowodowałoby to:

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

Teraz staram się zastąpić foo.bar i foo.joe ze zmienną środowiskową.

więc uruchomić usługę z tym poleceniem:

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

Z tego co czytałem w this part of the spring boot documentation zmienne środowiskowe powinny mieć pierwszeństwo przed plikach konfiguracyjnych - również sprężyna dokumentacja chmura config nie określa czegoś inny - tak bym się spodziewał wynikiem będzie:

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

Ale zamiast uzyskać:

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

Zatem tylko konfiguracja z lokalnego pliku konfiguracyjnego wewnątrz słoika jest nadpisywana przez zmienną środowiskową - właściwość z repozytorium konfiguracji ma pierwszeństwo przed zmienną środowiskową.

Czy można to wyjaśnić? Czy to błąd? Jakieś wskazówki w tym?

Proszę znaleźć przykładowy kod tutaj:

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

README w repozytorium wymienia problem opisany tutaj jako Use Case 3

+2

Serwer konfiguracji ma najwyższy priorytet. – spencergibb

+0

@spencergibb dzięki za podpowiedź - to gdzieś udokumentowane? Wszystko, co znalazłem, to "Te same zasady, które obowiązują w samodzielnej aplikacji Spring Boot". - więc pomyślałem, że te zasady mają zastosowanie - https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config –

+0

To powinno być, jeśli nie, ale byłoby to w dokumentacji wiosennej chmury. – spencergibb

Odpowiedz

7

określić następujące właściwości w git repo (jako źródło konfiguracyjnym serwera) [dla danego profilu]: spring.cloud.config: overrideSystemProperties: false overrideNone: true

pamiętać o właściwościach (szczególnie nadpisanie właściwości systemowych & overrideNone) w bootrap.yml są overriden przez tych z config-server domyślnie

+2

Po prostu FYI, dla mnie zadziałało to, gdy umieściłem go w pliku konfiguracyjnym git repo dla konkretnej aplikacji (klienta konfiguracyjnego) i nie działało, gdy umieściłem go w pliku konfiguracyjnym git repo dla serwera konfiguracyjnego – Matt

+1

Po pewnym przemyśleniu , Zdałem sobie sprawę, że to jest fajne, że można to zrobić, ALE, prawdopodobnie nie jest to dobry pomysł. Cały sens wciągania * scentralizowanego * komponentu konfiguracyjnego polega na uzyskaniu właśnie tego - * scentralizowanej * konfiguracji. Jeśli zaczniesz zezwalać na to, aby stała się * rozdzielczą * konfiguracją, jest 101 sposobów, w które coś pójdzie źle. Zastanów się, co się stanie, jeśli musisz zmienić klucz API, który został dostarczony przez env var. Będziesz musiał ponownie uruchomić usługę. Jaki jest więc sens konfiguracji serwera? Używaj ostrożnie! – demaniak