Hello, Freakin world!

[Eureka] 서비스 디스커버리에 서비스 등록하기 본문

Spring Cloud/Service discovery

[Eureka] 서비스 디스커버리에 서비스 등록하기

johnna_endure 2021. 2. 18. 18:40

시나리오

간단하게 유레카 서버와 유레카에 등록되는 서비스 서버를 띄운다.

그리고 유레카 서버의 대시보드를 활용해 서비스 서버가 등록되는지 확인해본다.


유레카 서버

스프링 이니셜라이저를 이용해 eureka server 의존성을 추가한 프로젝트를 생성하자.

 

build.gradle

plugins {
    id 'org.springframework.boot' version '2.4.2'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'springboot.cloud'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2020.0.1")
}

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

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

test {
    useJUnitPlatform()
}

그리고 부트스트랩 클래스에 @EnableEurekaServer 애너테이션을 추가한다.

@EnableEurekaServer
@SpringBootApplication
public class EurekaserverApplication {

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

}

다음은 application.yml 파일을 수정하자.

 

application.yml

spring:
  application:
    name: eureka-server

server:
  port: 8761

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

 

eureka.client.register-with-eureka

 서비스 인스턴스를 등록하는 동시에 유레카에 등록할 것인지 정할 수 있다. 여기서는 유레카 서버 본인이므로 false로 지정.

 

eureka.client.fetch-registry

 서비스 검색시 레지스트리를 로컬에 가져와 캐시할 것인지 정할 수 있다. 유레카 서버 본인이므로 false로 지정.

 

참고 : 스프링 클라우드에서 spring.application.name과 같은 프로퍼티는 애플리케이션 ID로 사용된다. 만약 스프링 클라우드 컨피그를 사용하는 경우 이 프로퍼티가 부트스트랩 시점에 필요하기 때문에 bootstrap.yml에 분리하기도 한다.

그런데 스프링 2.4버전부터 bootstrap.yml의 프로퍼티를 인식하지 못하는 경우가 있다. 스프링부트 2.4부터 yml, properties 파일을 이용한 멀티 프로파일 구성 방식을 패치하면서 생긴 버그인듯하다.


이제 유레카 서버를 시작시키고 브라우저에서 http://localhost:8761을 호출.

 

이와 같은 대시보드를 확인할 수 있다.

등록한 클라이언트가 없기 때문에 No Instances available 이라는 문구를 확인할 수 있다.


이제 클라이언트를 만들어 등록해보자.

 

유레카 클라이언트

 

eureka-client 의존성을 추가해 클라이언트 프로젝트를 만든다.

 

build.gradle

plugins {
    id 'org.springframework.boot' version '2.4.2'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'springboot.cloud'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2020.0.1")
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

test {
    useJUnitPlatform()
}

application.yml를 수정.

 

application.yml

spring:
  application:
    name: eureka-client

eureka:
  instance:
    prefer-ip-address: true
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka/

eureka.instance.prefer-ip-address

 인스턴스의 위치를 추적할 때 호스트 네임보다 ip 주소를 더 선호하는지 정할 수 있다.

왜 이런 프로퍼티를 정하냐?

기본적으로 유레카는 호스트 네임으로 서비스를 등록한다. 이는 DNS가 지원되는 호스트 환경에서는 잘 동작한다.

하지만 도커와 같은 컨테이너 기반 환경에서는 DNS 엔트리가 없는 임의로 생성된 호스트 네임을 부여받아 시작하기 때문에,

이 프로퍼티를 true로 설정하지 않으면 해당 컨테이너에 대한 DNS 엔트리가 없어서 위치를 얻지 못한다.

 

eureka.client.register-with-eureka

 서비스 시작하면서 유레카에 등록되도록 true로 설정

 

eureka.client.fetch-registry

 서비스 검색시 레지스트리를 로컬에 캐시하도록 true로 설정.

 

eureka.service-url.defaultZone

 유레카 서버 목록을 이 프로퍼티에 지정할 수 있다.


이제 클라이언트를 시작하고 http://localhost:8761 로 접속해 확인해보자.

 

EUREKA_CLIENT 가 하나 추가됐다.

 

Comments