I am building a microservices application using java spring boot. Currently, there are 4 services: Discovery server, api-gateway, portfolio-service, market-data-service. I want to make use of the Circuit Breaker for fault tolerant. However when I create a circuit breaker for this getPortfolio() method and set up the fallbackForGetPortfolio method, this fall back method is not being called.
package com.personalfinanceapplication.portfolioservice.controller;
import com.personalfinanceapplication.portfolioservice.dto.PortfolioRequest;
import com.personalfinanceapplication.portfolioservice.dto.PortfolioResponse;
import com.personalfinanceapplication.portfolioservice.model.Portfolio;
import com.personalfinanceapplication.portfolioservice.service.PortfolioService;
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import io.github.resilience4j.retry.annotation.Retry;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("api/portfolio")
@RequiredArgsConstructor
public class PortfolioController {
private final PortfolioService portfolioService;
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public void createPortfolio(@RequestBody PortfolioRequest portfolioRequest){
portfolioService.createPortfolio(portfolioRequest);
}
@GetMapping
@ResponseStatus(HttpStatus.OK)
public List<PortfolioResponse> getAllPortfolios(){
return portfolioService.getAllPortfolios();
}
@GetMapping("/{pid}")
@ResponseStatus(HttpStatus.OK)
@CircuitBreaker(name="portfolio-service", fallbackMethod = "fallbackForGetPortfolio")
public Portfolio getPortfolio(@PathVariable String pid){
return portfolioService.getPortfolio(pid);
}
public String fallbackForGetPortfolio(String pid, Exception exception){
// return a default Portfolio object or a cached value
return "oops, service is down";
}
@PostMapping("/{pid}/{asset}/{quantity}")
@ResponseStatus(HttpStatus.CREATED)
public void addNewAssetToPortfolio(@PathVariable String pid, @PathVariable String asset, @PathVariable int quantity){
portfolioService.addNewAssetToPortfolio(pid, asset, quantity);
}
}
This is my application.properties file
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
spring.application.name=portfolio-service
server.port=8081
resilience4j.circuitbreaker.instances.portfolio-service.register-health-indicator=true
resilience4j.circuitbreaker.instances.portfolio-service.sliding-window-type=count_based
resilience4j.circuitbreaker.instances.portfolio-service.sliding-window-size=5
resilience4j.circuitbreaker.instances.portfolio-service.failure-rate-threshold=40
resilience4j.circuitbreaker.instances.portfolio-service.slow-call-rate-threshold=40
resilience4j.circuitbreaker.instances.portfolio-service.permitted-number-of-calls-in-half-open-state=1
resilience4j.circuitbreaker.instances.portfolio-service.max-wait-duration-in-half-open-state=10s
resilience4j.circuitbreaker.instances.portfolio-service.wait-duration-in-open-state=10s
resilience4j.circuitbreaker.instances.portfolio-service.slow-call-duration-threshold=2s
resilience4j.circuitbreaker.instances.portfolio-service.writable-stack-trace-enabled=true
resilience4j.circuitbreaker.instances.portfolio-service.automatic-transition-from-open-to-half-open-enabled=true
resilience4j.circuitbreaker.instances.portfolio-service.base-config=shared