Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Mova as informações de configuração do pacote de implantação do aplicativo para um local centralizado. Essa abordagem fornece um gerenciamento e controle mais fáceis de dados de configuração e para compartilhar dados de configuração entre aplicativos e instâncias de aplicativo.
Contexto e problema
A maioria dos ambientes de runtime do aplicativo inclui informações de configuração em arquivos que você implanta com o aplicativo. Em alguns casos, você pode editar esses arquivos para alterar o comportamento do aplicativo depois de implantar o aplicativo. No entanto, as alterações de configuração exigem que você reimplante o aplicativo. A reimplantação geralmente resulta em tempo de inatividade inaceitável e outra sobrecarga administrativa.
Os arquivos de configuração local também limitam a configuração a um único aplicativo. Em alguns cenários, talvez você queira compartilhar as configurações em vários aplicativos. Os exemplos incluem cadeias de conexão de banco de dados, informações de tema da interface do usuário e as URLs de filas e armazenamento que um conjunto relacionado de aplicativos usa.
O gerenciamento de alterações nas configurações locais em várias instâncias em execução do aplicativo é desafiador. Esse desafio pode resultar em instâncias que usam configurações diferentes enquanto você implanta a atualização.
As atualizações de aplicativos e componentes também podem exigir alterações nos esquemas de configuração. Muitos sistemas de configuração não dão suporte a versões diferentes de informações de configuração.
Solução
Armazene as informações de configuração no armazenamento externo e forneça uma interface que você pode usar para ler e atualizar as configurações de forma rápida e eficiente. O tipo de repositório externo depende do ambiente de hospedagem e runtime do aplicativo. Em um cenário hospedado na nuvem, o armazenamento externo normalmente é um serviço de armazenamento baseado em nuvem ou um serviço de configuração dedicado. Ele também pode ser um banco de dados hospedado ou outro sistema personalizado.
O repositório de backup escolhido para obter informações de configuração deve ter uma interface que forneça acesso consistente e fácil de usar. Ele deve expor as informações em um formato corretamente tipado e estruturado. A implementação também pode precisar autorizar o acesso dos usuários para proteger os dados de configuração. Talvez seja necessário ser flexível o suficiente para armazenar várias versões da configuração, como desenvolvimento, homologação e produção, incluindo várias versões de lançamento de cada configuração.
Muitos sistemas de configuração internos leem os dados quando o aplicativo é iniciado e, em seguida, armazenam os dados em cache na memória para fornecer acesso rápido e minimizar o impacto no desempenho do aplicativo. Dependendo do tipo de repositório de backup que você usa e da latência desse repositório, convém implementar um mecanismo de cache dentro do repositório de configuração externo. Para obter mais informações, consulte as diretrizes de cache. O diagrama a seguir mostra uma visão geral do padrão do Repositório de Configuração Externa com um cache local opcional.
Problemas e considerações
Considere os seguintes pontos ao decidir como implementar esse padrão:
Escolha um repositório de backup que forneça desempenho aceitável, alta disponibilidade e robustez. Verifique se você pode fazer backup dele no processo de manutenção e administração do aplicativo. Em um aplicativo hospedado na nuvem, use um mecanismo de armazenamento em nuvem ou um serviço de plataforma de configuração dedicado para atender a esses requisitos.
Projete o esquema do repositório de backup para permitir flexibilidade nos tipos de informações que ele pode conter. Verifique se ele fornece recursos para todos os requisitos de configuração, como dados digitados, coleções de configurações, várias versões de configurações e quaisquer outros recursos que os aplicativos exigem. O esquema deve ser fácil de estender para dar suporte a mais configurações quando os requisitos forem alterados.
Considere os recursos físicos do repositório de backup, como eles se relacionam com a maneira como ele armazena informações de configuração e os efeitos no desempenho. Por exemplo, armazenar um documento XML que contém informações de configuração requer a interface de configuração ou o aplicativo para analisar o documento para ler as configurações individuais. A análise complica a forma como você atualiza as configurações, mas armazenar em cache as configurações pode ajudar a compensar o desempenho de leitura mais lento.
Considere como a interface de configuração permite o controle do escopo e da herança das configurações. Por exemplo, talvez seja necessário definir o escopo das configurações nos níveis de organização, aplicativo e computador. A interface de configuração pode precisar delegar o controle sobre o acesso a escopos diferentes e impedir ou permitir que aplicativos individuais substituam as configurações.
Verifique se a interface de configuração pode expor os dados de configuração nos formatos necessários, como valores digitados, coleções, pares chave-valor e sacos de propriedades.
Considere como a interface do repositório de configuração se comporta quando as configurações contêm erros ou não existem no repositório de backup. Talvez seja necessário restaurar as configurações padrão e os erros de log. Considere também a sensibilidade a maiúsculas e minúsculas de nomes ou chaves de configuração, como armazenar e manipular dados binários e como lidar com valores nulos ou vazios.
Considere como proteger os dados de configuração e dar acesso apenas aos usuários e aplicativos apropriados. A interface do repositório de configuração normalmente fornece esse recurso, mas você também precisa garantir que usuários e aplicativos não possam acessar diretamente os dados no repositório de backup sem as permissões apropriadas. Verifique a separação estrita entre as permissões necessárias para ler e gravar dados de configuração. Considere também se você precisa criptografar algumas ou todas as configurações e como implementar essa criptografia na interface do repositório de configuração.
Você também deve ativar o log de auditoria para registrar quem lê ou modifica valores de configuração e quando essas ações ocorrem. Aplique os mesmos requisitos de auditoria a quaisquer cópias de reserva locais dos dados de configuração.
Separe valores de configuração nãosensíveis de segredos. Mantenha as configurações de rotina, como sinalizadores de recursos e pontos de extremidade, nas configurações. Armazene segredos, como cadeias de conexão, chaves de API, certificados e senhas, em um sistema de gerenciamento de segredos dedicado que fornece criptografia e acesso controlado.
As configurações armazenadas centralmente, que alteram o comportamento do aplicativo durante o runtime, são cruciais. Implante, atualize e gerencie-os usando os mesmos mecanismos que você usa para implantar o código do aplicativo. Por exemplo, você deve realizar alterações que podem afetar mais de um aplicativo usando uma abordagem de implantação totalmente testada e preparada para garantir que a alteração atenda a todos os aplicativos que usam essa configuração. Se um administrador editar uma configuração para atualizar um aplicativo, isso poderá afetar negativamente outros aplicativos que usam a mesma configuração. Produtos como Configuração de Aplicativos do Azure ajudam a reduzir esse risco por meio de recursos internos, como histórico de revisão, PITR (recuperação pontual), instantâneos imutáveis e padrões de distribuição progressivos.
Se um aplicativo armazenar em cache as informações de configuração, você precisará alertar o aplicativo quando a configuração for alterada. Você pode implementar uma política de expiração para dados de configuração armazenados em cache para que essas informações sejam atualizadas automaticamente periodicamente. O aplicativo vê as alterações e as implementa.
Os dados de configuração armazenados em cache podem ajudar a resolver problemas transitórios de conectividade que o repositório de configuração externo experimenta no runtime do aplicativo, mas essa abordagem normalmente não resolverá o problema se o repositório externo estiver inativo quando o aplicativo for iniciado. Verifique se o pipeline de implantação do aplicativo pode fornecer o último conjunto conhecido de valores de configuração em um arquivo de configuração a ser usado quando seu aplicativo não puder recuperar valores dinâmicos na inicialização.
Quando usar esse padrão
Use esse padrão quando:
Você precisa compartilhar configurações em vários aplicativos ou instâncias ou impor uma configuração padrão entre elas.
Seu sistema de configuração padrão não dá suporte a todos os tipos de configuração necessários, como imagens ou estruturas de dados complexas.
Você precisa de um repositório complementar para algumas configurações, permitindo que os aplicativos substituam alguns ou todos os valores armazenados centralmente.
Você precisa simplificar a administração em vários aplicativos e, opcionalmente, monitorar o uso da configuração registrando o acesso ao repositório de configuração.
O padrão pode não ser adequado nestes casos:
- Sua configuração é simples, local para um aplicativo e é alterada somente durante os ciclos de versão normais. Nesse caso, um repositório de configuração externo pode adicionar complexidade operacional desnecessária.
Design de carga de trabalho
Avalie como usar o padrão do Repositório de Configuração Externa em um design de carga de trabalho para abordar as metas e os princípios abordados nos pilares da estrutura Azure Well-Architected. A tabela a seguir fornece diretrizes sobre como esse padrão dá suporte às metas de cada pilar.
| Pilar | Como esse padrão apoia os objetivos do pilar |
|---|---|
| A Excelência Operacional ajuda a fornecer qualidade da carga de trabalho por meio de processos padronizados e coesão de equipe. | Essa separação da configuração do aplicativo do código do aplicativo dá suporte à configuração específica do ambiente e aplica o controle de versão aos valores de configuração. Os repositórios de configuração externos também são um local comum para gerenciar sinalizadores de recursos para implementar práticas de implantação seguras. - OE:10 Design de automação - OE:11 Práticas de implantação segura |
Se esse padrão introduzir compensações dentro de um pilar, considere-as em relação aos objetivos dos outros pilares.
Example
Os exemplos a seguir mostram como implementar o padrão do Repositório de Configuração Externa em Azure. O primeiro exemplo usa a Configuração de Aplicativos e bibliotecas de cliente. O segundo exemplo usa um repositório de backup personalizado para cenários que exigem implementação especializada.
Configuração de Aplicativos
A maioria dos aplicativos pode usar a Configuração de Aplicativos em vez de um repositório de configuração personalizado. A Configuração de Aplicativo dá suporte a pares chave-valor aos quais você pode aplicar namespaces. A Configuração de Aplicativos também dá suporte a instantâneos imutáveis de configuração para que você possa inspecionar, reverter ou implantar progressivamente as alterações de configuração sem o risco de executar instâncias.
Use referências de instantâneo para permitir que os aplicativos mudem entre instantâneos em tempo de execução sem alterações de código ou reimplantação. Você pode exportar valores de configuração para que uma cópia seja fornecida com seu aplicativo como um backup a ser usado se o serviço for inacessível quando o aplicativo for iniciado.
Na Configuração do Aplicativo, chaves e valores são cadeias de caracteres Unicode e cada par chave-valor tem metadados opcionais, como variantes baseadas em rótulo e tipo de conteúdo. Use o tipo de conteúdo para descrever como seu aplicativo deve interpretar um valor, como em JSON ou em um tipo de Configuração de Aplicativo interno. A Configuração de Aplicações também mantém um histórico de revisão com PITR, o que ajuda você a examinar e recuperar pares chave-valor anteriores.
Para resiliência, provisione seu repositório em uma região que dá suporte a zonas de disponibilidade e ative a replicação geográfica para que você possa configurar seus aplicativos para ler da réplica mais próxima e alternar entre pontos de extremidade de réplica durante interrupções regionais. Use referências Azure Key Vault para manter segredos no Key Vault e referenciá-los da Configuração de Aplicativos, em vez de armazenar credenciais diretamente no repositório de configuração. Use identidade gerenciada e controle de acesso baseado em funções do Azure (Azure RBAC) em vez de cadeias de conexão para autenticar aplicativos no App Configuration.
Para cargas de trabalho executadas no AKS (Serviço de Kubernetes do Azure), o App Configuration Kubernetes Provider pode gerar ConfigMaps e Segredos diretamente da sua loja sem exigir alterações de código nos contêineres de carga de trabalho. Você também pode usar a Configuração de Aplicativos para gerenciar sinalizadores de recursos, incluindo distribuição direcionada e experimentação baseada em variantes, em suas práticas de implantação seguras.
Para isolamento de rede, use pontos de extremidade privados para a Configuração de Aplicação para que o tráfego do cliente permaneça em endereços IP privados por meio de Link Privado do Azure. Depois de configurar o acesso privado, você pode desativar o acesso público para reduzir a exposição ao ponto de extremidade público. Em implantações replicadas geograficamente, um único ponto de extremidade privado pode alcançar todas as réplicas, mas para maior resiliência regional, você pode provisionar pontos de extremidade privados para cada região de réplica e configurar o DNS (Sistema de Nomes de Domínio) adequadamente.
Bibliotecas de cliente
As bibliotecas de cliente fornecem muitos dos recursos anteriores. As bibliotecas de cliente se integram ao runtime do aplicativo para ajudar a buscar e armazenar em cache valores, atualizar valores quando eles são alterados e lidar com interrupções transitórias na Configuração de Aplicativos.
| Runtime | Biblioteca do cliente | Observações | Início Rápido |
|---|---|---|---|
| .NET | Microsoft.Extensions.Configuration.AzureAppConfiguration | Provedor de serviços para Microsoft.Extensions.Configuration |
Início Rápido para .NET |
| ASP.NET Core | Microsoft.Azure.AppConfiguration.AspNetCore | Adiciona middleware de atualização controlado por solicitação para ASP.NET Core | Quickstart para ASP.NET Core |
| Azure Functions em .NET | Microsoft.Azure.AppConfiguration.Functions.Worker | Provedor para o modelo de trabalho isolado que usa Program.cs |
Quickstart para Azure Functions |
| .NET Framework | Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration | Construtor de configurações para System.Configuration |
Quickstart for .NET Framework |
| Java Spring, um framework de desenvolvimento Java | com.azure.spring > azure-spring-cloud-appconfiguration-config | Dá suporte ao acesso do Spring Framework via ConfigurationProperties |
Início Rápido para Java Spring |
| Python | azure-fornecedor-de-configuração-de-aplicativos | Biblioteca de provedores que oferece atualização dinâmica e suporte a referências do Key Vault | Início Rápido para Python |
| JavaScript e Node.js | @azure/app-configuration-provider - Fornecedora de configuração de aplicativos Azure | Biblioteca de provedores que fornece atualização dinâmica e suporte para referências do Key Vault | Início Rápido para JavaScript |
As seguintes ações do GitHub App Configuration sync e as tarefas internas do Azure Pipelines também estão disponíveis:
Exemplo do repositório de backup personalizado
Em um aplicativo que Azure hosts, você pode usar Armazenamento do Azure para armazenar informações de configuração externamente. Essa abordagem fornece resiliência e alto desempenho. Por padrão, o Armazenamento replica dados três vezes em um único datacenter. Para redundância geográfica entre regiões, você pode configurar a replicação geográfica com recursos manuais de failover. Armazenamento de Tabelas do Azure fornece um repositório chave-valor que pode usar um esquema flexível para os valores. Armazenamento de Blobs do Azure fornece um repositório hierárquico baseado em contêiner que pode conter qualquer tipo de dados em blobs nomeados individualmente.
Ao implementar esse padrão, você precisa abstrair Armazenamento de Blobs e expor suas configurações em seus aplicativos. Você também precisa verificar se há atualizações no runtime e decidir como responder a essas atualizações.
O exemplo a seguir mostra como você pode usar um repositório de configuração simples e Armazenamento de Blobs para armazenar e expor informações de configuração. Uma classe BlobSettingsStore abstrai Armazenamento de Blobs para manter informações de configuração. Ele implementa uma interface simples ISettingsStore .
public interface ISettingsStore
{
Task<ETag> GetVersionAsync();
Task<Dictionary<string, string>> FindAllAsync();
}
Essa interface define métodos para recuperar as configurações que o repositório de configuração contém e inclui um número de versão que você pode usar para detectar modificações recentes de configuração. Uma BlobSettingsStore classe pode usar a ETag propriedade do blob para implementar o controle de versão. A ETag propriedade é atualizada automaticamente sempre que um blob é gravado.
Note
Por sua concepção, esta ilustração simples expõe todas as configurações como valores de strings em vez de valores tipados.
Uma ExternalConfigurationManager classe fornece um wrapper em torno de uma BlobSettingsStore instância. Um aplicativo pode usar essa classe para recuperar informações de configuração. Essa classe pode usar um mecanismo de notificação de alteração, como Microsoft Extensões Reativas, para publicar atualizações de configuração enquanto o sistema é executado. Ele também implementa o "padrão Cache-Aside" para configurações, fornecendo melhor resiliência e desempenho.
O exemplo a seguir mostra como você pode implementar uma ExternalConfigurationManager classe.
static void Main(string[] args)
{
// Start monitoring configuration changes.
ExternalConfiguration.Instance.StartMonitor();
// Get a setting.
var setting = ExternalConfiguration.Instance.GetAppSetting("someSettingKey");
…
}
Próximas Etapas
- Exemplos de Configuração de App
- Integrar a Configuração de Aplicativos com implantações do Kubernetes usando o Helm
- Gerenciar sinalizadores de recursos na Configuração de Aplicativos
- Diretrizes de cache
- Práticas recomendadas de Configuração de Aplicativo
Recurso relacionado
- Padrão Cache-Aside