Padrão de Arquivo de Configuração Externo

Azure App Configuration
Azure Blob Storage

Mova as informações de configuração para fora do pacote de implementação de aplicação para uma localização centralizada. Assim, pode poderá gerir e controlar os dados de configuração de forma mais simples e partilhar os dados de configuração entre as aplicações e as instâncias da aplicação.

Contexto e problema

A maioria dos ambientes de tempo de execução das aplicações incluem informações de configuração que são mantidas em ficheiros implementados com a aplicação. Em alguns casos, é possível editar estes ficheiros para alterar o comportamento da aplicação depois da implementação. No entanto, as alterações à configuração precisam que a aplicação seja reimplementada, o que dá origem a frequentes períodos de indisponibilidade inaceitáveis e outras sobrecargas administrativas.

Os ficheiros de configuração local também limitam a configuração a uma única aplicação. Contudo, por vezes, poderá ser útil partilhar as definições de configuração entre as várias aplicações. Os exemplos incluem as cadeias de ligação de base de dados, as informações relativas a temas da IU ou os URLs das filas e o armazenamento utilizados por um conjunto relacionado de aplicações.

É difícil gerir as alterações às configurações locais em várias instâncias em execução da aplicação, especialmente num cenário de alojamento na cloud. Tal pode resultar em instâncias com diferentes definições de configuração enquanto a atualização está a ser implementada.

Além disso, as atualizações das aplicações e dos componentes podem exigir alterações aos esquemas de configuração. Muitos sistemas de configuração não suportam versões de informações de configuração diferentes.

Solução

Armazene as informações de configuração no armazenamento externo e disponibilize uma interface que pode ser utilizada para ler e atualizar as definições de configuração de forma rápida e eficiente. O tipo de arquivo externo depende do ambiente de alojamento e de tempo de execução da aplicação. Em um cenário hospedado na nuvem, normalmente é um serviço de armazenamento baseado em nuvem ou um serviço de configuração dedicado, mas pode ser um banco de dados hospedado ou outro sistema personalizado.

O armazenamento de segurança que escolher para as informações de configuração deve ter uma interface que disponibiliza um acesso consistente e fácil de utilizar. Este deve expor as informações num formato estruturado e escrito corretamente. A implementação também pode precisar autorizar o acesso dos usuários para proteger os dados de configuração e ser flexível o suficiente para permitir o armazenamento de várias versões da configuração (como desenvolvimento, preparação ou produção, incluindo várias versões de versão de cada uma).

Muitos sistemas de configuração incorporados leem os dados quando a aplicação é iniciada e colocam os dados em cache na memória para fornecer um acesso rápido e minimizar o impacto no desempenho da aplicação. Dependendo do tipo de armazenamento de segurança utilizado e da latência deste arquivo, pode ser útil implementar um mecanismo de colocação em cache dentro do arquivo de configuração externo. Para obter mais informações, veja Orientações sobre a Colocação em Cache. A figura mostra uma descrição geral do padrão de Arquivo de Configuração Externo com a cache local opcional.

Descrição geral do padrão de Arquivo de Configuração Externo com a cache local opcional

Problemas e considerações

Na altura de decidir como implementar este padrão, considere os seguintes pontos:

Escolha um armazenamento de segurança que oferece um desempenho aceitável, elevada disponibilidade, robustez e permite a criação de uma cópia de segurança como parte do processo de manutenção e administração da aplicação. Em um aplicativo hospedado na nuvem, usar um mecanismo de armazenamento em nuvem ou um serviço de plataforma de configuração dedicado geralmente é uma boa escolha para atender a esses requisitos.

Crie o esquema do armazenamento de segurança para permitir flexibilidade nos tipos de informações que pode conter. Confirme se este cumpre todos os requisitos de configuração, tal como dados digitados, coleções de definições, várias versões de definições e quaisquer outras funcionalidades que as aplicações que o utilizam precisam. O esquema deve ser fácil de expandir para suportar definições adicionais à medida que os requisitos se vão alterando.

Considere as capacidades físicas do armazenamento de segurança, como se relaciona com a forma como as informações de configuração são armazenadas e os efeitos no desempenho. Por exemplo, o armazenamento de um documento XML que contém informações de configuração exigirá que a interface de configuração ou a aplicação analise o documento para ler as definições individuais. Tal vai tornar a atualização de uma definição mais complicada, embora a colocação das definições em cache possa ajudar a compensar o desempenho de leitura mais lento.

