[MSA] Netflix Eureka - Service Discovery 구현

2022. 7. 14. 17:05Software Architecture/MSA

반응형

Service Discovery에 대한 개념은 이 포스트를 참고할 것

 

 Netflix Eureka

 

넷플릭스에서 개발한 Service discovery Tool로써 스프링 클라우드에 기부했다고 한다. (Flex...)

 

https://spring.io/projects/spring-cloud-netflix

 

Spring Cloud Netflix

Spring Cloud Netflix features: Service Discovery: Eureka instances can be registered and clients can discover the instances using Spring-managed beans Service Discovery: an embedded Eureka server can be created with declarative Java configuration

spring.io

 

공식문서에 아~주 약소한 예제가 나와있으나 필자는 좀 더 세분화 된 예제를 통해 유레카를 사용해 볼 예정이다.

 

총 두 개의 프로젝트를 생성할 것이고 구조는 다음과 같다.

 

  1. serviceDescovery 프로젝트
    Eureka Descovery Server를 구현할 프로젝트
  2. myService 프로젝트
    Eureka Client로 우리가 가동할 마이크로 서비스

 

 프로젝트 생성 - Eureka Server

 

inteliJ에서 File > New > Project... 클릭하여 새 프로젝트를 생성하자.

 

 

파일 저장 위치는 자유롭게 기입하고 자바 버전 같은 경우는 11버전을 권장한다.

필자는 이름을 discoveryservice로 기입했다.

 

Intelij Ultimate가 아닌 경우, Spring initializr에서 직접 프로젝트를 만들어 열어야 한다.
프로젝트 생성 링크

 

Eureka Server용 프로젝트이기 때문에 해당 dependency를 선택한다. 

 

Eureka Server로 동작할 프로젝트기 때문에 @EnableEurekaServer 어노테이션을 붙인다.

또한 필자의 경우 설정파일 확장자를 application.yml로 변경했다.

그대로 써도 무방하지만 안에 기입하는 문법이 다르기 때문에 다음 과정을 참고할 때 유의해야 한다.

 

다음은 환경 설정 부분이다. 서버 프로젝트의 포트는 8761로 등록한 후 어플리케이션 이름을 명명해준다.

 

Eureka Server용 프로젝트 인데, 왜 eureka client 설정 부분이 들어가 있을까?

Eureka 라이브러리가 포함된 채 스프링부트가 기동이 되면 기본적으로 클라이언트 역할로써 어딘가에 등록하는 작업을 시도하게 된다. 

위의 두 설정값은 기본값이 true기 때문에 ‘클라이언트’ 역할로 자신의 정보를 자신에게 등록한다.

이 프로젝트는 단순히 '서버'의 역할로 구동되어야 하기 때문에 클라이언트 설정이 필요 없기 때문에 false 처리를 해준다.

 

이제 서버 준비가 끝났다. 한 번 구동해보자.

 

Eureka 서버 화면이 무사히 뜬 것을 볼 수 있다.

현재는 어떠한 client 어플리케이션이 등록되지 않았으므로 No instances available 이라고 표기되어 있다.

 

혹시 화면 위쪽에 빨간 글씨로 오류가 뜨더라도 걱정하지 말자! 시간이 지나면 사라질것이다.

 

 

 프로젝트 생성 - Eureka Client

 

다음은 client용 프로젝트를 생성해보자.

 

필자는 이름을 myService로 지정하였다.

 

dependency 설정 내용이다. 해당 프로젝트는 client용이기 때문에 Eureka Discovery Client를 선택해야 한다.

 

@EnableDiscoveryClient  어노테이션을 추가해준다.

설정파일은 다음과 같이 작성한다.

마지막 service-url에는 방금 전에 만든 eureka Server용 클라이언트의 포트번호와 주소를 기입하고 eureka를 붙여주자.

 

한번 실행해보자!

 

이제 다시 EurekaServer로 돌아가는 화면을 살펴보자

 

http://localhost:8761/

client로 등록한 my-service가 잘 돌아가고 있는 것을 볼 수 있다! 야호!

 

 Eureka Client Scaling

 

이제 서버에 무사히 클라이언트가 등록 된 것을 확인할 수 있었다. 다만 달랑 한개만 연결하는 것은 좀 아쉽지 않을까?

같은 서비스를 추가적으로 실행해보자! 

해당 버튼을 누르자

해당 버튼을 클릭해 어플리케이션을 복사하자.

 

다만 이 상태로 그대로 MyServiceApplication2를 실행하게 되면, port 충돌이 생긴다.

왜냐? 설정파일까지 그대로 복사되어 둘 다 9001포트를 사용하기 때문이다.

 

 다음과 같이 포트번호를 설정하자.

 

해당 버튼을 눌러 새로 만든 어플리케이션을 구동해보자!

 

포트가 무사히 9002로 변경되었고,

 

동일한 서비스의 서버 2개가 각각 올라간 것을 확인할 수 있다!

 

이렇게 같은 서비스를 추가적으로 실행하여 '동일한 서비스 내에 여러 서버'를 늘리는 일을 Scaling이라고 한다.

 

 

 Random 포트 사용으로 Scaling

 

이전에는 직접 포트번호를 다르게 설정하여 두 개의 서버를 만들었지만, 랜덤 설정을 통해 같은 서비스를 추가적으로 실행하는 방법도 있다!

 

MyService 어플리케이션 첫 번째로 변경하여 포트번호를 0으로 바꾸고 재실행하면?

 

60505로 랜덤 포트로 실행된 것을 확인할 수 있다.

그럼 MyserviceApplication2에 들어가 설정파일의 port번호를 0으로 설정하면, 굳이 직접 다르게 기입해줄 필요가 없지 않을까?

9002로 설정한 정보를 지우고, 설정파일의 port : 0이 그대로 적용되게 해보자!

 

포트번호도 바뀌었다!

 

엥? 그런데 Server 화면에서는 하나만 떠있다.. 무슨 일일까?

서버 입장에서는 같은 서비스 명으로 등록했기 때문에 Eureka에 하나의 앱만 등록된 것이다.

두 어플리케이션은 서로 복사한 상태이므로, 설정 파일의 서비스명을 바꾸면 둘에게 같이 적용되서 무의미하다..

 

그래서 설정파일에 instance 정보를 등록하자!

해당 줄의 의미는, 같은 서비스에서 여러개 실행하는 인스턴스(서버)가 각각 실행될 때마다

id를 [호스트이름]:[인스턴스id : (id를 랜덤으로 생성하겠음)] <- 해당 포맷의 문자열로 생성하겠다는 뜻.

다시 실행해보자!

 

 

야호! 같은 MY-SERVICE에서 두 개의 서버가 무사히 돌아가고 있음을 확인할 수 있다!

 

 정리하기

 

직접 Eureka를 통해 Service Discovery를 구현해보니 재밌지 않은가? 서버에 마이크로 서비스로 제작한 USER-SERVICE를 등록하면, Eureka Server에서 언제든지 모니터링이 가능하다! 

또한 Scaling 작업을 통해 해당 서비스의 서버도 여러 개로 증설할 수 있었다.

 

더 나아가서 OTHER-SERVICE등의 프로젝트를 생성한 후, Eureka server와 매핑해주면 여러 개의 서비스를 관리하는 디스커버리를 구현할 수도 있을 것이다. (궁금하시다면 도전해보시길!)

 

이렇게 Service Discovery도 정복 완료!

 

 

참고 레퍼런스

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4

 

Service Discovery in a Microservices Architecture - NGINX