Objetivo principal: Entender o conceito de circuitbreaker e implementá-lo utilizando Resilience4j e Spring Boot.
Obs: Produtos e avaliações são salvos no banco de dados MariaDB.
docker-compose up
Vai criar um container e subir a imagem do banco de dados MariaDB, esse banco vai estar exposto na porta 3307.
- Rodar o ProdutosApplication
- Rodar a AvalicaoApplication
- Cadastrar alguns produtos e algumas avaliações
- Parar a aplicação de avaliação
- Testar com ids de produtos diferentes a request 3
- Alguns casos vão cair no cache e em outros será retornado o erro 500
- Observar os logs no console informando que o circuitbreaker está aberto, fechado ou meio-aberto No application.properties foram definidas as seguintes propriedades:
resilience4j.circuitbreaker.instances.avaliacoesProdutoCB.baseConfig=default
resilience4j.circuitbreaker.configs.default.minimumNumberOfCalls=4
resilience4j.circuitbreaker.configs.default.slidingWindowSize=8
Elas informam que quando 4 chamadas forem feitas, através do método que possui o
circuitbreaker annotation 'avaliacoesProdutoCB', e essas chamadas não obtiverem resposta da outra API o circuitbreaker será fechado.
O método que chama a API de avaliações está na classe 'AvaliacoesDoProdutoService.java' e o método é o getAllAvaliacoes.
@CircuitBreaker(name="avaliacoesProdutoCB", fallbackMethod = "getAllAvaliacoesNoCache")
public List<Avaliacao> getAllAvaliacoes(Long idProduto) throws Exception {
//....
}
curl --request POST \
--url http://localhost:8088/produto \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/8.3.0' \
--data '{
"nome":"Produto 1"
}'
- Cadastrar avaliação
curl --request POST \
--url http://localhost:8089/avaliacoes \
--header 'Content-Type: application/json' \
--header 'User-Agent: insomnia/8.3.0' \
--data '{
"nota": 2,
"descricao": "descricao aqui",
"idProduto": 1
}'
- Listar todas as avaliações do produto de id=1
curl --request GET \
--url http://localhost:8088/produtos/1/avaliacoes \
--header 'User-Agent: insomnia/8.3.0'
- Para a dependência do Resilience4j: https://mvnrepository.com/artifact/io.github.resilience4j/resilience4j-spring-boot2
- Para a dependência do actuator: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator
- Para a dependência do Spring AOP: https://mvnrepository.com/artifact/org.springframework/spring-aop