From ac1cafa548d40edabc546fec247e759ae15eca4c Mon Sep 17 00:00:00 2001 From: kamothi Date: Fri, 20 Sep 2024 21:28:52 +0900 Subject: [PATCH 1/5] =?UTF-8?q?fix:=20=EC=84=A4=EC=A0=95=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f1582e6..da905b4 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -78,6 +78,9 @@ management: web: exposure: include: prometheus + endpoint: + prometheus: + enabled: true token: expiration_time: 86400000 From 9b2e406194dd51d2ac0f4c9371cc46cbe0a98ac7 Mon Sep 17 00:00:00 2001 From: kamothi Date: Fri, 20 Sep 2024 23:15:45 +0900 Subject: [PATCH 2/5] =?UTF-8?q?test:=20test=EC=9A=A9=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ku/user/user/service/TestService.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/ku/user/user/service/TestService.java diff --git a/src/main/java/ku/user/user/service/TestService.java b/src/main/java/ku/user/user/service/TestService.java new file mode 100644 index 0000000..a14a331 --- /dev/null +++ b/src/main/java/ku/user/user/service/TestService.java @@ -0,0 +1,22 @@ +package ku.user.user.service; + +import ku.user.client.GameServiceClient; +import lombok.RequiredArgsConstructor; +import org.springframework.cloud.client.circuitbreaker.CircuitBreaker; +import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class TestService { + private final GameServiceClient gameServiceClient; + private final CircuitBreakerFactory circuitBreakerFactory; + + + public String getResult(String memberId) { + CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitBreaker"); + String result = circuitBreaker.run(()->gameServiceClient.getGameResults("1234"), throwable -> "1234"); + return result; + } + +} From 7dc408fd02ee024e4bb73eab8bdbb46a71c1a118 Mon Sep 17 00:00:00 2001 From: kamothi Date: Fri, 20 Sep 2024 23:16:10 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20circuitbreaker=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index da905b4..b817fac 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -85,3 +85,11 @@ management: token: expiration_time: 86400000 secret: ${SECRET} + +resilience4j: + circuitbreaker: + instances: + gameService: + slidingWindowSize: 10 # 설정할 호출 수 + failureRateThreshold: 50 # 실패율 50% 이상 + waitDurationInOpenState: 30s # Open 상태에서 대기 시간 \ No newline at end of file From f512792bdcc784836bc20f1fe8a5b528be54ea86 Mon Sep 17 00:00:00 2001 From: kamothi Date: Fri, 20 Sep 2024 23:18:02 +0900 Subject: [PATCH 4/5] =?UTF-8?q?test:=20feign=20=EB=B0=8F=20=EC=84=9C?= =?UTF-8?q?=ED=82=B7=EB=B8=8C=EB=A0=88=EC=9D=B4=EC=BB=A4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ku/user/client/GameServiceClientTest.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/test/java/ku/user/client/GameServiceClientTest.java diff --git a/src/test/java/ku/user/client/GameServiceClientTest.java b/src/test/java/ku/user/client/GameServiceClientTest.java new file mode 100644 index 0000000..9e39036 --- /dev/null +++ b/src/test/java/ku/user/client/GameServiceClientTest.java @@ -0,0 +1,61 @@ +package ku.user.client; + +import ku.user.user.service.TestService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.web.client.RestClientException; + + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; + +@SpringBootTest(properties = "spring.profiles.active=local") +class GameServiceClientTest { + + @MockBean + private GameServiceClient gameServiceClient; + + @Autowired + private TestService testService; + + @Test + void 요청_시간이_초과되면_예외를_발생시킨다() { + // Given: 예외를 던지도록 Mock 설정 + given(gameServiceClient.getGameResults(anyString())) + .willThrow(new RestClientException("Timeout")); + + // When & Then + try { + gameServiceClient.getGameResults("1234"); + } catch (RestClientException e) { + assertThat(e.getMessage()).contains("Timeout"); + } + } + + @Test + void CircuitBreaker가_OPEN일때_fallback이_호출된다() { + // Given + given(gameServiceClient.getGameResults(anyString())) + .willThrow(new RuntimeException("Service unavailable")); + + // When + for (int i = 0; i < 10; i++) { + try { + testService.getResult("testUser"); + } catch (RuntimeException e) { + // 예외를 무시하고 계속 호출 + } + } + + // Then + String result = testService.getResult("testUser"); + + assertThat(result).isEqualTo("1234"); // Fallback 결과를 확인 + } + + + +} From 494cec34b82bb4e5a032fd86c95cda12aef012bb Mon Sep 17 00:00:00 2001 From: kamothi Date: Sat, 21 Sep 2024 13:31:55 +0900 Subject: [PATCH 5/5] feat: fallbcak test --- .../java/ku/user/client/GameServiceClientTest.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/test/java/ku/user/client/GameServiceClientTest.java b/src/test/java/ku/user/client/GameServiceClientTest.java index 9e39036..df82de2 100644 --- a/src/test/java/ku/user/client/GameServiceClientTest.java +++ b/src/test/java/ku/user/client/GameServiceClientTest.java @@ -36,23 +36,16 @@ class GameServiceClientTest { } @Test - void CircuitBreaker가_OPEN일때_fallback이_호출된다() { + void CircuitBreaker가_실패_fallback이_호출된다() { // Given given(gameServiceClient.getGameResults(anyString())) .willThrow(new RuntimeException("Service unavailable")); - // When - for (int i = 0; i < 10; i++) { - try { - testService.getResult("testUser"); - } catch (RuntimeException e) { - // 예외를 무시하고 계속 호출 - } - } - // Then + // When String result = testService.getResult("testUser"); + // Then assertThat(result).isEqualTo("1234"); // Fallback 결과를 확인 }