포스트

LG CNS 부트캠프 학습일지 44일차

학습 내용

  • Eureka 디스커버리 서비스 서버 만들기
  • 자동으로 포트를 할당하도록 설정하기

Eureka 디스커버리 서비스 서버 만들기

Eureka 디스커버리 서비스란 말 그대로 하위 서버들을 발견하고 추적관찰 해주는 서버이다. 엄밀히 말하면 발견한다기 보다는 하위 서버들이 Eureka 디스커버리 서비스 서버에 자신의 존재를 알리는 방식이다. 이를 위해서 관련 의존성을 추가해주어야 했다. 수업시간에는 Maven을 사용했는데, 개인적으로는 Gradle이 익숙해서 Gradle을 사용했다.

1
2
3
4
5
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는 넷플릭스에서 만들었다고 한다. 돈내고 광고보는 구독제는 마음에 안들지만 소비자에게 안정적인 서비스를 제공하는데는 진심이라는 것이 느껴진다.

application.yml 파일도 수정해주어야 했다.

1
2
3
4
5
6
7
8
9
10
11
server:
  port: 8761

spring:
  application:
    name: service-discovery

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

Eureka 디스커버리 서비스 서버는 자기 자신에게 등록하거나 등록된 하위서버들을 받아볼 필요가 없기 때문이다.

하위서버들을 실행시켜서 Eureka에 등록이 되는지를 확인했다. 이를 위해서 각 인스턴스에 포트번호를 다르게 해주어야 했다. 보통 application.yml 파일에 명시되어 있는데, 이를 실행시에 매개변수로 전달할 수 있었다.

java 명령어를 사용하는 방법

1
java -jar .\build\libs\spring-cloud-tutorial-0.0.1-SNAPSHOT.jar --server.port=8083

gradlew 명령어를 사용하는 방법

1
.\gradlew bootRun --args="--server.port=8084"

자동으로 포트를 할당하도록 설정하기

하지만 새로운 인스턴스를 추가할 때마다 포트번호를 지정하는 것은 불편하다. 해당 포트번호를 다른 서버가 사용 중인 경우도 고려해야하기 때문이다. 대신에 스프링부트가 알아서 사용하려는 포트번호를 정하게 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server:
  port: 0

spring:
  application:
    name: spring-cloud-tutorial

eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
    register-with-eureka: true
    fetch-registry: true

중요한 것은 아래 두 가지이다.

1
2
server:
	port: 0

서버 포트를 8080 와 같이 특정 값을 전달하지 않고 0 을 전달한다. 스프링부트가 알아서 정하라는 의미이다. 하지만 이렇게만 하면 스프링부트 어플리케이션의 인스턴스를 여러 개 만들어도 Eureka에서는 하나만 인식한다. 그 이유는 인스턴스 아이디가 동일하기 때문이다. 아래와 같이 인스턴스 아이디를 다르게 만들어주어야 한다.

1
2
3
eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}

개인적으로는 ${random.value} 를 사용해서 무작위 값을 넣어줄 수 있다는 것이 흥미로웠다. 문법적 설명을 잠시 하자면, ${spring.application.name}${spring.application.instance_id:${random.value}} 사이에 있는 콜론(:)과 ${spring.application.instance_id${random.value}} 사이에 있는 콜론(:)은 다른 것이다. 전자는 문자 그대로의 콜론을 의미하고 후자는 spring.application.instance_id 값이 없으면 무작위 값을 사용하라는 의미이다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

Comments powered by Disqus.