Compartilhar via


Sinalizadores de recurso

Dica

Esse conteúdo é um trecho do livro eletrônico, para Projetar os Aplicativos .NET nativos de nuvem para o Azure, disponível no .NET Docs ou como um PDF para download gratuito que pode ser lido offline.

Cloud Native .NET apps for Azure eBook cover thumbnail.

No capítulo 1, afirmamos que a nuvem nativa é muito sobre 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 implantar novos recursos em um ambiente de produção, mas restringem 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 a versão de novos recursos de sua implantaçã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 distribuído incrementalmente para públicos mais amplos.

Outros casos de uso para sinalizadores de recursos incluem:

  • Restringir a funcionalidade Premium a grupos de clientes específicos dispostos a pagar valores de assinatura mais altas.
  • Estabilizar um sistema desativando rapidamente um recurso de problema, evitando os riscos de uma reversão ou hotfix imediato.
  • Desabilitar um recurso opcional com alto consumo de recursos durante períodos de pico de uso.
  • Conduzir experimental feature releases para 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 recursos em uma única ramificação. 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. Ele 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 externas 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 foi projetada para ser um repositório centralizado de sinalizadores de recurso. Com ele, você define diferentes tipos de sinalizadores de recurso e manipula seus estados de maneira rápida e segura. 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 atributos FeatureGate para que você não precise escrever manualmente se as instruções estiverem na base de 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.

Sinalizadores de recursos também podem ser injetados diretamente nas 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 sinalizador de recurso 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 alto número de chamadas para o repositório de configuração, as bibliotecas armazenam em cache estados 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 anterior a qualquer momento nos sete dias anteriores.