본문 바로가기
프로젝트 기록/Architecture, Infra, CICD

[Spring Cloud] MSA 구조에서 요청이 처리되지 않는 문제 (Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException)

by clean01 2024. 9. 28.

동상이농 프론트 개발이 시작됐습니다.

 

제가 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://stackoverflow.com/questions/65401512/spring-cloud-gateway-doesnt-work-with-discoveryclientroutedefinitionlocator

 

Spring Cloud Gateway doesn't work with DiscoveryClientRouteDefinitionLocator

I was working with Spring cloud gateway when i use routes statique like this (It works fine) : @Bean RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes() .

stackoverflow.com

https://develop-yyg.tistory.com/5

 

4장 서비스 디스커버리

학습 내용 유레카 서버를 내장한 애플리케이션 배포하기 클라이언트 측 애플리케이션에서 유레카 서버에 연결하기 고급 디스커버리 클라이언트 설정 클라이언트와 서버 사이의 보안 통신하기

develop-yyg.tistory.com