동상이농 프론트 개발이 시작됐습니다.
제가 axios 인터셉터 세팅을 맡았는데요.
인터셉터 코드를 추가하고, 제대로 동작하는지 보기 위해서 아래와 같이 서버에 간단한 요청을 보냈는데 응답이 오지 않았습니다..
<script>
import axios from 'axios';
export default {
async created() {
console.log("created");
try {
const res = await axios.get(`${process.env.VUE_APP_API_BASE_URL}/member-service/member/healthcheck`);
console.log(res);
} catch(e) {
console.log(e);
}
},
//.. 생략
}
//..
</script>
API Gateway의 로그를 확인해보니 다음과 같은 에러메시지가 찍혀있었습니다.
2024-09-28T12:02:38.403+09:00 ERROR 80418 --- [api-gateway] [ctor-http-nio-2] a.w.r.e.AbstractErrorWebExceptionHandler : [d48b9c9b-243] 500 Server Error for HTTP GET "/member-service/member/healthcheck"
io.netty.channel.ConnectTimeoutException: connection timed out after 30000 ms: /ip주소:52322
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:263) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
*__checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
*__checkpoint ⇢ HTTP GET "/member-service/member/healthcheck" [ExceptionHandlingWebHandler]
Original Stack Trace:
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:263) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final]
at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) ~[netty-common-4.1.112.Final.jar:4.1.112.Final]
at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:156) ~[netty-common-4.1.112.Final.jar:4.1.112.Final]
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173) ~[netty-common-4.1.112.Final.jar:4.1.112.Final]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166) ~[netty-common-4.1.112.Final.jar:4.1.112.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:469) ~[netty-common-4.1.112.Final.jar:4.1.112.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569) ~[netty-transport-4.1.112.Final.jar:4.1.112.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:994) ~[netty-common-4.1.112.Final.jar:4.1.112.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.112.Final.jar:4.1.112.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.112.Final.jar:4.1.112.Final]
at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
스택 오버플로우 답변에 의하면 DNS의 문제라고 합니다.
네트워크 설정을 리셋하면 해결된다고 하는데요.
실제로 저는 member 모듈을 재실행하였더니 해결됐습니다.
Member 모듈의 application.yml에서 자기자신의 application name을 member-service라고 칭하는 부분이 있고, 이 이름으로 유레카에 등록되게 됩니다.
그리고 API Gateway에서는 /member-service 라는 prefix를 단 경로로 요청이 들어오면 member-service, 즉 Member 모듈로 라우팅을 해주는데요.
즉 API Gateway는 모듈의 IP 주소를 가지고 있지 않고 어플리케이션의 이름으로 라우팅을 해주는 것이죠.
Eureka 서버에 eureka.instance.prefer-ip-address=true 설정을 추가해주면 host명이 아닌 ip 주소가 등록된다는 것 같은데,
서버를 재시작해도 문제가 해결되지 않는 경우는 해당 방법을 통해서 문제를 해결할 수 있다고 합니다.
뭐가 어디서 꼬여서 member 모듈을 찾지 못한 것인지는 모르겠네요...
MSA의 동작에 공부가 더 필요한 것 같습니다.
아래는 Member 모듈 재시작 후 요청이 제대로 처리된 것을 캡처한 사진입니다
Reference
https://develop-yyg.tistory.com/5
'프로젝트 기록 > Architecture, Infra, CICD' 카테고리의 다른 글
[MSA / Spring Cloud] Spring Cloud MSA 프로젝트에서 CORS 설정에 대해 (feat. 403 error) (3) | 2024.10.03 |
---|---|
[CI/CD] Jenkins로 스프링 부트 프로젝트 비공개 파일 관리와 빌드 스크립트 작성 (1) | 2024.05.07 |
[Project / AWS] EC2와 RDS로 스프링 API 서버 배포하기 (0) | 2024.05.04 |