A fonte de configuração do aplicativo geralmente é o servidor de configuração remota. Por padrão, a prioridade da configuração local é menor que o repositório de configuração remota. Se você deseja implementar as variáveis do sistema de aplicativos locais e os arquivos de configuração para substituir os valores da propriedade no repositório remoto, você pode defini -los da seguinte forma:
Primavera: Cloud: Config: allowoverride: TrueOverridenona: TrueOverridesystemProperties: false
Através da configuração acima, o cliente pode obter maior prioridade na configuração local e não pode ser substituído. Como a versão atual do Spring Cloud em que nos baseamos é Edgware.RELEASE , as configurações acima não funcionam, mas usam os valores padrão no PropertySourceBootstrapProperties . Para situações específicas, consulte a edição: https://github.com/spring-cloud/spring-clod-commons/pull/250. Falaremos sobre a fonte específica do bug na análise a seguir.
Análise do código -fonte
ConfigServicePropertySourcelocator
A substituição das propriedades de configuração remota está relacionada à obtenção da configuração no início do cliente. Como lidar com isso depois de obter a configuração? Vamos dar uma olhada no diagrama de aula da classe de aquisição de recursos ConfigServicePropertySourcelocator na Spring Cloud Config.
ConfigServicePropertySourcelocator é essencialmente um localizador de recursos da propriedade, e seu método principal é o local (ambiente ambiente). Primeiro, substitua o espaço reservado no ConfigClientProperties pelo aplicativo, perfil e etiqueta do ambiente em que o aplicativo está em execução atualmente e inicialize o RESTTEMPLATE e depois itera através da matriz de etiquetas até que as informações de configuração válidas sejam obtidas e finalmente novamente novamente com base no fato de falhar rapidamente. O processo principal é o seguinte:
Localize (Environment Environment) Ligue para o método GetRemoteenvironment (RestTemplate, Properties, Label, State) para obter dados de configuração no servidor remoto através do HTTP. A implementação também é muito simples. Exiba o espaço reservado no caminho da solicitação de substituição e, em seguida, monte os cabeçalhos. Uma vez montado, a solicitação pode ser enviada e o resultado será retornado.
Na implementação acima, vemos que as informações de configuração obtidas são armazenadas no CompositePropertySource. Como usamos isso? Outra classe importante a acrescentar aqui é o PropertySourCootStrapConfiguration, que implementa a interface ApplicationContextinitializer. Essa interface atualizar () será chamada antes que o contexto do aplicativo seja atualizado, executando assim a operação de inicialização. A pilha de chamadas após o início do aplicativo é o seguinte:
SpringApplicationBuilder.run () -> springApplication.run () -> springApplication.createAndRefreshContext () -> springapplication.applyInitializers () -> PropertySourCootStrapConfiguration.Initialize () PropertySourceBootStrapConfiguration
O método de localização do ConfigServicePropertySourcelocator acima será chamado no Initialize, para garantir que o contexto possa obter as informações de configuração necessárias antes da atualização. Vamos dar uma olhada no método inicializar:
classe pública PropertySourceBootStrapConfigurationImplements ApplicationContextInitializer <ConfigurableApplicationContext>, ordenado {private int order = ordened.highest_precedence + 10; @AUTOWIRED (requerir = FALSE) Lista privada <PROPROPTIELECELOCATOR> PropertySourcelocators = new ArrayList <> (); @Override public void Initialize (ConfigurableApplicationContext ApplicationContext) {CompositionPropertySource Composite = new ComposePoPropertySource (bootstrap_property_source_name); // classifica a matriz PropertySourcelocators e siga o padrão AnoTationAWareOrdercomparator anoTationAWareOrdercomparator.sort (this.propertySourcelocators); booleano vazio = true; // obtenha o ambiente de execução do contexto configurável ambiente ambiente = ApplicationContext.getenvironment (); para (Localizador PropertySourcelocator: this.PropertySourcelocators) {// Transtraight this.PropertySourcelocators PropertySource <?> Source = null; fonte = locator.locate (ambiente); if (fonte == null) {continue; } logger.info ("Localizado fonte da propriedade:" + fonte); // Adicione a fonte à lista vinculada do PropertySource Composite.addPropertySource (fonte); vazio = false; } // Somente se a fonte não estiver vazia, ela será definida para o ambiente se (! Vazio) {// retornar a forma variável de ambiente, que pode ser realizada, como AddFirst e Addlast MutablePropertySources PropertySources = Environment.GetPropertySourceces (); String logConfig = Environment.ResolvePlaceHolders ("$ {logging.config:}"); Logfile logfile = logfile.get (ambiente); if (PropertySources.Contains (bootstrap_property_source_name)) {// remova o bootstraproperties propriedadesources.remove (bootstrap_property_source_name); } // Definir PropertySources InsertPropertySources (PropertySources, Composite); reinicializELogGingSystem (ambiente, logConfig, arquivo de log); setLoglevels (ambiente); // Disponibe várias informações de configuração de ativos de perfis de handleincludedprofiles (ambiente); }} // ...}Vamos dar uma olhada em quais operações são executadas no método inicializar.
Retorna a forma variável de ambiente, que pode ser realizada como addfirst, addlast
Remova o bootstrapproperties em propriedades
De acordo com as regras de substituição do servidor de configuração, defina o PropertySources
Lidar com informações de configuração para vários perfis ativos
Ao inicializar o método Inicializar, primeiro atravesse o método Locate de todos os objetos do PropertySourcelocator e coloque os valores da propriedade obtidos de várias maneiras no compostoPropertySource e, finalmente, chame o método InsertPropertySources (PropertySources, Composite) para configurá -lo para o ambiente. O contexto da nuvem da primavera fornece propriedadesourcebootsstraproperties que substituem as propriedades remotas e usa essa classe de configuração para determinar a prioridade da fonte da propriedade.
private void insertPropertySources (MutablePropertySources PropertySources, composto composto composto) {MutablePropertySources Incoming.addfirst (composto); PropertySourceBootStrapproperties RemoteProperties = new PropertySourceBootStrapProperties (); New RelaxedDatabinder (RemoteProperties, "spring.cloud.config") .bind (novo PropertySourcesPropertyValues (recebimento)); // Se a substituição local não for permitida (! RemoteProperties.isallowOverride () || (! RemoteProperties.isoSoverRidenOne () && RemoteProperties.isoSoverRidesystemProperties ())) {PropertySourceces.addfirst (Composite); retornar; } // Overidenona é verdadeira, a configuração externa tem a menor prioridade se (remoteproperties.isoverridenona ()) {PropertySources.addlast (composto); retornar; } if (PropertySources .Contains (Standardenvironment.system_environment_property_source_name)) {// Defina a prioridade de configurações externas de acordo com o excesso de sistemas de sistema se (! Standardenvironment.system_environment_property_source_name, composto); } else {PropertySources.addbefore (Standardenvironment.system_environment_property_source_name, composto); }} else {PropertySources.addlast (composto); }}A implementação acima ajusta principalmente a prioridade de múltiplas fontes de configuração com base nas propriedades em PropertySourceBootStraproperties . A partir de sua implementação, podemos ver que o objeto PropertySourceBootStrapproperties é inicializado diretamente, usando o valor da propriedade padrão e não injetado no que definimos no arquivo de configuração.
Implementação reparada:
@AUTOWIRED (requerir = false) Private PropertySourCootStrapproperties RemotePropertiesForOverriding; @Override public Int getDorder () {return this.order; private void insertPropertySources (MutablePropertySources PropertySources, composto composto composto) {MutablePropertySources Incoming.addfirst (composto); PropertySourceBootStrapproperties RemoteProperties = RemotePropertiesForOverriding == NULL? new PropertySourceBootStraProperties (): RemotePropertiesForOverriding;Resumir
O exposto acima é uma explicação detalhada do exemplo do Spring Cloud, substituindo o exemplo do editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!