Considere a forma como a interface de configuração vai permitir o controlo do âmbito e da herança das definições de configuração. Por exemplo, pode ser um requisito definir o âmbito das definições de configuração ao nível da organização, da aplicação e do computador. Pode ter de suportar a delegação do controlo sobre o acesso a diferentes âmbitos e impedir ou permitir que as aplicações individuais substituam as definições.

Confirme se a interface de configuração pode expor os dados de configuração nos formatos necessários, tal como valores digitados, coleções, pares chave/valor ou matrizes de propriedades.

Considere a forma como a interface do arquivo de configuração se vai comportar quando as definições contêm erros ou não existem no armazenamento de segurança. Talvez seja adequado reverter para as predefinições e registar os erros. Considere também aspetos como a sensibilidade às maiúsculas e minúsculas das chaves ou dos nomes da definição de configuração, o armazenamento e o processamento de dados binários e a forma como os valores nulos ou vazios são processados.

Considere como proteger os dados de configuração para permitir o acesso apenas aos utilizadores e às aplicações adequados. Trata-se provavelmente de uma funcionalidade da interface do arquivo de configuração, mas também é necessária para garantir que os dados no armazenamento de segurança não podem ser acedidos diretamente sem a permissão adequada. Confirme que existe uma separação restrita entre as permissões necessárias para ler e para escrever dados de configuração. Considere também a necessidade de encriptar algumas ou todas as definições de configuração e como isto vai ser implementado na interface do arquivo de configuração.

As configurações armazenadas centralmente, que alteram o comportamento da aplicação durante o tempo de execução, são extremamente importantes e devem ser implementadas, atualizadas e geridas com os mesmos mecanismos da implementação do código da aplicação. Por exemplo, as alterações que podem afetar mais do que uma aplicação devem ser realizadas com um teste completo e uma abordagem de implementação de teste para garantir que a alteração é adequada para todas as aplicações que utilizam esta configuração. Se um administrador editar uma definição para atualizar uma aplicação, esta operação poderá afetar negativamente as outras aplicações que utilizam a mesma definição.

Se uma aplicação colocar as informações de configuração em cache, a aplicação terá de ser alertada caso a configuração seja alterada. Pode ser possível implementar uma política de expiração para os dados de configuração em cache para que estas informações sejam automaticamente atualizadas de forma periódica e quando são detetadas (e abordadas) quaisquer alterações.

Embora o armazenamento em cache de dados de configuração possa ajudar a resolver problemas transitórios de conectividade com o armazenamento de configuração externo no tempo de execução do aplicativo, isso normalmente não resolve o problema se o armazenamento externo estiver inativo quando o aplicativo for iniciado pela primeira vez. Certifique-se de que seu pipeline de implantação de aplicativo possa fornecer o último conjunto conhecido de valores de configuração em um arquivo de configuração como um fallback se seu aplicativo não puder recuperar valores em tempo real quando for iniciado.

Quando utilizar este padrão

Este padrão é útil nas seguintes situações:

  • Definições de configuração partilhadas entre várias aplicações e instâncias da aplicação ou quando uma configuração padrão tem de ser imposta em várias aplicações e instâncias da aplicação.

  • Um sistema de configuração padrão que não suporta todas as definições de configuração necessárias, tal como armazenar imagens ou tipos de dados complexos.

  • Enquanto arquivo complementar de algumas das definições das aplicações, com a eventual possibilidade de as aplicações substituírem algumas ou todas as definições armazenadas centralmente.

  • Como forma de simplificar a administração de várias aplicações e, opcionalmente, para monitorizar a utilização de definições de configuração através do registo de alguns ou de todos os tipos de acesso ao arquivo de configuração.

Design da carga de trabalho

Um arquiteto deve avaliar como o padrão do Repositório de Configuração Externa pode ser usado no design de sua carga de trabalho para abordar as metas e os princípios abordados nos pilares do Azure Well-Architected Framework. Por exemplo:

Pilar Como esse padrão suporta os objetivos do pilar
A Excelência Operacional ajuda a fornecer qualidade de carga de trabalho por meio de processos padronizados e coesão da equipe. Essa separação da configuração do aplicativo do código do aplicativo oferece suporte à configuração específica do ambiente e aplica o controle de versão aos valores de configuração. Os armazenamentos de configuração externos também são um local comum para gerenciar sinalizadores de recursos para permitir práticas de implantação seguras.

- OE:10 Projeto de automação
- OE:11 Práticas de implementação seguras

Como em qualquer decisão de design, considere quaisquer compensações em relação aos objetivos dos outros pilares que possam ser introduzidos com esse padrão.

Exemplo de loja de suporte personalizada

