현재 서비스에서 discovery 서버에 ae_spring이라는 A 클라이언트와 community라는 B 클라이언트가 등록이 되어있다.
닉네임 변경 api를 A가 받았을 때 eureka 클라이언트 B를 호출해 B가 가진 db의 게시글 닉네임 자동으로 변경되도록 설정해두었었는데, 로컬에서는 잘 동작했다가 도커를 이용해 이미지로 컨테이너화 하니까 에러가 남 (A, B, eureka는 각각 다른 ec2에 배포되어있음)
일단 유레카 서버 페이지로 가본다
(http://[유레카eip]:8761/)
예상 원인 : gateway를 eureka의 client로 등록해주지 않은게 문제로 예상된다
gateway 설정파일에 유레카 client정보 추가
유레카 서버에 클라이언트 인식 된다
posting에 지금 글을 써둔게 변경 되는지 확인
변경이 안됐다. 예상원인 1 fail
닉네임 (사용자 회원정보 수정시 ) 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가 요청할 때마다 줘야 하기 때문이다.
그러므로
해결책은 포트포워딩을 해줘야 한다
이제 되나??
회원 정보 수정시 다시 에러가 난다.
에러내용은
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 요청을 날렸구나 싶어서 몇 초 기다리고 다시 했다.
의도대로 변경된 닉네임으로 바뀌었다!
끝!
서비스 프로퍼티 파일에
eureka.instance.prefer-ip-address true로 설정하시면 동일하게 처리할 수 있어요!