Self Project(ICN-APP) 일기 #2

최우혁·2021년 1월 15일
0

ICN_APP

목록 보기
2/7
post-thumbnail

MSA 적용에 대해

기존에 생각하던 설계는 하나의 서비스를 통해 모든 것을 하는 방식이었다.
근데 MSA를 접하고 나서 각 기능 별로 서비스를 나눠야 겠다는 생각에 여러 기술 스택을 찾아보면서 다시 보충을 하게 되었다.

Service Discovery 방식을 사용할 건데, API Gateway 역할을 하는 것은 Netflix Zuul, Service Registry 역할을 하는 것은 Netflix Eureka로 정했다.

이렇게 정해놓고 보니 API Gateway 역할을 할 서비스 하나와 Service Registry 역할을 할 서비스 하나를 더 만들어야 했다.
그래서 현재 총 세개의 Spring Boot 서비스를 띄우기로 생각했다.

Service Registry

먼저 Service Discovery 방식에 대해 내가 이해한 것을 적어보자면,

클라이언트의 요청을 API Gateway가 대표로 받고, API Gateway는 Service Registry를 통해 각 Service들을 호출하게 된다.
각 Service들은 일정 시간마다 Service Registry에 자신의 정보를 보내고 Service Registry는 API Gateway의 호출 뿐만 아니라 각 Service가 다른 Service를 호출할 때에도 쓰인다.
내가 사용할 Eureka 에서는 각 Service들을 Eureka Client로, 각 Service들의 주소를 저장해놓은 Service Registry를 Eureka Server라고 한다.

그래서 바로 Spring Boot 프로젝트 하나를 만들어서 간단하게 Eureka Server의 설정 값을 적었다.
정말 별거 없이 application.properties에 이렇게만 적었다.

그리고 기존에 만들어놨던 서버에도 Eureka Client 임을 명시하기 위해 application.properties에 설정을 추가했다.

일단은 실행이 되는지 확인하기 위해 로컬에서 띄웠다.

성공적으로 Eureka Server와 Eureka Client가 실행이 되었기에 localhost:8761로 들어가서 확인을 하면

짜잔, 이렇게 DashBoard가 나오면서, 현재 Eureka Server에 자신의 정보를 보내는 Eureka Client의 이름과 주소가 나오게 된다.
Eureka Client의 이름을 위에서 main-app으로 해놨기에 성공적으로 잘 나오는 것을 볼 수 있다.

근데 중간에 빨간글씨로 EMERGENCY! 하면서 뭐라고 나오는데 이건 뭔지 잘 모르겠어서 일단은 넘어갔다.

API Gateway

Service Registry가 성공적으로 띄워졌기에, API Gateway만 되면 얼추 그림은 맞춰지겠다 싶었는데... 결과는 띄우는데 실패했다.
Spring Boot 프로젝트를 생성하고 설정 값을 이렇게 집어넣었다.

API Gateway도 Eureka Client 중 하나라는 글을 봤기에, Eureka Client 설정을 하고, Zuul 설정을 넣어서 실행을 해봤다.

결과는 실패다. pom.xml에서 web 에 대한 모든 것을 지워봐도 자꾸 저렇게 에러를 뿜고 실행이 되질 않는다.
여러 글을 찾아봤지만 Spring-cloud와 Spring MVC가 동시에 띄워질 수 없다는 말만 있을 뿐 해결법을 찾지를 못했다.

일단은 더 고쳐봐야겠다...😭😭😭

해결!

드디어 해결했다. 원인은

이 dependency 때문이었다. 당연히 zuul이 API Gateway 역할을 하기에 저 내용이 필수인 줄 알았는데, 내가 저기에 대한 설정을 따로 하지 않아서 오류가 난 듯한다.

그리고 지금은 저 dependency를 지우고, 실행을 하였는데, 성공적으로 잘 나오고 있다!

일단은 성공! 👌

구동 확인

실제로 그럼 클라이언트에서 요청을 했을 때, 올바르게 정보를 읽어오는지 확인을 해봤다.

먼저, 8080 포트에 서비스를 띄우고, Eureka Server를 8761에, Zuul을 8801에 띄웠다.
Eureka DashBoard를 통해 위처럼 서비스가 떠있는 것을 볼 수 있다.

그럼, Flutter App에서는 서비스를 직접 호출하는게 아니라 API Gateway를 호출하고 Zuul이 알아서 서비스 서버에서 정보를 갖고 오는 방식이므로 client에서는 zuul의 ip:port를 호출하고 zuul이 지정한 routing-path를 붙였다.

routing path가 /api/** 이므로 {ip}:{port}/api/ 꼴로 들어오는 주소를 해당 zuul이 받는다.
물론 뒤에 api2로 붙이면 zuul을 거치지 않게 될 것이므로 정상적으로 구동이 안될 것이다.

그럼 이제 호출을 해보겠다.

Simulator가 서비스를 통해 현재 DB에 저장되어 있는 이벤트들을 들고 왔다.
Simulator에서 API-Gateway를 호출하였고, Zuul이 Request를 서비스 쪽으로 잘 전달해줬다.

Zuul 쪽 로그를 보면, Client의 요청을 main-app이라는 이름으로 Service Registry(Eureka Server)에 등록된 서비스의 주소로 보내고 있음을 알 수 있다.
(중간에 list of Servers=[ ] 라는 부분이 있는데, 여기에 해당 서비스 이름에 맞는 서비스 주소가 들어 있다)

성공적으로 잘 진행이 되는 걸 보니, 로컬에서의 테스트는 잘 마무리 된 것 같다.
솔직히 너무 간단하게 설정을 했기에 제대로 될까 했는데, 일단은 간단하게나마 잘 된 것 같아서 이걸 이용해서 좀 더 고도화를 해볼 예정이다.

끝!😳

profile
백엔드 주니어입니다🙌

0개의 댓글