Em um aplicativo hospedado pelo Microsoft Azure, uma opção possível para armazenar informações de configuração externamente é usar o Armazenamento do Azure. Este é resiliente, oferece um desempenho elevado e é replicado três vezes com ativação pós-falha automática para oferecer elevada disponibilidade. O Armazenamento de tabelas do Azure fornece um arquivo chave/valor com a possibilidade de utilizar um esquema flexível para os valores. O Armazenamento de blobs do Azure fornece um arquivo hierárquico baseado em contentor que pode conter qualquer tipo de dados em blobs com nomes individuais.

Ao implementar esse padrão, você seria responsável por abstrair o armazenamento de Blob do Azure e expor suas configurações em seus aplicativos, incluindo verificar se há atualizações em tempo de execução e abordar como responder a elas.

O exemplo a seguir mostra como um armazenamento de configuração simplista pode ser imaginado no armazenamento de Blob para armazenar e expor informações de configuração. Uma BlobSettingsStore classe pode abstrair o armazenamento de Blob para armazenar informações de configuração e implementa uma interface simples ISettingsStore .

public interface ISettingsStore
{
    Task<ETag> GetVersionAsync();
    Task<Dictionary<string, string>> FindAllAsync();
}

Essa interface define métodos para recuperar definições de configuração mantidas no repositório de configuração e inclui um número de versão que pode ser usado para detetar se alguma definição de configuração foi modificada recentemente. Uma BlobSettingsStore classe pode usar a propriedade do blob para implementar o ETag controle de versão. A ETag propriedade é atualizada automaticamente cada vez que um blob é gravado.

Por design, esta ilustração simples expõe todas as definições de configuração como valores de cadeia de caracteres em vez de valores digitados.

Uma ExternalConfigurationManager classe poderia então fornecer 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 algo como Microsoft Reative Extensions para publicar quaisquer alterações feitas na configuração enquanto o sistema está em execução. Ele também seria responsável por implementar o padrão Cache-Aside para configurações para fornecer resiliência e desempenho adicionais.

O uso pode ser parecido com o seguinte.

static void Main(string[] args)
{
    // Start monitoring configuration changes.
    ExternalConfiguration.Instance.StartMonitor();

    // Get a setting.
    var setting = ExternalConfiguration.Instance.GetAppSetting("someSettingKey");
    …
}

Usando a Configuração do Aplicativo do Azure

Embora a criação de um repositório de configuração personalizado possa ser necessária em algumas situações, muitos aplicativos podem, em vez disso, usar a Configuração de Aplicativo do Azure. A Configuração de Aplicativo do Azure dá suporte a pares chave-valor que podem ser namespaceados. As chaves são digitadas e são versionadas individualmente. A Configuração de Aplicativo do Azure também dá suporte a instantâneos point-in-time da configuração para que você possa inspecionar facilmente ou até mesmo reverter para valores de configuração anteriores. Os valores de configuração podem ser exportados de forma que uma cópia da configuração possa ser enviada com seu aplicativo, caso o serviço esteja inacessível quando o aplicativo estiver sendo iniciado.

Bibliotecas de cliente

Muitos desses recursos são expostos por meio de bibliotecas de cliente que se integram ao tempo de execução do aplicativo para facilitar a busca e o armazenamento em cache de valores, a atualização de valores na alteração e até mesmo o tratamento de interrupções transitórias do Serviço de Configuração de Aplicativo.

Runtime Biblioteca de cliente Notas Início Rápido
.NET Microsoft.Extensions.Configuration.AzureAppConfiguration Provedor de Microsoft.Extensions.Configuration Início rápido
ASP.NET Microsoft.Azure.AppConfiguration.AspNetCore Provedor de Microsoft.Extensions.Configuration Início rápido
Azure Functions no .NET Microsoft.Extensions.Configuration.AzureAppConfiguration Usado com extensões do Azure Function para dar suporte à configuração no Startup.cs Início rápido
.NET Framework Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration Construtor de configurações para System.Configuration Início rápido
Java Spring com.azure.spring > azure-spring-cloud-appconfiguration-config Suporta acesso ao Spring Framework via ConfigurationProperties Início rápido
Python azure.appconfiguration Fornece um AzureAppConfigurationClient Início rápido
JavaScript/Node.js @azure/app-configuration Fornece um AppConfigurationClient Início rápido

Além das bibliotecas de cliente, há também uma Ação GitHub de Sincronização de Configuração de Aplicativo do Azure e tarefas de Pull de Configuração de Aplicativo do Azure & Azure App Configuration Push do Azure DevOps para integrar etapas de configuração em seu processo de compilação.

Próximos passos