Autores: Walter Silvestre Coan e Renato Groffe
Objetivo: demonstrar a implementação da técnica de Circuit Breaker em uma aplicação que recebe requisições REST e persiste os dados em uma fila no Azure Storage Account.
- appsettings.json: Arquivo de configuração da aplicação, que deve possuir a connection string para a Storage Account, o nome da fila que será criada, e as configurações para o ambiente de teste utilizando a técnica de Monkey Caos.
"ConnectionStrings": { "StorageConnectionString": "UseDevelopmentStorage=true" }, "QueueName": "queuecourseregistry", "MonkeyCaosEnable": false, "MonkeyCaosInjectionRate": 0.5
- Program: Classe main da aplicação no formato Top-level statements. Esse arquivo possui uma public partial class para permitir que a classe WebApplicationFactory consiga encontrar o Assembly ao simular a aplicação em memória para teste.
- CourseRegistration: Classe que representa o objeto model da aplicação.
- CourseRegistrationController : Classe que implementa o controller da REST API, recebe pelo construtor uma instância da class que implementa a interface ICircuitBreaker e outras dependências como ILogger. No método Post, executa a cadeia de políticas do Polly que protegem o código que realiza a conexão com a Queue Storage Account para publicar a mensagem.
- CircuitBreaker: Classe que cria a política de Circuit Breaker do Polly dentro de um PolicyWrap. Adiciona também a Bulkhead Isolation que limita o número de chamadas paralelas do código.
- APIApplication: Classe que utiliza a WebApplicationFactory para criar uma instância da aplicação em memória para realizar os testes de integração. Substitui a implementação de ICircuitBreaker de CircuitBreaker por CircuitBreakerWithMonkeyCaos. Necessita que a classe Program possua uma classe parcial publica e que o projeto possua um arquivo .sln para definir corretamente o diretório base da aplicação.
- CircuitBreakerWithMonkeyCaos: Classe que implementa a interface ICircuitBreaker, e incluir na PolicyWrap a MonkeyPolicy.InjectExceptionAsync do projeto Simmy, para injetar falhas na aplicação considerando um percentual configurado no arquivo appsettings.json
- MonkeyCaosTest: Classe que implementa um teste de integração usando o xUnit. Utiliza a instância da aplicação através da classe APIApplication, e realiza request para o método da REST API validando o Status Code de retorno.
- Pacote XUnitLogger: implementação pública de um exemplo de instância do padrão ILogger permitindo que os logs sejam impressos no console da execução do xUnit.
azurite --silent --location c:\azurite --debug c:\azurite\debug.log
https://github.com/App-vNext/Polly https://github.com/Polly-Contrib/Simmy
"Azure.Core" Version="1.22.0" "Azure.Storage.Common" Version="12.10.0" "Azure.Storage.Queues" Version="12.9.0" "Microsoft.AspNetCore.Hosting" Version="2.2.7" "Microsoft.AspNetCore.Mvc.Testing" Version="6.0.3 "Microsoft.AspNetCore.TestHost" Version="6.0.3" "Microsoft.NET.Test.Sdk" Version="17.1.0" "Polly" Version="7.2.3" "Polly.Contrib.Simmy" Version="0.3.0" "Swashbuckle.AspNetCore" Version="6.3.0" "xunit" Version="2.4.1" "xunit.runner.visualstudio" Version="2.4.3"
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "StorageConnectionString": "UseDevelopmentStorage=true" }, "QueueName": "queuecourseregistry" }
Fonte: https://www.hanselman.com/blog/minimal-apis-in-net-6-but-where-are-the-unit-tests
- Criar o arquivo .sln para o projeto