[MSA알아보기] 서비스 디스커버리 (Spring Cloud Netflix Eureka)

차차의 개발일기·2024년 8월 2일
0

msa

목록 보기
3/7

앞서 Spring Cloud에 관해서 알아보았는데 오늘은 좀 더 구체적으로 하나하나씩 알아보려 합니다.

이번 블로그에서는 Service Discovery 패턴에 대해 알아보고 해당 패턴을 구현해보겠습니다. 자세한 내용은 GIT-eureka-discovery 브랜치에서 알아보실 수 있습니다.


1. Service Discovery 란?

마이크로서비스 아키텍처(분산 시스템)에서 각 서비스가 동적으로 서로를 찾고 통신할 수 있도록 돕는 메커니즘입니다

2. Server-side Discovery / Client-side Discovery

  1. 서버 사이드 디스커버리(Server-Side Discovery)
    클라이언트가 서비스 요청을 로드 밸런서에 보내면, 로드 밸런서가 서비스 레지스트리를 조회하여 적절한 서비스 인스턴스에 요청을 전달합니다.
  • 장점 : 클라이언트가 간단해지며, 로드 밸런서가 다양한 로드 밸런싱 전략을 사용하여 효율적으로 트래픽을 분산시킬 수 있습니다.

  • 단점 : 로드 밸런서가 단일 장애점이 될 수 있으며, 관리가 복잡해질 수 있습니다.

  • 예시 기술 : AWS Elastic Load Balancer (ELB), NGINX, HAProxy

  1. 클라이언트 사이드 디스커버리(Client-side Discovery)
    클라이언트가 직접 서비스 레지스트리를 조회하여 사용 가능한 서비스 인스턴스를 결정하고 연결합니다.
  • 장점 : 클라이언트가 서비스 선택에 대한 완전한 제어권을 가지며, 특정 로드 밸런싱 알고리즘을 쉽게 구현할 수 있습니다.

  • 단점 : 클라이언트에 추가적인 복잡성이 생기고, 서비스 레지스트리에 대한 의존성이 커집니다.

  • 예시 기술 : Netflix Eureka, Consul, Zookeeper

3. Eureka를 사용한 Client-side Discovery 구현

서버,클라이언트 사이드 디스커버리에 관해서 간단하게 알아봤습니다.
제가 사용해볼 기술은 인프라 작업이 아닌 코드 단 작업으로 할 수 있는 Client-side Discovery를 적용할 것입니다.
사용할 라이브러리는 Netflix가 개발안 Eureka를 사용해보겠습니다.

eureka server 하나에 인스턴스 2개를 연결

3-1. Eureka Server 구현

서버들의 정보를 관리하는 Eureka Server를 구현해보겠습니다.

3-1-1. 의존성 추가

dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

위와 같이 eureka-server 의존성을 추가해줍니다.

3-1-2. Eureka Server 활성화

@SpringBootApplication
@EnableEurekaServer
public class ServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(ServerApplication.class, args);
	}

}

@EnableEurekaServer 어노테이션을 사용하여 Eureka Server 관련 구성이 활성화 되도록 해줍니다.

3-1-3. application.properties 설정

spring.application.name=server

server.port=19090

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

eureka.instance.hostname=localhost

eureka.client.service-rl.defaultZone=http://localhost:19090/eureka/
  • server.port : Eureka Server의 Port를 지정합니다.
  • eureka.client.register-with-eureka : Eureka Server에 자신을 등록할지 여부를 설정합니다.
    • 자기 자신을 등록할 필요는 없기 때문에 false로 설정했습니다
  • eureka.client.fetch-registry : 유레카 서버로부터 레지스트리를 가져올지 여부를 설정합니다.
    • 자기 자신의 정보를 캐싱할 필요는 없기 때문에 false로 설정했습니다.
  • eureka.instance.hostname : 유레카 서버 인스턴스의 호스트 이름을 설정합니다.
  • eureka.client.service-url.defaultZone : Eureka Server의 URL을 지정합니다. 이후에 Eureka API 요청 시 해당 URL로 요청을 보낼 수 있습니다.

위 설정을 마치고 실행을 한 후 localhost:{설정한 주소}로 접속을 하면 위와 같은 대시보드가 렌더링 되는데 성공한다면 server 설정은 끝입니다.

3-2 Eureka Clients 구현

다른 서비스들의 정보를 얻기 위한 Eureka Clients를 구현해보도록 하겠습니다.

3-2-1. 의존성 추가

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

위와 같이 eureka-client 의존성을 추가해줍니다.

3-1-2. Eureka Client 활성화

@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {

	public static void main(String[] args) {
		SpringApplication.run(OrderApplication.class, args);
	}

}

@EnableDiscoveryClient 어노테이션을 사용하여 Eureka client 관련 구성이 활성화 되도록 해줍니다.

3-1-3. application.properties 설정

spring.application.name=order

server.port=19091

eureka.client.service-url.defaultZone=http://localhost:19090/eureka/

4. 최종 확인

멀티 모듈 환경에서 server -> client 순으로 실행을 시켜줍니다.

실행후 localhost:{server 설정 포트}로 접속해본다면 client들의 정보들을 확인할 수 있습니다.

Eureka 구현을 마무리 해보도록 하겠습니다.


🔗Github Repository 링크

https://github.com/junghojune/MSA-Practice

profile
1년차 개발자 차차입니다.

0개의 댓글