Merge branch 'master' of https://github.com/haerong22/Study
This commit is contained in:
@@ -32,6 +32,7 @@ dependencies {
|
|||||||
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
|
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
|
||||||
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'
|
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'
|
||||||
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
|
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
|
||||||
|
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j'
|
||||||
|
|
||||||
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
|
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package com.example.userservice.config;
|
||||||
|
|
||||||
|
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
|
||||||
|
import io.github.resilience4j.timelimiter.TimeLimiterConfig;
|
||||||
|
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory;
|
||||||
|
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder;
|
||||||
|
import org.springframework.cloud.client.circuitbreaker.Customizer;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class Resilience4jConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {
|
||||||
|
|
||||||
|
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
|
||||||
|
.failureRateThreshold(4)
|
||||||
|
.waitDurationInOpenState(Duration.ofMillis(1000))
|
||||||
|
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
|
||||||
|
.slidingWindowSize(2)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
|
||||||
|
.timeoutDuration(Duration.ofSeconds(4))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
return factory -> factory.configureDefault(
|
||||||
|
id -> new Resilience4JConfigBuilder(id)
|
||||||
|
.timeLimiterConfig(timeLimiterConfig)
|
||||||
|
.circuitBreakerConfig(circuitBreakerConfig)
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,6 +9,8 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.modelmapper.ModelMapper;
|
import org.modelmapper.ModelMapper;
|
||||||
import org.modelmapper.convention.MatchingStrategies;
|
import org.modelmapper.convention.MatchingStrategies;
|
||||||
|
import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
|
||||||
|
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
|
||||||
import org.springframework.core.env.Environment;
|
import org.springframework.core.env.Environment;
|
||||||
import org.springframework.security.core.userdetails.User;
|
import org.springframework.security.core.userdetails.User;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
@@ -31,6 +33,7 @@ public class UserServiceImpl implements UserService {
|
|||||||
private final Environment env;
|
private final Environment env;
|
||||||
private final RestTemplate restTemplate;
|
private final RestTemplate restTemplate;
|
||||||
private final OrderServiceClient orderServiceClient;
|
private final OrderServiceClient orderServiceClient;
|
||||||
|
private final CircuitBreakerFactory circuitBreakerFactory;
|
||||||
|
|
||||||
private final ModelMapper mapper = new ModelMapper();
|
private final ModelMapper mapper = new ModelMapper();
|
||||||
|
|
||||||
@@ -66,7 +69,16 @@ public class UserServiceImpl implements UserService {
|
|||||||
/**
|
/**
|
||||||
* feign client
|
* feign client
|
||||||
*/
|
*/
|
||||||
List<ResponseOrder> orderList = orderServiceClient.getOrders(userId);
|
// List<ResponseOrder> orderList = orderServiceClient.getOrders(userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* circuit breaker
|
||||||
|
*/
|
||||||
|
CircuitBreaker circuitbreaker = circuitBreakerFactory.create("circuitbreaker");
|
||||||
|
List<ResponseOrder> orderList = circuitbreaker.run(
|
||||||
|
() -> orderServiceClient.getOrders(userId),
|
||||||
|
throwable -> new ArrayList<>()
|
||||||
|
);
|
||||||
|
|
||||||
userDto.setOrders(orderList);
|
userDto.setOrders(orderList);
|
||||||
return userDto;
|
return userDto;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ spring:
|
|||||||
|
|
||||||
eureka:
|
eureka:
|
||||||
instance:
|
instance:
|
||||||
|
hostname: localhost
|
||||||
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
|
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
|
||||||
client:
|
client:
|
||||||
register-with-eureka: true
|
register-with-eureka: true
|
||||||
|
|||||||
Reference in New Issue
Block a user