Introdução ao Netflix Archaius com Spring Cloud
1. Visão geral
NetflixArchaius é uma biblioteca de gerenciamento de configuração poderosa.
Simplificando, é uma estrutura que pode ser usada para reunir propriedades de configuração de muitas fontes diferentes, oferecendo acesso rápido e thread-safe a elas.
Além disso, a biblioteca permite que as propriedades sejam alteradas dinamicamente no tempo de execução, possibilitando ao sistema obter essas variações sem precisar reiniciar o aplicativo.
Neste tutorial introdutório, definiremos uma configuração simples do Spring Cloud Archaius, explicaremos o que está acontecendo nos bastidores e, por fim, veremos como o Spring permite estender a configuração básica.
2. Recursos do Netflix Archaius
Como sabemos, o Spring Boot já fornece instrumentos para gerenciarexternalized configurations, então por que se preocupar em configurar um mecanismo diferente?
Bem,Archaius offers some handy and interesting features that aren’t contemplated by any other configuration framework. Alguns de seus pontos principais são:
-
Propriedades dinâmicas e digitadas
-
Um mecanismo de retorno de chamada que é chamado em mutações de propriedades
-
Implementações prontas para uso de fontes de configuração dinâmica, como URLs, JDBC e Amazon DynamoDB
-
Um MBean JMX que pode ser acessado pelo Spring Boot Actuator ou JConsole para inspecionar e manipular as propriedades
-
Validação de propriedades dinâmicas
Essas vantagens podem ser benéficas em muitos cenários.
Portanto, o Spring Cloud trabalhou em uma biblioteca que permite configurar facilmente um ‘Spring Environment Bridge 'para que o Archaius possa ler propriedades do Spring Environment.
3. Dependências
Vamos adicionar ospring-cloud-starter-netflix-archaius ao nosso aplicativo, ele adicionará todas as dependências necessárias ao nosso projeto.
Opcionalmente, também podemos adicionarspring-cloud-netflix à nossa seçãodependencyManagement e confiar em sua especificação das versões dos artefatos:
org.springframework.cloud
spring-cloud-starter-netflix-archaius
org.springframework.cloud
spring-cloud-netflix
2.0.1.RELEASE
pom
import
Observação: podemos verificar o Maven Central para verificar se estamos usando a versão mais recente dostarter library.
4. Uso
Once we add the required dependency, we’ll be able to access the properties managed by the framework:
DynamicStringProperty dynamicProperty
= DynamicPropertyFactory.getInstance()
.getStringProperty("example.archaius.property", "default value");
String propertyCurrentValue = dynamicProperty.get();
Vamos trabalhar em um pequeno exemplo para ver como isso está disponível fora da caixa.
4.1. Exemplo rápido
By default, it manages dynamically all the properties defined in a file named config.properties in the application’s classpath.
Então, vamos adicioná-lo à nossa pasta de recursos com algumas propriedades arbitrárias:
#config.properties
example.archaius.properties.one=one FROM:config.properties
Agora precisaremos verificar os valores das propriedades a qualquer momento específico. Nesse caso, criaremos umRestController que recupera os valores como uma resposta JSON:
@RestController
public class ConfigPropertiesController {
private DynamicStringProperty propertyOneWithDynamic
= DynamicPropertyFactory.getInstance()
.getStringProperty("example.archaius.properties.one", "not found!");
@GetMapping("/property-from-dynamic-management")
public String getPropertyValue() {
return propertyOneWithDynamic.getName() + ": " + propertyOneWithDynamic.get();
}
}
Vamos experimentar. Podemos enviar uma solicitação para este endpoint, e o serviço irá recuperar os valores armazenados emconfig.properties conforme o esperado.
Não é grande coisa até agora, certo? Ok, vamos continuar e alterar os valores da propriedade no arquivo do classpath, sem reiniciar o serviço. Como resultado, após um minuto ou mais, uma chamada para o terminal deve recuperar os novos valores. Muito legal, não é?
A seguir, vamos tentar entender o que está acontecendo nos bastidores.
5. Como funciona?
Em primeiro lugar, vamos tentar compreender o quadro geral.
Archaius é uma extensão doApache’s Commons Configuration library, adicionando alguns recursos interessantes, como uma estrutura de pesquisa para fontes dinâmicas, com alto rendimento e implementação segura para thread.
A bibliotecaspring-cloud-netflix-archaius entra em ação, mesclando todas as diferentes fontes de propriedade e configurando automaticamente as ferramentas Archaius com essas fontes.
5.1. Biblioteca Netflix Archaius
Ele opera definindo uma Configuração composta, uma coleção de várias configurações obtidas de diferentes fontes.
Além disso, algumas dessas fontes de configuração podem suportar a pesquisa em tempo de execução para alterações. O Archaius fornece interfaces e algumas implementações predefinidas para configurar esses tipos de fontes.
A coleção de fontes é hierarquizada para que, se uma propriedade estiver presente em várias configurações, o valor final seja aquele no slot mais alto.
Finalmente, aConfigurationManager trata da configuração de todo o sistema e do contexto de implantação. Ele pode instalar a configuração composta final ou recuperar a instalada para modificação.
5.2. Suporte para Spring Cloud
A principal tarefa da biblioteca Spring Cloud Archaius é mesclar todas as diferentes fontes de configuração como umConcurrentCompositeConfiguratione instalá-lo usando oConfigurationManager.
A ordem de precedência na qual a biblioteca define as fontes é:
-
Qualquer beanAbstractConfiguration de configuração comum do Apache definido no contexto
-
Todas as fontes definidas emAutowired SpringConfigurableEnvironment
-
As fontes padrão do Archaius, que vimos no exemplo acima
-
FontesSystemConfiguration eEnvironmentConfiguration do Apache
Outro recurso útil que esta biblioteca Spring Cloud fornece é a definição de um atuadorEndpoint para monitorar e interagir com as propriedades. Seu uso está fora do escopo deste tutorial.
6. Adaptando e estendendo a configuração do Archaius
Agora que entendemos melhor como o Archaius funciona, estamos em boa forma para analisar como adaptar a configuração ao nosso aplicativo ou como estender a funcionalidade usando nossas fontes de configuração.
6.1. Propriedades de configuração suportadas do Archaius
Se quisermos que o Archaius leve em consideração outros arquivos de configuração semelhantes ao deconfig.properties, podemos definir a propriedade de sistemaarchaius.configurationSource.additionalUrls.
O valor é analisado para uma lista de URLs separadas por vírgula; portanto, por exemplo, podemos adicionar essa propriedade do sistema ao iniciar o aplicativo:
-Darchaius.configurationSource.additionalUrls=
"classpath:other-dir/extra.properties,
file:///home/user/other-extra.properties"
Archaius irá ler o arquivoconfig.properties primeiro, e então os outros, na ordem especificada. Por esse motivo, as propriedades definidas nos últimos arquivos terão prioridade sobre as anteriores.
Existem algumas outras propriedades do sistema que podemos usar para configurar vários aspectos da configuração padrão do Archaius:
-
archaius.configurationSource.defaultFileName: o nome do arquivo de configuração padrão no classpath
-
archaius.fixedDelayPollingScheduler.initialDelayMills: atraso inicial antes de ler a fonte de configuração
-
archaius.fixedDelayPollingScheduler.delayMills: atraso entre duas leituras da fonte; o valor padrão é 1 minuto
6.2. Adicionando fontes de configuração adicionais ao Spring
Como podemos adicionar uma fonte de configuração diferente para ser gerenciada pela estrutura descrita? E como podemos gerenciar propriedades dinâmicas com maior precedência do que as definidas no Spring Environment?
Revendo o que mencionamos na seção 4.2, podemos perceber que as configurações mais altas na Configuração Composite definida pelo Spring são os beansAbstractConfiguration definidos no contexto.
Portanto,all we need to do is add an implementation of this Apache’s abstract class to our Spring Context using some of the functionality provided by Archaius, and the Spring’s autoconfiguration will spontaneously add it to the managed configuration properties.
Para simplificar, veremos um exemplo em que configuramos um arquivo de propriedades semelhante aoconfig.properties padrão, mas com a diferença de ter uma precedência mais alta do que o resto do ambiente Spring e propriedades do aplicativo:
@Bean
public AbstractConfiguration addApplicationPropertiesSource() {
URL configPropertyURL = (new ClassPathResource("other-config.properties")).getURL();
PolledConfigurationSource source = new URLConfigurationSource(configPropertyURL);
return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
}
Para nossa sorte, ele contempla várias fontes de configuração que podemos configurar com quase nenhum esforço. Sua configuração está fora do escopo deste tutorial introdutório.
7. Conclusão
Para resumir, aprendemos sobre o Archaius e alguns dos recursos interessantes que ele oferece para aproveitar as vantagens do gerenciamento de configuração.
Além disso, vimos como a biblioteca de autoconfiguração do Spring Cloud entra em ação, permitindo-nos usar a API dessa biblioteca de maneira conveniente.
Mais uma vez, podemos encontrar todos os exemplos mostrados neste tutorial e outros em nossoGithub repo.