[eureka] docker 컨테이너화 후 eureka client간 서버 통신 에러 해결

vector13·2022년 11월 20일
0

문제 상황

현재 서비스에서 discovery 서버에 ae_spring이라는 A 클라이언트와 community라는 B 클라이언트가 등록이 되어있다.

닉네임 변경 api를 A가 받았을 때 eureka 클라이언트 B를 호출해 B가 가진 db의 게시글 닉네임 자동으로 변경되도록 설정해두었었는데, 로컬에서는 잘 동작했다가 도커를 이용해 이미지로 컨테이너화 하니까 에러가 남 (A, B, eureka는 각각 다른 ec2에 배포되어있음)

현 시스템 아키텍처

서버 통신 에러 해결

일단 유레카 서버 페이지로 가본다
(http://[유레카eip]:8761/)

예상원인 1: gateway가 client 등록에 빠져있는 데 이것이 원인인가?

예상 원인 : gateway를 eureka의 client로 등록해주지 않은게 문제로 예상된다

gateway 설정파일에 유레카 client정보 추가

docker build, push, pull, run 완료후

유레카 서버에 클라이언트 인식 된다


posting에 지금 글을 써둔게 변경 되는지 확인

변경이 안됐다. 예상원인 1 fail

예상원인 2: 유레카가 client의 정보를 모른다

닉네임 (사용자 회원정보 수정시 ) ae_spring에 로그는 이렇게 에러가 난다.

2022-11-20 09:20:09.112 ERROR 1 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on POST request for "[http://ae-communityServer/eureka/193](http://ae-communityserver/eureka/193)": 8622ce125dbe; nested exception is java.net.UnknownHostException: 8622ce125dbe] with root cause

java.net.UnknownHostException: 8622ce125dbe
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:229) ~[na:na]
at java.base/java.net.Socket.connect(Socket.java:609) ~[na:na]
at java.base/java.net.Socket.connect(Socket.java:558) ~[na:na]
at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:182) ~[na:na]
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:508) ~[na:na]
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:603) ~[na:na]
at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:276) ~[na:na]
at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:375) ~[na:na]
at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:396) ~[na:na]
**at**

.UnknownHostException 으로 8622ce125dbe 를 찾지 못한다는 것인데,
8622ce125dbe은 커뮤니티의 컨테이너 id이다

아 이제 실마리가 풀린다.
컨테이너id는 배포마다 달라지기 때문에 고정적인 값인 ip를 알아야한다.

ip를 알아야하는 대상은 -> A나 B가 아니다. 유레카이다!

유레카가 자동으로 client로 등록한 서비스들의 정보를 알고있고, A나 B가 요청할 때마다 줘야 하기 때문이다.

그러므로
해결책은 포트포워딩을 해줘야 한다

client A와 B hostname에 자기 eip 넣어보기


그리고 다시 build push pull run

이제 되나??
회원 정보 수정시 다시 에러가 난다.
에러내용은

java.lang.IllegalStateException: No instances available for ae-communityServer
at org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient.execute(BlockingLoadBalancerClient.java:89) ~[spring-cloud-loadbalancer-3.1.3.jar!/:3.1.3]
at org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor.intercept(LoadBalancerInterceptor.java:56) ~[spring-cloud-commons-3.1.3.jar!/:3.1.3]
at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:93) ~[spring-web-5.3.20.jar!/:5.3.20]
at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:77) ~[spring-web-5.3.20.jar!/:5.3.20]
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-5.3.20.jar!/:5.3.20]
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66) ~[spring-web-5.3.20.jar!/:5.3.20]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:776) ~[spring-web-5.3.20.jar!/:5.3.20]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711) ~[spring-web-5.3.20.jar!/:5.3.20]
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:602) ~[spring-web-5.3.20.jar!/:5.3.20]
at com.ae.ae_SpringServer.component.CommunityDiscoveryClient.updateNickname(CommunityDiscoveryClient.java:38) ~[classes!/:na]
at com.ae.ae_SpringServer.api.UserApiController.update(UserApiController.java:203) ~[classes!/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]

No instances available 이므로 내가 B 서비스가 유레카에 자기의 건강 정보를 등록하기전에 api 요청을 날렸구나 싶어서 몇 초 기다리고 다시 했다.

의도대로 변경된 닉네임으로 바뀌었다!

끝!

profile
HelloWorld! 같은 실수를 반복하지 말기위해 적어두자..

1개의 댓글

comment-user-thumbnail
2023년 10월 12일

서비스 프로퍼티 파일에
eureka.instance.prefer-ip-address true로 설정하시면 동일하게 처리할 수 있어요!

답글 달기

관련 채용 정보