From dfcd62457b3ebc099cab5d19cc158824ba7f9e39 Mon Sep 17 00:00:00 2001 From: atancito Date: Tue, 4 Oct 2022 18:28:30 +0200 Subject: [PATCH] Circuit Breaker implemented --- config-data/user-service.yml | 31 ++++++++++++++++++- .../src/main/resources/application.yaml | 2 +- user-service/pom.xml | 14 +++++++++ .../controller/UserController.java | 28 +++++++++++++++++ 4 files changed, 73 insertions(+), 2 deletions(-) diff --git a/config-data/user-service.yml b/config-data/user-service.yml index 75deb71..35f297e 100644 --- a/config-data/user-service.yml +++ b/config-data/user-service.yml @@ -7,4 +7,33 @@ eureka: service-url: default-zone: http://localhost:8761/eureka instance: - instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} \ No newline at end of file + instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} +resilience4j.circuitbreaker: + instances: + carsCB: + registerHealthIndicator: true + slidingWindowSize: 10 + permittedNumberOfCallsInHalfOpenState: 3 + slidingWindowType: TIME_BASED + minimumNumberOfCalls: 4 + waitDurationInOpenState: 5s + failureRateThreshold: 50 + eventConsumerBufferSize: 10 + bikesCB: + registerHealthIndicator: true + slidingWindowSize: 10 + permittedNumberOfCallsInHalfOpenState: 3 + slidingWindowType: TIME_BASED + minimumNumberOfCalls: 4 + waitDurationInOpenState: 5s + failureRateThreshold: 50 + eventConsumerBufferSize: 10 + allCB: + registerHealthIndicator: true + slidingWindowSize: 10 + permittedNumberOfCallsInHalfOpenState: 3 + slidingWindowType: TIME_BASED + minimumNumberOfCalls: 4 + waitDurationInOpenState: 5s + failureRateThreshold: 50 + eventConsumerBufferSize: 10 \ No newline at end of file diff --git a/config-service/src/main/resources/application.yaml b/config-service/src/main/resources/application.yaml index 990a737..ba678fb 100644 --- a/config-service/src/main/resources/application.yaml +++ b/config-service/src/main/resources/application.yaml @@ -5,7 +5,7 @@ spring: config: server: git: - defaultLabel: gateway + defaultLabel: circuit-breaker uri: https://git.gzcode.xyz/atancito/MicroservicesTutorial searchPaths: config-data application: diff --git a/user-service/pom.xml b/user-service/pom.xml index 0fd4c7e..77aee29 100644 --- a/user-service/pom.xml +++ b/user-service/pom.xml @@ -57,6 +57,20 @@ org.springframework.cloud spring-cloud-starter-netflix-eureka-client + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.cloud + spring-cloud-starter-circuitbreaker-resilience4j + + + org.springframework.boot + spring-boot-starter-aop + 2.7.4 + + diff --git a/user-service/src/main/java/com/example/userservice/controller/UserController.java b/user-service/src/main/java/com/example/userservice/controller/UserController.java index feece86..c4452f8 100644 --- a/user-service/src/main/java/com/example/userservice/controller/UserController.java +++ b/user-service/src/main/java/com/example/userservice/controller/UserController.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -19,6 +20,8 @@ import com.example.userservice.model.Car; import com.example.userservice.repository.UserRepository; import com.example.userservice.service.UserService; +import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker; + @RestController @RequestMapping("/users") public class UserController { @@ -52,6 +55,7 @@ public class UserController { return ResponseEntity.ok(userService.save(user)); } + @CircuitBreaker(name = "carsCB", fallbackMethod = "fallbackGetCars") @GetMapping("/{userId}/cars") public ResponseEntity> getCars(@PathVariable("userId") int userId) { User user = userService.getUserById(userId); @@ -63,6 +67,11 @@ public class UserController { } } + private ResponseEntity> fallbackGetCars(@PathVariable("userId") int userId, Exception e) { + return new ResponseEntity("El usuairo " + userId + " tiene los coches en el taller.", HttpStatus.OK); + } + + @CircuitBreaker(name = "bikesCB", fallbackMethod = "fallbackGetBikes") @GetMapping("/{userId}/bikes") public ResponseEntity> getBikes(@PathVariable("userId") int userId) { User user = userService.getUserById(userId); @@ -74,6 +83,11 @@ public class UserController { } } + private ResponseEntity> fallbackGetBikes(@PathVariable("userId") int userId, Exception e) { + return new ResponseEntity("El usuairo " + userId + " tiene las motos en el taller.", HttpStatus.OK); + } + + @CircuitBreaker(name = "carsCB", fallbackMethod = "fallbackSaveCar") @PostMapping("/savecar/{userId}") public ResponseEntity saveCar(@PathVariable("userId") int userId, @RequestBody Car car) { User user = userService.getUserById(userId); @@ -86,6 +100,11 @@ public class UserController { } + private ResponseEntity fallbackSaveCar(@PathVariable("userId") int userId, @RequestBody Car car, Exception e) { + return new ResponseEntity("El usuairo " + userId + " no tiene dinero para comprar un coche.", HttpStatus.OK); + } + + @CircuitBreaker(name = "bikesCB", fallbackMethod = "fallbackSaveBike") @PostMapping("/savebike/{userId}") public ResponseEntity saveBike(@PathVariable("userId") int userId, @RequestBody Bike bike) { User user = userService.getUserById(userId); @@ -97,10 +116,19 @@ public class UserController { } } + private ResponseEntity> fallbackSaveBike(@PathVariable("userId") int userId, @RequestBody Bike bike , Exception e) { + return new ResponseEntity("El usuairo " + userId + " no tiene dinero para comprar una moto.", HttpStatus.OK); + } + + @CircuitBreaker(name = "allCB", fallbackMethod = "fallbackGetAll") @GetMapping("/getAll/{userId}") public ResponseEntity> getAllVehicules(@PathVariable("userId") int userId) { Map result = userService.getUserAndVehicules(userId); return ResponseEntity.ok(result); } + + public ResponseEntity> fallbackGetAll(@PathVariable("userId") int userId) { + return new ResponseEntity("El usuairo " + userId + " tiene los vehĂ­culos en el taller.", HttpStatus.OK); + } }