Marcas de funcionalidades
Gorjeta
Este conteúdo é um excerto do eBook, Architecting Cloud Native .NET Applications for Azure, disponível no .NET Docs ou como um PDF transferível gratuito que pode ser lido offline.
No capítulo 1, afirmamos que cloud native é muito sobre velocidade e agilidade. Os usuários esperam resposta rápida, recursos inovadores e zero tempo de inatividade. Feature flags
são uma técnica de implantação moderna que ajuda a aumentar a agilidade para aplicativos nativos da nuvem. Eles permitem que você implante novos recursos em um ambiente de produção, mas restringem sua disponibilidade. Com o movimento de um interruptor, 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 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 modernos nativos da nuvem, é 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 implementado gradualmente 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 de problema, evitando os riscos de uma reversão ou hotfix imediato.
- Desative um recurso opcional com alto consumo de recursos durante os períodos de pico de uso.
- Conduta
experimental feature releases
para pequenos segmentos de usuários para validar viabilidade e popularidade.
As bandeiras de recursos também promovem o trunk-based
desenvolvimento. É um modelo de ramificação de controle de origem em que os desenvolvedores colaboram em recursos em uma única ramificação. A abordagem minimiza o risco e a complexidade da fusão de um grande número de ramificações de recursos de longa execução. Os recursos ficam indisponíveis até serem ativados.
Implementando sinalizadores de recursos
Em sua essência, um sinalizador de recurso é uma referência a um simples decision object
. Ele retorna um estado booleano de on
ou off
. O sinalizador normalmente encapsula um bloco de código que encapsula um recurso 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
. A orientação recomendou manter as definições de configuração externas do código executável do aplicativo. Quando necessário, as configurações podem ser lidas a partir da fonte 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 do sinalizador em um repositório separado, você pode alterar o estado do sinalizador sem modificar e reimplantar o aplicativo.
A Configuração de Aplicativo 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. Você adiciona as bibliotecas de cliente de Configuração do Aplicativo ao seu aplicativo para habilitar a funcionalidade de sinalizador de recurso. Vários frameworks de linguagem de programação são suportados.
Os sinalizadores de recursos podem ser facilmente implementados em um serviço ASP.NET Core. A instalação das bibliotecas de Gerenciamento de Recursos do .NET e do provedor de Configuração de Aplicativo 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 em sua base de código.
Uma vez configurado em sua classe de inicialização, você pode adicionar a funcionalidade de sinalizador de recurso no nível de controlador, ação ou 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 recursos em um controlador e ação.
Se um sinalizador de recurso estiver desativado, o usuário receberá um código de status 404 (Não encontrado) sem corpo de resposta.
Os sinalizadores de recursos também podem ser injetados diretamente nas classes C#. A Figura 10-13 mostra a injeção do 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 Feature Management 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 de sinalizador por uma duração especificada. Podem garantir a imutabilidade dos Estados de bandeira durante uma escala de pedido. Eles também oferecem um Point-in-time snapshot
arquivo . Você pode reconstruir o histórico de qualquer valor-chave e fornecer seu valor passado a qualquer momento nos sete dias anteriores.