• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

강의 수강 후 질문

24.05.07 14:42 작성 조회수 142

0

안녕하세요 강의를 모두 수강후 , 강의를 통해 MSA관련 배운부분을 적용시키기 위해 프로젝트를 진행했습니다!
Spring Cloud를 활용하고 서비스를 모두 개발완료 후 배포를 진행중입니다. 현재 마이크로 채팅 서비스가 ec2 a인스턴스에있고 gateway는 b인스턴스에 있고 모두 docker로 배포를 진행했습니다. eureka서버는 b인스턴스에 있고 gateway를 비롯해서 모든 마이크로서비스가 정상적으로 등록된 상태입니다.
그러던중에, 아래와 같은 에러가 gateway 로그에 찍혔습니다. ec2 보안그룹도 정상적으로 포트를 열어줬고, 외부에서 접근이 가능하게 docker로 포트 매핑도 진행했고 , 방화벽도 문제가없는데
원래 gateway에서 ==> 다른 인스턴스에 있는 마이크로서비스를 연결을 하지못하는걸까요?
구글링을 많이해봤지만, 비슷한 내용이 없고 해결하기가 어려워 질문 남깁니다ㅜㅜ

+)추가로 라우팅도 정상적으로 되어 매칭이 됬다는 로그도 나오는 상태에서 finishConnect(..) failed: Connection refused 에러가 생깁니다..

a.w.r.e.AbstractErrorWebExceptionHandler : [1e416af9]  500 Server Error for HTTP GET "/plant-chat-service/chatroom/exist/seller?tradeBoardNo=2&memberNo=1"

io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: /172.18.0.5:46183
	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
	*__checkpoint ⇢ org.springframework.boot.actuate.web.trace.reactive.HttpTraceWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ HTTP GET "/plant-chat-service/chatroom/exist/seller?tradeBoardNo=2&memberNo=1" [ExceptionHandlingWebHandler]
Original Stack Trace:
Caused by: java.net.ConnectException: finishConnect(..) failed: Connection refused
	at io.netty.channel.unix.Errors.newConnectException0(Errors.java:155) ~[netty-transport-native-unix-common-4.1.85.Final.jar!/:4.1.85.Final]
	at io.netty.channel.unix.Errors.handleConnectErrno(Errors.java:128) ~[netty-transport-native-unix-common-4.1.85.Final.jar!/:4.1.85.Final]
	at io.netty.channel.unix.Socket.finishConnect(Socket.java:359) ~[netty-transport-native-unix-common-4.1.85.Final.jar!/:4.1.85.Final]
	at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.doFinishConnect(AbstractEpollChannel.java:710) ~[netty-transport-classes-epoll-4.1.85.Final.jar!/:4.1.85.Final]
	at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.finishConnect(AbstractEpollChannel.java:687) ~[netty-transport-classes-epoll-4.1.85.Final.jar!/:4.1.85.Final]
	at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.epollOutReady(AbstractEpollChannel.java:567) ~[netty-transport-classes-epoll-4.1.85.Final.jar!/:4.1.85.Final]
	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:489) ~[netty-transport-classes-epoll-4.1.85.Final.jar!/:4.1.85.Final]
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:397) ~[netty-transport-classes-epoll-4.1.85.Final.jar!/:4.1.85.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.85.Final.jar!/:4.1.85.Final]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.85.Final.jar!/:4.1.85.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.85.Final.jar!/:4.1.85.Final]
	at java.base/java.lang.Thread.run(Thread.java:831) ~[na:na]

답변 2

·

답변을 작성해보세요.

0

안녕하세요, 이도원입니다.

문의하신 질문은 aws ec2 server1과 aws ec2 server2에서 실행 중인 Docker container 간에 통신에 대한 부분인 것 같습니다. 실제 Docker만으로 서비스를 구성하는 경우보다는 Orchestraion tool를 이용하여 컨테이너들 간의 리소스 관리 및 스케줄링을 하게 됩니다. 특히, 분산 서버에 컨테이너를 배포하여 사용하는데 하나의 EC2 인스턴스를 사용하는 경우는 흔치 않다고 생각됩니다. 다만 실습을 위해 몇가지 지정된 설정값으로 두 서버간에 통신이 원할하게 이워질 수 있도록 구성할 수는 있을 것 같습니다. 올려 주신 오류는 통신이 되지 않는 부분이라고 생각되는데, 이건은 단순히 방화벽을 열어 놓은 것 뿐만 아니라, 컨테이너에서 작동되고 있는 서비스의 포트가 외부에서 접속 가능하도록 오픈 되어 있는지(publish)와 접속하려는 IP address가 제대로 등록되었는 등을 확인해야 할 것 같습니다.

