2016-05-19 9 views
5

Ich habe eine Frage bezüglich der Priorität von Umgebungsvariablen, wenn sie mit spring cloud config serverFrühling Wolke Config Server-Priorität von Umgebungsvariablen

In meinem Dienst arbeiten habe ich eine lokalen Eigenschaften application.yml mit diesem Inhalt

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

die Datei Der Dienst ist auch mit einem Konfigurationsserver mit einem Konfigurationsrepository verbunden, das eine Datei testservice-api.yml enthält (wobei testservice-api der Name der Federanwendung des Dienstes ist). Der Inhalt dieser Datei ist:

foo: 
    bar: "some-specific" 

So mit diesem Setup die Konfiguration zur Laufzeit in dieser Folge hätte:

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

Jetzt versuche ich foo.bar und foo.joe mit einer Umgebungsvariablen außer Kraft zu setzen.

So beginne ich den Dienst mit diesem Befehl:

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

Von dem, was ich las in this part of the spring boot documentation die Umgebungsvariablen Vorrang vor den Konfigurationsdateien haben sollte - auch die Federwolke Config-Dokumentation nicht sth angeben anders - so würde ich das Ergebnis erwarten sein:

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

Aber stattdessen erhalte ich:

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

Daher wird nur die Konfiguration aus der lokalen Konfigurationsdatei innerhalb des Jar durch die Umgebungsvariable überschrieben - die Eigenschaft aus dem Config Repo scheint Vorrang vor der Umgebungsvariablen zu haben.

Ist das erklärbar - Oder ist das ein Fehler? Irgendwelche Hinweise in diesem?

finden Sie den Beispielcode hier:

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

Die Readme im Repository listet das Problem hier beschrieben als Use Case 3

+2

Config Server hat die höchste Priorität. – spencergibb

+0

@spencergibb danke für den Hinweis - das irgendwo dokumentiert? Alles, was ich gefunden habe, ist "Dies sind die gleichen Regeln wie in einer eigenständigen Spring Boot-Anwendung." - Also ich dachte, dass diese Regeln gelten - https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config –

+0

Es sollte sei es nicht, aber es wäre im Frühjahr Cloud-Dokumentation. – spencergibb

Antwort

7

definieren folgende Eigenschaften in git Repo (als Quelle für die config-Server) [für gegebenes Profil]: spring.cloud.config: overrideSystemProperties: false overrideNone: true

im Auge behalten Eigenschaften (insbesondere overrideSystemProperties & overrideNone) in bootsrap.yml werden standardmäßig von denen vom Config-Server überschrieben

+2

Nur FYI, für mich funktionierte das, wenn ich es in die git Repo Config-Datei für die individuelle Anwendung (den Config-Client) und nicht funktionierte, wenn ich es in die git Repo-Konfigurationsdatei für den Config-Server legte – Matt

+1

Nach einigem Nachdenken Ich habe gemerkt, dass es cool ist, dass es möglich ist, ABER, es ist wahrscheinlich keine gute Idee. Der Hauptpunkt, eine * centralized * config-Komponente zu verwenden, besteht darin, nur diese - * centralized * config zu erhalten. Wenn Sie damit beginnen, es zu * distributed * config zu machen, gibt es 101 Wege, auf die Dinge falsch laufen. Überlegen Sie, was passiert, wenn Sie einen API-Schlüssel ändern müssen, der über env var bereitgestellt wurde. Sie müssen den Dienst neu starten. Welchen Punkt gibt es dann, um den Server zu konfigurieren? Verwenden Sie mit Vorsicht! – demaniak

Verwandte Themen