La source de configuration de l'application est généralement le serveur de serveur de configuration distant. Par défaut, la priorité de configuration locale est inférieure au référentiel de configuration à distance. Si vous souhaitez implémenter les variables du système d'application locales et les fichiers de configuration pour écraser les valeurs de propriété dans le référentiel distant, vous pouvez les définir comme suit:
Spring: Cloud: Config: ALLERDOVERRIDE: TrueOverridenone: TrueOverReSystemProperties: False
Grâce à la configuration ci-dessus, le client peut atteindre une priorité plus élevée dans la configuration locale et ne peut pas être écrasée. Étant donné que la version actuelle de Spring Cloud sur laquelle nous sommes basés est Edgware.RELEASE , les paramètres ci-dessus ne fonctionnent pas, mais utilisent les valeurs par défaut dans PropertySourceBootstrapProperties . Pour des situations spécifiques, voir le numéro: https://github.com/spring-cloud/spring-cloud-commons/pull/250. Nous parlerons de la source spécifique du bogue dans l'analyse suivante.
Analyse du code source
ConfigServicePropertySourceLocator
L'écrasement des propriétés de configuration distante est finalement liée à l'obtention de la configuration au début du client. Comment y traiter après avoir obtenu la configuration? Jetons un coup d'œil au diagramme de classe de la classe d'acquisition de ressources configServicePropertySourcelocator dans Spring Cloud Config.
ConfigServicePropertySourcelocator est essentiellement un localisateur de ressources de propriété, et sa principale méthode est l'emplacement (environnement environnement). Tout d'abord, remplacez l'espace réservé dans ConfigClientProperties par l'application, le profil et l'étiquette de l'environnement où l'application est actuellement en cours d'exécution, et initialisez le repos, puis itez-vous dans le tableau des étiquettes jusqu'à ce que les informations de configuration valides soient obtenues, et enfin réessayer en fonction de l'échec rapidement. Le processus principal est le suivant:
Localiser (Environment Environment) Appelez la méthode GetRemoteen Environment (Rest -mplate, Properties, Label, State) pour obtenir des données de configuration sur le serveur distant via HTTP. L'implémentation est également très simple. Affichez l'espace réservé dans le chemin de la demande de remplacement, puis assemblez les en-têtes. Une fois assemblé, la demande peut être envoyée et le résultat sera retourné.
Dans l'implémentation ci-dessus, nous constatons que les informations de configuration obtenues sont stockées dans CompositEpropertySource. Comment l'utiliser? Une autre classe importante à ajouter ici est PropertySourceBootSstrapConfiguration, qui implémente l'interface ApplicationContextInitializer. Cette interface actualisera () sera rappelée avant que le contexte d'application ne soit actualisé, effectuant ainsi l'opération d'initialisation. La pile d'appels après le démarrage de l'application est la suivante:
SpringApplicationBuilder.Run () -> SpringApplication.Run () -> SpringApplication.CreateAndRefreshContex
La méthode d'emplacement de la configuration ci-dessus ci-dessus sera appelé dans l'initialisation, afin de s'assurer que le contexte peut obtenir les informations de configuration nécessaires avant de rafraîchir. Jetons un coup d'œil à la méthode d'initialisation:
classe publique PropertySourceBootStrapConfigurationIMPLements applicationContextInitializer <ConfigurableApplicationContext>, ordonné {private int order = ordonné.Highest_precedence + 10; @Autowired (obligatoire = false) Liste privée <ApertySourcelocator> propriétéSourceLoCators = new ArrayList <> (); @Override public void initialize (configurableApplicationContext applicationContext) {CompositEpropertySource composite = new CompositEpropertySource (bootstrap_property_source_name); // trie le tableau PropertySourcelOcators et suivez la par défaut AnnotationAwareOrderComparator AnnotationAwareOrderComparator.Sort (this.propertysourcelocators); booléen vide = true; // Obtient le contexte de l'environnement en cours d'exécution ConfigurableEnvironment Environment = ApplicationContext.getEnvironment (); pour (PropertySourcelocator Locator: this.propertysourcelocators) {// transtraight this.propertysourcelocators PropertySource <?> source = null; Source = Locator.Locate (Environment); if (source == null) {continue; } Logger.info ("Propriété localisée Source:" + Source); // Ajouter une source à la liste liée de PropertySource Composite.AddPropertySource (source); vide = false; } // Seul si la source n'est pas vide, elle sera définie dans l'environnement si (! Vide) {// Renvoie la forme variable de l'environnement, qui peut être effectuée telle que AddFirst et addLast MutablePropertySources PropertySources = Environment.GetPropertySources (); String LogConfig = Environment.ResolvePlaceHolders ("$ {logging.config:}"); Logfile logfile = logfile.get (environnement); if (propriétéSources.Contains (bootstrap_property_source_name)) {// supprimer Bootstrapproperties PropertySources.Remove (bootstrap_property_source_name); } // Définir PropertySources INSERTPROPERTYSOURCES (PropertySources, Composite); ReinitializElogGingSystem (Environment, LogConfig, logfile); setLoglevels (environnement); // disposer de plusieurs informations sur la configuration des actifs des profils Handle inclusedProfiles (environnement); }} // ...}Jetons un coup d'œil aux opérations effectuées dans la méthode Initialize.
Renvoie la forme variable de l'environnement, qui peut être effectuée comme addFirst, addLast
Retirez les bootstrapproperties dans les propriétés
Selon les règles de la mise en place du serveur de configuration, définissez la propriété
Gérer les informations de configuration pour plusieurs profils actifs
Lorsque vous initialisez la méthode d'initialisation, parcourez d'abord la méthode de localisation de tous les objets de typesourcelocator PropertySourcelocator , puis mettez les valeurs de propriété obtenues de diverses manières dans la méthode CompositEpropertySource , et enfin appelez l'insertPropertySources (PropertySources, Composite) pour le configurer dans l'environnement. Spring Cloud Context fournit PropertySourceBootSstrapproperties qui écrasent les propriétés distantes et utilisent cette classe de configuration pour déterminer la priorité de la source de propriété.
INSERTPROPERTYSOURCES PRIVÉS VOID (MutablePropertySources PropertySources, CompositePropertySource Composite) {MutablePropertySources entrant = new MutableProperToPertySources (); entrant. AddFirst (composite); PropertySourceBootStrapProperties RemoteProperties = new PropertySourceBootSstrapproperties (); new ReladedDatabinder (RemoteProperties, "printemps.cloud.config") .bind (new PropertySourcesPropertyValues (entrant)); // Si l'écrasement local n'est pas autorisé (! RemoteProperties.Isallowoverride () || (! RemoteProperties.Isoverrideone () && RemoteProperties.IsOverRideSystemProperties ())) {PropertySources.AddFirst (Composite); retour; } // overridenone est vrai, la configuration externe a la priorité la plus faible if (remoteProperties.IsoverRidenone ()) {propriétésources.addlast (composite); retour; } if (PropertySources .Contains (standardenvironment.system_environment_property_source_name)) {// Définissez la priorité des configurations externes en fonction de OverridesystemProperties if (! RemoteProperties.isOverrideSystemProperties ()) {propriété.AddDafter ( STANCOLENIRONDAMENT.SYSTEM_ENVIRONDAMENT_PROPERTY_SOURCE_NAME, Composite); } else {PropertySources.addBefore (standardenvironment.system_environment_property_source_name, composite); }} else {propriétésources.addlast (composite); }}L'implémentation ci-dessus ajuste principalement la priorité de plusieurs sources de configuration basées sur les propriétés de PropertySourceBootStrapproperties . À partir de son implémentation, nous pouvons voir que l'objet PropertySourceBootSstrapproperties est initialisé directement, en utilisant la valeur de propriété par défaut et non injecté dans ce que nous avons défini dans le fichier de configuration.
Implémentation réparée:
@Autowired (requise = false) propriété privéeSourceBootStrapProperties RemotePropertiesForOverriding; @Override public int getOrder () {return this.order; INSERTPROPERTYSOURCES PRIVÉS VOID (MutablePropertySources PropertySources, CompositePropertySource Composite) {MutablePropertySources entrant = new MutableProperToPertySources (); entrant. AddFirst (composite); PropertySourceBootStRapproperties RemoteProperties = RemotePropertiesForOverriding == null? New PropertySourceBootStRapproperties (): RemoteProperties ForOverriding;Résumer
Ce qui précède est une explication détaillée de l'exemple de propriétés de configuration distriat de Spring Cloud introduit par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!