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