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.
Dica
Esse conteúdo é um trecho do eBook, Architecting Cloud Native .NET Applications for Azure, disponível no .NET Docs ou como um PDF para download gratuito que pode ser lido offline.
No capítulo 1, afirmamos que a nuvem nativa é muito focada em velocidade e agilidade. Os usuários esperam capacidade de resposta rápida, recursos inovadores e tempo de inatividade zero. Feature flags são uma técnica de implantação moderna que ajuda a aumentar a agilidade para aplicativos nativos de nuvem. Eles permitem que você implante novos recursos em um ambiente de produção, mas restrinja sua disponibilidade. Com o movimento de um comutador, você pode ativar um novo recurso para usuários específicos sem reiniciar o aplicativo ou implantar um novo código. Eles separam o lançamento de novos recursos de sua implementação de código.
Os sinalizadores de recursos são criados com base na lógica condicional que controla a visibilidade da funcionalidade para os usuários em tempo de execução. Em sistemas nativos de nuvem modernos, é comum implantar novos recursos em produção antecipadamente, mas testá-los com um público limitado. À medida que a confiança aumenta, o recurso pode ser implantado incrementalmente para públicos mais amplos.
Outros casos de uso para sinalizadores de recursos incluem:
- Restrinja a funcionalidade premium a grupos de clientes específicos dispostos a pagar taxas de assinatura mais altas.
- Estabilize um sistema desativando rapidamente um recurso problemático, evitando os riscos de uma reversão ou de um hotfix imediato.
- Desabilite um recurso opcional com alto consumo de recursos durante os períodos de pico de uso.
- Conduza
experimental feature releasesa segmentos de usuários pequenos para validar a viabilidade e a popularidade.
Sinalizadores de recursos também promovem o trunk-based desenvolvimento. É um modelo de ramificação de controle do código-fonte em que os desenvolvedores colaboram em funcionalidades em um único ramo. A abordagem minimiza o risco e a complexidade da mesclagem de grandes números de branches de recursos de execução longa. Os recursos ficam indisponíveis até serem ativados.
Implementando sinalizadores de recursos
Em seu núcleo, um sinalizador de recurso é uma referência a um simples decision object. Retorna um estado booliano de on ou off. O sinalizador normalmente encapsula um bloco de código que encapsula uma funcionalidade de recurso. O estado do sinalizador determina se esse bloco de código é executado para um determinado usuário. A Figura 10-11 mostra a implementação.
if (featureFlag) {
// Run this code block if the featureFlag value is true
} else {
// Run this code block if the featureFlag value is false
}
Figura 10-11 – Implementação de sinalizador de recurso simples.
Observe como essa abordagem separa a lógica de decisão do código do recurso.
No capítulo 1, discutimos o Twelve-Factor App. As diretrizes recomendavam manter as configurações de configuração fora do código executável do aplicativo. Quando necessário, as configurações podem ser lidas da origem externa. Os valores de configuração do sinalizador de recurso também devem ser independentes de sua base de código. Ao externalizar a configuração de sinalizador em um repositório separado, você pode alterar o estado do sinalizador sem modificar e reimplantar o aplicativo.
A Configuração de Aplicativos do Azure fornece um repositório centralizado para sinalizadores de recursos. Com ele, você define diferentes tipos de sinalizadores de recursos e manipula seus estados de forma rápida e confiante. Adicione as bibliotecas de cliente da Configuração de Aplicativos ao aplicativo para habilitar a funcionalidade do sinalizador de recurso. Há suporte para várias estruturas de linguagem de programação.
Os sinalizadores de recursos podem ser facilmente implementados em um serviço do ASP.NET Core. A instalação das bibliotecas de Gerenciamento de Recursos do .NET e do provedor de Configuração de Aplicativos permite que você adicione declarativamente sinalizadores de recursos ao seu código. Eles habilitam FeatureGate atributos para que você não precise escrever manualmente instruções 'if' no seu código.
Depois de configurado em sua classe de inicialização, você pode adicionar a funcionalidade do sinalizador de recurso no nível do controlador, da ação ou do middleware. A Figura 10-12 apresenta a implementação do controlador e da ação:
[FeatureGate(MyFeatureFlags.FeatureA)]
public class ProductController : Controller
{
...
}
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult UpdateProductStatus()
{
return ObjectResult(ProductDto);
}
Figura 10-12 – Implementação do sinalizador de recurso em um controlador e ação.
Se um sinalizador de recurso estiver desabilitado, o usuário receberá um código de status 404 (Não Encontrado) sem corpo de resposta.
Flags de funcionalidades também podem ser injetadas diretamente em classes C#. A Figura 10-13 mostra a injeção de sinalizador de recurso:
public class ProductController : Controller
{
private readonly IFeatureManager _featureManager;
public ProductController(IFeatureManager featureManager)
{
_featureManager = featureManager;
}
}
Figura 10-13 – Injeção de flag de funcionalidade em uma classe.
As bibliotecas do Gerenciamento de Recursos gerenciam o ciclo de vida do sinalizador de recursos nos bastidores. Por exemplo, para minimizar o elevado número de chamadas ao repositório de configuração, as bibliotecas armazenam em cache os estados dos sinalizadores por uma duração especificada. Eles podem garantir a imutabilidade dos estados de sinalizador durante uma chamada de solicitação. Eles também oferecem um Point-in-time snapshot. Você pode reconstruir o histórico de qualquer chave-valor e fornecer seu valor passado a qualquer momento nos sete dias anteriores.