La fuente de configuración de la aplicación suele ser el servidor de servidor de configuración remoto. Por defecto, la prioridad de configuración local es menor que el repositorio de configuración remota. Si desea implementar las variables del sistema de aplicaciones locales y los archivos de configuración para sobrescribir los valores de las propiedades en el repositorio remoto, puede configurarlas de la siguiente manera:
Spring: Cloud: Config: DELODOVERRIDE: TrueOverridenone: TrueOverRidSystemProperties: False
A través de la configuración anterior, el cliente puede lograr una mayor prioridad en la configuración local y no se puede sobrescribir. Dado que la versión actual de Spring Cloud en la que estamos basados es Edgware.RELEASE , la configuración anterior no funciona, pero usa los valores predeterminados en PropertySourceBootstrapProperties . Para situaciones específicas, consulte el problema: https://github.com/spring-cloud/spring-cloud-commons/pull/250. Hablaremos sobre la fuente específica del error en el siguiente análisis.
Análisis del código fuente
ConfigServicePropertySourcelocator
La sobrescribencia de las propiedades de configuración remota se relaciona en última instancia con la obtención de la configuración al comienzo del cliente. ¿Cómo lidiar con él después de obtener la configuración? Echemos un vistazo al diagrama de clases de la clase de adquisición de recursos configServicePropertySourcelocator en Spring Cloud Config.
ConfigServicePropertySourcelocator es esencialmente un localizador de recursos de propiedad, y su método principal es la ubicación (entorno de entorno). Primero, reemplace el marcador de posición en configClientProperties con la aplicación, el perfil y la etiqueta del entorno donde la aplicación se está ejecutando actualmente, e inicialice la SaTTemplate, luego itera a través de la matriz de etiquetas hasta que se obtenga la información de configuración válida, y finalmente vuelva a intentarlo en función de si falla rápidamente. El proceso principal es el siguiente:
Localice (entorno ambiente) llame al método GetRemoteenVironment (RestTemplate, Propiedades, Etiqueta, Estado) para obtener datos de configuración en el servidor remoto a través de HTTP. La implementación también es muy simple. Muestre el marcador de posición en la ruta de la solicitud de reemplazo y luego ensamble los encabezados. Una vez ensamblado, la solicitud se puede enviar y se devolverá el resultado.
En la implementación anterior, vemos que la información de configuración obtenida se almacena en CompositEPropertySource. ¿Cómo lo usamos? Otra clase importante para agregar aquí es PropertySourceBootstraPConfiguration, que implementa la interfaz ApplicationContextInitializer. Esta interfaz se volverá a llamar () de nuevo antes de que se actualice el contexto de la aplicación, realizando así la operación de inicialización. La pila de llamadas después de que se inicia la aplicación es la siguiente:
SpringApplicationBuilder.run () -> SpringApplication.run () -> SpringApplication.CreateanDreFreshContext () -> SpringApplication.ApplyInitializers () -> PropertySourceBootstraPConfiguration.iniTialize () PropertySourCebootStraponfiguration
Se llamará al método de ubicación del COMAGSEVICEPROPERTYSOURCATOR de ServiceSour de arriba para asegurarse de que el contexto pueda obtener la información de configuración necesaria antes de actualizarse. Echemos un vistazo al método de inicialización:
public class PropertySourceBootstraPConfigurationImplements ApplicationContextInitializer <configuableApplicationContext>, ordenado {private int orden = ordenado.highest_precedence + 10; @AUTOWIRED (requerido = falso) Lista privada <PropertySourCeCator> PropertySourCeCators = new ArrayList <> (); @Override public void Initialize (configuableApplicationContext ApplicationContext) {CompositEPropertySource Composite = new CompositEPropertySource (bootstrap_property_source_name); // Ordenar la matriz de machos de propiedades de propiedad y siga la anotación predeterminada AWareRordComparator AnnotationAwareRoRordComparator.sort (this.PropertySourCelocators); booleano vacío = verdadero; // Obtener el contexto de entorno en ejecución configurable en entorno de entorno = applicationContext.getEnvironment (); para (PropertySourCelocator Locator: this.propertySourcelocators) {// TransTraight this.PropertySourcelocators PropertySource <?> Source = null; fuente = locator.locate (entorno); if (fuente == null) {continuar; } logger.info ("Fuente de propiedad localizada:" + fuente); // Agregar fuente a la lista vinculada de PropertySource Composite.AddPropertySource (fuente); vacía = falso; } // Solo si la fuente no está vacía, se establecerá en el entorno if (! Vacía) {// Devuelve la forma variable de entorno, que se puede realizar, como AddFirst y Addlast MutablePropertySources PropertySources = Environment.getPropertySources (); String logConfig = Environment.Resolve PlaceHolders ("$ {logging.config:}"); LogFile logFile = logFile.get (entorno); if (PropertySources.Contains (bootstrap_property_source_name)) {// eliminar bootstrapproperties PropertySources.remove (bootstrap_property_source_name); } // establecer PropertySources InsertPropertySources (PropertySources, compuesto); reinitializeLoggingsystem (entorno, logConfig, logFile); setLoglevels (entorno); // desechar la información de configuración de múltiples activos de los perfiles HandleInCludedProfiles (entorno); }} // ...}Echemos un vistazo a qué operaciones se realizan en el método Initialize.
Devuelve la forma variable de entorno, que se puede realizar como addfirst, addlast
Eliminar bootstrapraperties en PropertySources
De acuerdo con las reglas de la anulación del servidor de configuración, establezca PropertySources
Manejar información de configuración para múltiples perfiles activos
Cuando inicialice el método de inicialización, primero atraviese el método de localización de todos los objetos de tipos decelocator de propiedad , luego coloque los valores de propiedad obtenidos de varias maneras en el método CompositEPropertySource , y finalmente llame al método InsertPropertySources (PropertySources, Composite) para configurarlo en el entorno. El contexto de Spring Cloud proporciona PropertySourceBootSpraperties que sobrescriben las propiedades remotas, y utiliza esta clase de configuración para determinar la prioridad de la fuente de propiedades.
Void privado insertPropertySources (MutablePropertySources PropertySources, CompositEPropertySource Composite) {mutablePropertySources entrante = new MutablePropertySources (); entrante.addfirst (compuesto); PropertySourceBootstraPraperties RemotEpreperties = new PropertySourceBootstraPraperties (); nuevo RelatedDatabinder (RemoteProperties, "Spring.Cloud.Config") .Bind (New PropertySourcesPropertyValues (entrantes)); // Si no se permite la sobrescritura local ( devolver; } // overidenone es verdadero, la configuración externa tiene la prioridad más baja if (remoteProperties.iseverRideNone ()) {PropertySources.addlast (compuesto); devolver; } if (PropertySources .Contains (StandardEnvironment.System_environment_Property_Source_Name)) {// Establezca la prioridad de las configuraciones externas de acuerdo con OverDessystemProperties if (! RemotePerties.SoverRidSystemProperties ()) {PropertySources.AddaFter ( StandardEnvironment.system_environment_property_source_name, compuesto); } else {PropertySources.addbefore (StandardEnvironment.System_environment_Property_source_name, compuesto); }} else {PropertySources.addlast (compuesto); }}La implementación anterior ajusta principalmente la prioridad de múltiples fuentes de configuración en función de las propiedades en PropertySourceTraPraperties . Desde su implementación, podemos ver que el objeto PropertySourceBootstraPraperties se inicializa directamente, utilizando el valor de la propiedad predeterminado y no se inyecta en lo que establecemos en el archivo de configuración.
Implementación reparada:
@AUtowired (requerido = falso) privado PropertySourceBootstraPraperties RemotepertiesForRoverRiding; @Override public int getOrder () {return this.order; Void privado insertPropertySources (MutablePropertySources PropertySources, CompositEPropertySource Composite) {mutablePropertySources entrante = new MutablePropertySources (); entrante.addfirst (compuesto); PropertySourceBootstrapRoperties RemotEpreperties = RemotEpropertiesForRoverRiding == NULL? New PropertySourceBootstraProperties (): RemotePertiesForRoverRiding;Resumir
Lo anterior es una explicación detallada del ejemplo de las propiedades de configuración remota de primavera nube introducida por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!