우리는 마이크로서비스에서 발생할 수 있는 일반적인 문제, 즉 특정 서비스가 느리게 응답하거나 전혀 응답하지 않는 상황에 대해 고려해봐야 합니다.
이 문제를 해결하지 않으면 서버 리소스(스레드, 메모리 등)가 불필요하게 오래 대기하게 되어 성능 저하를 초래할 수 있습니다.
이 문제를 해결하기 위해 Spring Cloud Gateway에서 타임아웃 설정을 사용하여 일정 시간 이후 응답을 기다리지 않도록 설정할 수 있습니다.
먼저, LoansController
에서 contact-info
API를 호출하여 응답을 지연시키는 상황을 만듭니다. 이 시점에 Postman에서 요청을 보내면 응답이 오지 않고 계속 대기 상태가 됩니다. 이는 리소스가 불필요하게 대기하면서 서버 성능이 저하될 수 있는 문제를 시뮬레이션하는 것입니다.
이와 같은 문제를 해결하기 위해서는 타임아웃을 설정해야 합니다. 타임아웃을 설정함으로써 특정 시간 이상 응답을 기다리지 않고, 일정 시간이 지나면 요청을 중단하거나 폴백 메커니즘을 사용하는 등 추가적인 조치를 취할 수 있습니다.
Spring Cloud Gateway에서 타임아웃을 설정하는 방법을 알아보기 위해 공식 문서를 참조합니다. 공식 문서에서 timeout
이라는 키워드로 검색하여 Http timeouts configuration
섹션을 찾습니다. 이 섹션에서는 연결 타임아웃과 응답 타임아웃을 설정하는 방법을 설명하고 있습니다.
타임아웃을 설정하는 방법은 매우 간단합니다. application.yml
파일에 관련 속성을 추가하면 됩니다. 이를 통해 모든 마이크로서비스에 대해 전역적으로 타임아웃 설정을 적용할 수 있습니다.
application.yml
파일 수정Gateway 서버의 application.yml
파일에서 다음과 같은 설정을 추가합니다:
spring:
cloud:
gateway:
httpclient:
connect-timeout: 1000 # 1초 동안 연결을 시도
response-timeout: 2000 # 2초 동안 응답을 기다림
이 설정을 통해 Gateway 서버가 다른 마이크로서비스에 요청을 보낼 때, 연결이 1초 내에 이루어지지 않으면 요청을 중단하며, 응답이 2초 내에 도착하지 않으면 타임아웃 오류를 발생시킵니다.
타임아웃 설정을 적용한 후, 다시 LoansController
의 contact-info
API를 호출하여 타임아웃이 제대로 작동하는지 확인합니다. 이번에는 요청이 2초 동안 응답을 기다린 후 타임아웃 오류를 발생시키며 더 이상 대기하지 않음을 확인할 수 있습니다.
이 설정은 모든 마이크로서비스와 경로에 대해 글로벌하게 적용되므로, 각 마이크로서비스의 성능 문제로 인해 전체 시스템에 영향을 미치지 않도록 보호합니다.
특정 경로에 대해서만 타임아웃 설정을 다르게 적용해야 하는 경우도 있습니다. 이를 위해 Spring Cloud Gateway는 route
별로 타임아웃을 설정할 수 있는 방법을 제공합니다. 예를 들어, Java DSL 스타일의 라우팅 설정을 사용하는 경우 metadata
메서드를 사용하여 경로별로 타임아웃을 설정할 수 있습니다:
.route("example_route", r -> r.path("/example-path")
.filters(f -> f.addRequestHeader("Example", "Header")
.metadata("response-timeout", 3000)) // 이 경로에 대해 3초 타임아웃 적용
.uri("http://example.com"))
또한, 응답 타임아웃 값을 -1
로 설정하면 특정 경로에 대해 타임아웃 설정을 비활성화할 수 있습니다.
Spring Cloud Gateway는 마이크로서비스 네트워크에서 중요한 역할을 하는 강력한 엣지 서버입니다. 타임아웃 설정을 통해 서버 리소스를 보호하고, 성능 저하를 방지할 수 있습니다. 이번 강의를 통해 타임아웃 설정의 필요성과 적용 방법을 배우고, 특정 경로에 대한 타임아웃 설정 방법도 이해했습니다.
이 강의에서는 타임아웃 설정을 통한 성능 문제 해결에 대해 다뤘으며, 이를 통해 Spring Cloud Gateway의 기능을 보다 효과적으로 활용할 수 있는 방법을 배웠습니다.
이후 강의에서는 다른 중요한 패턴과 기능에 대해 계속해서 알아보겠습니다.