프로젝트 Project

MSA 앱 만들기 - 2. 로드밸런서 : 서비스 디스커버리 Eureka

달래dallae 2025. 1. 6. 10:21

Spring Cloud 특징

1. centralized configuration management

sping cloud config server 를 사용하여 설정 정보를 외부에 저장한다.

2. Location transparency

서비스 등록, 위치정보 확인, 검색 등 -> 넷플릭스의 유레카서버 사용 가능

3. Load Distribution (Load Balancing) / 또는 API Gateway

서버 요청정보 분산. Ribbon, Spring Cloud Gateway 

4. Easier Rest Clinents

 

 

서비스 디스커버리: Eureka

로드밸런서?

 

 

 

서비스 디스커버리?

외부의 다른 서비스들이 마이크로 서비스를 검색하기 위해 사용되는 개념이다.

서버/서비스가 어떤 위치에 있는지 저장하여 검색에 관련된 작업을 수행한다.

 

 

- 정보는 key-value로 이루어져있다.

- 클라이언트 - 로드밸런서 - 서비스 디스커버리 이렇게 이루어져있다.

즉, 로드밸런서가 서비스디스커버리에 위치를 질의한다.

 

 

프로젝트 구성

spring boot 3.3.7

maven

spring cloud eureka

 

Application설정

@EnableEurekaServer

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {

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

}

 

application.yml 설정

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false

기본값은 true -> 자신의 정보를 자신에게 등록하는 동작을 하게되어 false로 지정
유레카 서버 자체는 기동하되, 자기 자신의 정보를 외부에 있는 다른 마이크로서비스가 유레카 서버로부터 정보를 주고받는 역할을 할 필요가 없기 때문에 서버로서 기동만 하면 됨

 

 

 

마이크로서비스 설정

 

어플리케이션설정

@EnableDiscoveryClient

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true

register-with-eureka : true -> 현재 만들고 있는 마이크로서비스를 유레카 클라이언트로 등록

fetch-registery : eureka 서버로부터 인스턴스들의 정보를 주기적으로 가져올 것인지 설정. true -> 갱신된 정보를 받겠다

service-url : 유레카 서버 위치 지정

- defaultZone: 유레카서버 엔드포인트 지정. 마이크로서비스 정보를 등록할 유레카서버

 

유레카 서버에서 확인하기

 

 

같은 서비스를 여러개 띄우는 방법 =>

1) 포트 번호를 다르게 실행한다.

1. 다른 포트로 같은것을 여러개 띄우면(spring boot 실행 옵션으로 포트를 변경해준다. (-Dserver.port=) (yml을 변경하지 않는다) 같은 어플리케이션(서비스) 여러개를 유레카가 모두 관리할 수 있다.

 

2. 쉘스크립트 커맨드로 직접 메이븐 빌드

윈도우의 경우 

$env:JAVA_HOME="C:\Users\dailycode\Desktop\openjdk-11.0.2_windows-x64_bin"
.\mvnw spring-boot:run

JAVA_HOME의 환경변수를 설정해주고, run을 해준다.

 

 

2) 스프링부트의 yml파일에 랜덤포트로 지정한다.

server:
  port: 0

인스턴스 id는 yml파일을 기준으로 가져오기 때문에 포트를 0으로 지정하면 여러개의 인스턴스를 띄우더라도 유레카에서는 1개만 노출된다.

따라서 인스턴스 아이디를 따로 지정해야한다.

eureka:
  instance:
    instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}

 

이렇게 여러개의 인스턴스로 띄워진 것을 유레카는 자동으로 연결해준다.