Die Konfigurationsquelle der Anwendung ist normalerweise der Remote -Konfigurationsserver. Standardmäßig ist die lokale Konfigurationspriorität niedriger als das Remote -Konfigurationsrepository. Wenn Sie die lokalen Anwendungssystemvariablen und Konfigurationsdateien implementieren möchten, um die Eigenschaftswerte im Remote -Repository zu überschreiben, können Sie sie wie folgt festlegen:
Spring: Cloud: config: dingoverride: trueoverridenon: trueoverridesystemProperties: false
Durch die obige Konfiguration kann der Client in der lokalen Konfiguration eine höhere Priorität erreichen und kann nicht überschrieben werden. Da die aktuelle Version von Spring Cloud , auf der wir basieren, ist Edgware.RELEASE , funktionieren die oben genannten Einstellungen nicht, sondern verwenden die Standardwerte in PropertySourceBootstrapProperties . In bestimmten Situationen finden Sie unter Ausgabe: https://github.com/spring-cloud/spring-commons/pull/250. Wir werden in der folgenden Analyse über die spezifische Quelle des Fehlers sprechen.
Quellcodeanalyse
ConfigServicePropertySourcelocator
Das Überschreiben der Remote -Konfigurationseigenschaften hängt letztendlich mit der Erfassung der Konfiguration zu Beginn des Clients zusammen. Wie gehe ich nach dem Erhalten der Konfiguration damit um? Schauen wir uns das Klassendiagramm des RessourcenerwerbsklassenconfigservicePropertySourcelocators in der Spring Cloud -Konfiguration an.
ConfigServicePropertySourcelocator ist im Wesentlichen ein Eigenschaftsressourcenlocator, und seine Hauptmethode ist der Ort (Umgebungsumgebung). Ersetzen Sie zunächst den Platzhalter in configClientProperties durch die Anwendung, das Profil und die Beschriftung der Umgebung, in der die Anwendung derzeit ausgeführt wird, und initialisieren Sie die RESTTEMPLET, und iterieren Sie dann das Etikett -Array, bis gültige Konfigurationsinformationen erhalten sind, und trennen Sie es schließlich nach, ob es schnell fehlschlägt. Der Hauptprozess ist wie folgt:
Suchen Sie (Umgebungsumgebung) rufen Sie die GetRemoteD -Umgebung (RestTemplate, Eigenschaften, Beschriftung, Status) auf, um Konfigurationsdaten auf dem Remote -Server über http zu erhalten. Die Implementierung ist auch sehr einfach. Zeigen Sie den Platzhalter im Pfad der Ersatzanforderung an und montieren Sie die Header. Nach der Zusammenstellung kann die Anfrage gesendet werden und das Ergebnis wird zurückgegeben.
In der obigen Implementierung sehen wir, dass die erhaltenen Konfigurationsinformationen in CompositepropertySource gespeichert sind. Wie benutzen wir es? Eine weitere wichtige Klasse, die Sie hier hinzufügen sollten, ist PropertySourceBootstrapConfiguration, die die ApplicationContextInitializer -Schnittstelle implementiert. Diese Schnittstelle wird aktualisiert () zurückgerufen, bevor der Anwendungskontext aktualisiert wird, wodurch der Initialisierungsvorgang durchgeführt wird. Der Anrufstack nach Beginn der Bewerbung lautet wie folgt:
SpringApplicationBuilder.run () -> SpringApplication.run () -> SpringApplication.CreateAndreFreshContext () -> Springapplication.ApplyInitializers () -> PropertySourCoTRAPRAPConfiguration
Die Standortmethode des oben genannten KonfigurationServicePropertySourcelocators wird in Initialize aufgerufen, um sicherzustellen, dass der Kontext die erforderlichen Konfigurationsinformationen vor dem Aktualisieren erhalten kann. Schauen wir uns die Initialisierungsmethode an:
public class PropertySourCoTroprapConfigurationImplements ApplicationContextInitializer <configurableApplicationContext>, geordnet {private int order = ordered.highest_precedence + 10; @Autowired (erforderlich = Falsch) Private Liste <ProMpertySourCelocator> PropertySourCelocators = New ArrayList <> (); @Override public void initialize (configurableApplicationContext applicationContext) {CompositepropertySource Composite = new CompositepropertySource (bootstrap_property_source_name); // Sortieren Sie das PropertySourcelocators -Array und befolgen Sie die StandardannotationAwareOrderComparator AnnotationAraRorderComparator.sort (this.PropertySourcelocators); boolean leer = wahr; // den laufenden Umgebungskontext konfigurieren, dass konfigurierende Umwelt = applicationContext.getEvironment (); für (PropertySourcelocator Locator: this.PropertySourcelocators) {// transportraight this.propertySourcelocators PropertySource <?> Source = null; Source = Locator.Locate (Umgebung); if (source == null) {Fortsetzung; } logger.info ("gefundene Eigenschaftsquelle:" + Quelle); // Quelle zur verknüpften Liste von PropertySource Composite.addpropertySource (Quelle) hinzufügen; leer = falsch; } // Nur wenn die Quelle nicht leer ist, wird sie auf die Umgebung festgelegt, wenn (! Leer) {// die variable Form der Umgebung zurückgibt, die wie Addfirst und Addlast MutablePropertySources PropertySources = Environment.getPropertySources () durchgeführt werden kann; String logconfig = Umgebung LogFile logfile = logfile.get (Umgebung); if (PropertySources.contains (bootstrap_property_source_name)) {// BootstreLperties PropertySources.remove (Bootstrap_property_Source_Name); } // PropertySources InsertPropertySources (PropertySources, Composite) festlegen; ReiniTializEloggingsystem (Umgebung, Logconfig, Logfile); setLogLivels (Umgebung); // Entsäulen mehrerer Aktivenkonfigurationsinformationen von Profilen HandleIncludedProfiles (Umgebung); }} // ...}Schauen wir uns an, welche Operationen in der Initialize -Methode ausgeführt werden.
Gibt die variable Umgebungsform zurück, die wie Addfirst, Addlast durchgeführt werden kann
Entfernen Sie BootStrampen in PropertySources
Setzen Sie nach den Regeln der Überschreibung von Config Server PropertySources
Verwandten Sie Konfigurationsinformationen für mehrere aktive Profile
Wenn Sie die Initialisierungsmethode initialisieren, durchqueren Sie zunächst die Lokalisierungsmethode aller Objekte für Eigenschaftsourcelocator -Typen, dann die Eigenschaftswerte auf verschiedene Weise in die CompositepropertySource und rufen Sie schließlich die InsertPropertySources (Eigenschaftsources, Composite) -Methode auf, um sie in die Umgebung einzustellen. Spring Cloud Context bietet PropertySourcebootStramplerties , die Remote -Eigenschaften überschreiben, und verwendet diese Konfigurationsklasse, um die Priorität der Eigenschaftsquelle zu bestimmen.
private void InsertPropertySources (MutablePropertySources PropertySources, CompositepropertySource Composite) {MutablePropertySources Incoming = New MutablePropertySources (); incoming.addfirst (Composite); PropertySourcebootStramplerties remoteProperties = new PropertySourCoTStraProperties (); New RelaxedDatabinder (RemoteProperties, "Spring.cloud.config") .bind (neue PropertySourcesPropertyValues (eingehende)); // Wenn ein lokales Überschreiben nicht erlaubt ist (! RemoteProperties.isloverride () || (! zurückkehren; } // overidenon is true, die externe Konfiguration hat die niedrigste Priorität, wenn (remoteProperties.isoverridenon ()) {PropertySources.addlast (Composite); zurückkehren; } if (propertySources .contains(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME)) { //Set the priority of external configurations according to overrideSystemProperties if (!remoteProperties.isOverrideSystemProperties()) { propertySources.addAfter( StandardEnvironment.System_Environment_property_Source_Name, Composite); } else {PropertySources.addbefore (StandardEnvironment.System_Environment_property_Source_Name, Composite); }} else {PropertySources.addlast (Composite); }}Die obige Implementierung passt hauptsächlich die Priorität mehrerer Konfigurationsquellen an, basierend auf den Eigenschaften in PropertySourCotStramperties . Aus seiner Implementierung können wir feststellen, dass das Objekt von PropertySourCoTStraProperties direkt mit dem Standardeigenschaftswert initialisiert und nicht in das injizierte, was wir in der Konfigurationsdatei festgelegt haben.
Reparierte Implementierung:
@Autowired (erforderlich = falsch) Private PropertySourCoTStramplerties remotePropertiesForoveroverovertriding; @Override public int getorder () {return this.order; private void InsertPropertySources (MutablePropertySources PropertySources, CompositepropertySource Composite) {MutablePropertySources Incoming = New MutablePropertySources (); incoming.addfirst (Composite); PropertySourcebootStramplerties remoteProperties = remotePropertiesForoverovertriding == NULL? Neue PropertySourCobootStroperties (): remotePropertiesForoverovertriding;Zusammenfassen
Das obige ist eine detaillierte Erläuterung des vom Editors vorgestellten Beispiels für die Überschreibung von Remote -Konfigurationseigenschaften für Spring Cloud. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!