아래는 제가 테스트한 환경 정보 입니다. 저는 catalog-service를 apigateway-service를 거쳐 호출하는 예제로 테스트 하였습니다.

1) AWS EC2 Server1

  • public ip address: 3.35.205.110, private ip address: 172.31.5.111

  • 등록 된 MSA: apigateway-service, catalog-service

2) AWS EC2 Server2

  • public ip address: 43.203.255.77, private ip address: 172.31.14.141

  • 등록 된 MSA: config-service, eureka-server

3) 테스트 순서

  • Server2에서 config-service, eureka-server 실행

  • Server1에서 apigateway-service, catalog-service 실행

  • Host PC(MacOS)에서 postman으로 apigateway-service를 통해 catalog-service 호출

4) catalog-service의 application.yml 파일

server:
  port:  10000

~ 중략

eureka:
  instance:
    prefer-ip-address: true
    ip-address: 172.31.5.111
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://43.203.255.77:8761/eurekaeureka:

~ 중략

 

5) Eureka에 등록 된 catalog-service

image위 이미지에서 왼쪽 하단에 보시면, CATALOG-SERVICE가 어디로 이동하게 되는지 링크 주소가 보이는데, 172.31.5.111:10000 으로 되어 있습니다.

6) Postman 테스트

imageapigateway-sevice가 등록된 Server1의 public ip address인 3.35.205.110:8000에 catalog-service를 호출하면 catalog-service가 등록된 private ip address인 172.31.5.111:10000으로 연결 되게 됩니다.

다시 말씀드리면, 분산 된 서버에서는 위에서 언급한 것처럼 Orchestration tools(Kunernetes 등)을 사용하시는 것이 더 효율적이며, K8s 자체가 부담되실 때에는 Docker Desktop에 포함되어 있는 Docker Swarm만을 이용해서도 분산 노드로 컨테이너를 관리해서 사용해 보실 수도 있습니다.

위에 설명했던 내용을 이미지로 나타내 보았습니다. 개념적이기 때문에, 이해를 하기 위한 차원으로 봐 주시면 좋을 것 같습니다.

image

 

추가 질문 사항 있으시면 글 남겨 주세요.

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.05.07

안녕하세요, 인프런 AI 인턴입니다.

mnk1106님의 질문에 대해 비슷한 상황을 다룬 유익한 답변이 있는 링크를 찾았습니다.

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) - 설정대로 올렸는데 api-gateway가 localhost로 붙으려고해요;
이 질문에서는 Docker 환경에서 Spring Cloud Gateway가 마이크로 서비스에 접근하지 못하는 상황과 유사함을 볼 수 있습니다. finishConnect(..) failed: Connection refused 에러가 발생하는 주요 원인 중 하나는 마이크로서비스 간의 통신 경로가 올바르게 설정되지 않았을 때 발생할 수 있습니다.

Docker 환경에서 마이크로서비스 간 통신 문제는 대개 네트워크 구성이나 서비스 발견(Discovery) 설정에 문제가 있을 때 발생합니다. 특히, 각 서비스가 서로를 올바르게 찾을 수 있도록 Eureka 서버에 정확하게 등록되어 있는지 확인하며, 서비스가 실행되는 호스트의 IP와 포트 설정이 정확한지 확인하는 것이 중요합니다.

에러 로그에서 마이크로서비스와 통신하려 할 때 연결을 거부당하는 상황이기 때문에, 마이크로서비스의 IP나 포트가 올바르게 지정되었는지, 보안 그룹 설정이나 네트워크 정책이 올바르게 적용되었는지 등을 체크해보시길 권장합니다. 또한 Docker 컨테이너 간 통신은 localhost나 127.0.0.1을 사용할 시 예상치 못한 문제가 발생할 수 있으니, Docker 내부 네트워크 상에서 서비스가 서로를 찾을 수 있는 방식으로 구성되었는지 확인해볼 필요가 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.