Skip to content

Commit 6653806

Browse files
author
Абрамов Александр
committed
resilience4j
1 parent 05033d0 commit 6653806

File tree

5 files changed

+51
-4
lines changed

5 files changed

+51
-4
lines changed

inventory-service/src/main/java/com/alllexe/inventoryservice/service/InventoryService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,26 @@
33
import com.alllexe.inventoryservice.dto.InventoryResponse;
44
import com.alllexe.inventoryservice.repository.InventoryRepository;
55
import lombok.RequiredArgsConstructor;
6+
import lombok.SneakyThrows;
7+
import lombok.extern.slf4j.Slf4j;
68
import org.springframework.stereotype.Service;
79
import org.springframework.transaction.annotation.Transactional;
810

911
import java.util.List;
1012

1113
@Service
1214
@RequiredArgsConstructor
15+
@Slf4j
1316
public class InventoryService {
1417

1518
private final InventoryRepository inventoryRepository;
1619

1720
@Transactional(readOnly = true)
21+
@SneakyThrows
1822
public List<InventoryResponse> isInStock(List<String> skuCodes) {
23+
// log.info("Wait started");
24+
// Thread.sleep(10000);
25+
// log.info("Wait ended");
1926
return inventoryRepository.findBySkuCodeIn(skuCodes).stream()
2027
.map(inventory -> InventoryResponse.builder()
2128
.skuCode(inventory.getSkuCode())

order-service/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ repositories {
1818

1919
dependencies {
2020
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
21+
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j'
22+
implementation 'org.springframework.boot:spring-boot-starter-actuator'
2123
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2224
implementation 'org.springframework.boot:spring-boot-starter-web'
2325
implementation 'org.springframework.boot:spring-boot-starter-webflux'

order-service/src/main/java/com/alllexe/orderservice/controller/OrderController.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import com.alllexe.orderservice.dto.OrderRequest;
44
import com.alllexe.orderservice.service.OrderService;
5+
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
6+
import io.github.resilience4j.retry.annotation.Retry;
7+
import io.github.resilience4j.timelimiter.annotation.TimeLimiter;
58
import lombok.RequiredArgsConstructor;
69
import org.springframework.http.HttpStatus;
710
import org.springframework.web.bind.annotation.PostMapping;
@@ -10,6 +13,8 @@
1013
import org.springframework.web.bind.annotation.ResponseStatus;
1114
import org.springframework.web.bind.annotation.RestController;
1215

16+
import java.util.concurrent.CompletableFuture;
17+
1318
@RestController
1419
@RequestMapping("/api/order")
1520
@RequiredArgsConstructor
@@ -19,8 +24,14 @@ public class OrderController {
1924

2025
@PostMapping
2126
@ResponseStatus(HttpStatus.CREATED)
22-
public String placeOrder(@RequestBody OrderRequest orderRequest) {
23-
orderService.placeOrder(orderRequest);
24-
return "Order placed successfully";
27+
@CircuitBreaker(name = "inventory", fallbackMethod = "fallbackMethod")
28+
@TimeLimiter(name = "inventory")
29+
@Retry(name = "inventory")
30+
public CompletableFuture<String> placeOrder(@RequestBody OrderRequest orderRequest) {
31+
return CompletableFuture.supplyAsync(() -> orderService.placeOrder(orderRequest));
32+
}
33+
34+
public CompletableFuture<String> fallbackMethod(OrderRequest orderRequest, RuntimeException runtimeException) {
35+
return CompletableFuture.supplyAsync(() ->"Oops! Something went wrong. Please order after some time!");
2536
}
2637
}

order-service/src/main/java/com/alllexe/orderservice/service/OrderService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class OrderService {
2323
private final WebClient.Builder webClientBuilder;
2424

2525
@Transactional
26-
public void placeOrder(OrderRequest orderRequest) {
26+
public String placeOrder(OrderRequest orderRequest) {
2727
Order order = new Order();
2828
order.setOrderNumber(UUID.randomUUID().toString());
2929
List<OrderLineItems> orderLineItems = orderRequest.getOrderLineItemsDtoList()
@@ -50,6 +50,7 @@ public void placeOrder(OrderRequest orderRequest) {
5050

5151
if (allProductsInStock) {
5252
orderRepository.save(order);
53+
return "Order placed successfully";
5354
} else {
5455
throw new IllegalArgumentException("Product is not in stock");
5556
}

order-service/src/main/resources/application.properties

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,29 @@ spring.datasource.password=postgres
99
spring.jpa.hibernate.ddl-auto=update
1010

1111
eureka.client.service-url.defaultZone=http://eureka:password@localhost:8761/eureka
12+
13+
management.health.circuitbreakers.enabled=true
14+
management.endpoints.web.exposure.include=*
15+
management.endpoint.health.show-details=always
16+
17+
#Resilinece4j Properties
18+
resilience4j.circuitbreaker.instances.inventory.registerHealthIndicator=true
19+
resilience4j.circuitbreaker.instances.inventory.event-consumer-buffer-size=10
20+
resilience4j.circuitbreaker.instances.inventory.slidingWindowType=COUNT_BASED
21+
resilience4j.circuitbreaker.instances.inventory.slidingWindowSize=5
22+
resilience4j.circuitbreaker.instances.inventory.failureRateThreshold=50
23+
resilience4j.circuitbreaker.instances.inventory.waitDurationInOpenState=5s
24+
resilience4j.circuitbreaker.instances.inventory.permittedNumberOfCallsInHalfOpenState=3
25+
resilience4j.circuitbreaker.instances.inventory.automaticTransitionFromOpenToHalfOpenEnabled=true
26+
27+
#Resilience4J Timeout Properties
28+
resilience4j.timelimiter.instances.inventory.timeout-duration=3s
29+
30+
#Resilience4J Retry Properties
31+
resilience4j.retry.instances.inventory.max-attempts=3
32+
resilience4j.retry.instances.inventory.wait-duration=5s
33+
34+
#Spring Cloud Stream Kafka Properties
35+
spring.cloud.stream.output-bindings=notificationEventSupplier
36+
spring.cloud.stream.bindings.notificationEventSupplier-out-0.destination=notification-events
37+
spring.sleuth.integration.enabled=true

0 commit comments

Comments
 (0)