0

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

0 Answers0