Post

Eureka

1. Eureka란

마이크로서비스들의 정보를 레지스트리에 등록할 수 있도록 하고 마이크로서비스의 동적인 탐색과 로드밸런싱을 제공한다.

img001

  • 유레카는 서버-클라이언트 구조로 이루어져 있다. 서버 컴포넌트는 모든 마이크로 서비스의 가용성을 등록하는 레지스트리다. 등록된 정보는 일반적으로 서비스 ID와 URL이 포함된다. 이렇게 서버 레지스트리에 등록된 서비스는 서비스 ID를 통해 접근할 수 있다.
  • 유레카 클라이언트는 기본적으로 JAVA 어플리케이션이다. Non-JAVA 어플리케이션은 Side-car로 유레카 서비스에 등록하여 Polyglot을 지원한다.
  • 유레카 클라이언트로 등록되면 유레카 서버에서는 30초 간격으로 ping을 요청하여 등록된 서비스의 health를 체크한다. 이 ping 요청이 전송되지 않으면 이 서비스는 죽은것으로 간주하여 레지스트리에서 제외된다.
  • 유레카 클라이언트는 서버로부터 레지스트리 정보를 읽어와 로컬에 캐시한다. 이 후 클라이언트는 로컬에 캐시된 레지스트리 정보를 이용해서 필요한 다른 서비스를 찾을 수 있게된다. 이 정보는 기본적으로 30초마다 주기적으로 갱신되며, 최근에 가져온 정보와 현재 레지스트리 정보의 차이를 가져오는 방식으로 갱신된다.

2. Eureka Server

Eureka는 Middle-tier server( 비즈니스 로직이 위치한 애플리케이션 서버단)의 로드밸런스와 Failover를 위해 서비스를 배치해주는 REST 기반 서비스이다. 이 서비스는 주로 AWS Cloud에서 사용되고, 이를 Eureka Server라 부른다.

3. Eureka Client

Java 기반 클라이언트 요소도 있는데, 서버와 상호작용을 더 쉽게 해주는 것을 Eureka Client라 부른다. 클라이언트도 Round-Robin 방식을 기본으로 사용하는 로드밸런스를 내장하고 있다.

Netflix에서는, Eureka에서 기본 로드 밸런스 외에도 트래픽, 리소스 사용량, 에러 상황 요소에 따라 로드밸런스를 할 수 있도록 제공해주고 있다.

4. Eureka Server의 필요성

AWS Cloud에서는 특성상 서버가 자주 꺼졌다 켜젔다 한다. IP 주소와 hostname을 이용하는 기존 로드밸런스와 다르게, AWS에서는 로드밸런스는 좀 더 정교한 능력을 요구한다. IP 주소는 수시로 변하기 때문에 로드밸런스가 서버를 등록하고 해지하는 작업을 유동적으로 할 수 있게 해야한다.

5. Eureka Sever 설정

Eureka는 Spring Boot에서 지원하는 프로젝트이다. Maven/Gradle로 직접 라이브러리를 다운받을 수 있고, Spring Initializr에서 프로젝트 생성 후 IDE import를 해도 된다.

1) 프로젝트 생성

img002

2) Project Metadata 입력

img003

3) Dependencies 추가

img004

4) 디렉터리 구조

img005

5) application.properties

application.properties 파일에는 유레카 서버에 대한 설정들이 들어간다. MSA에서는 이러한 설정을 Config Server에 둬서 설정이 바뀌어도 서비스의 재시작 없이 설정 적용을 가능하게 하는 방법도 있다.

1
2
3
4
5
6
7
8
9
# application setting
spring.application.name=Eureka Server
server.port=8080

# eureka configuration
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.server.enable-self-preservation=true

6) EurekaApplication.java

EurekaServerApplication.java에 @EnableEurekaServer 어노테이션을 추가한다. @EnableEurekaServer 어노테이션은 해당 어플리케이션이 유레카 서버임을 선언한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.example.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {

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

}

7) Eureka Server 실행

img006

6. Eureka Client 설정

Eureka Server에 등록되는 Client는 기본적으로 운영에 필요한 서비스이기 때문에 마이크로서비스에 Eureka Client 설정을 한다.

1) 프로젝트 생성

img007

2) Project Metadata 입력

img008

3) Dependencies 추가

img009

4) 디렉터리 구조

img010

5) Maven Dependency 추가

spring-cloud-starter-netflix-eureka-client를 추가한다.

1
2
3
4
5
6
<!-- spring-cloud-starter-netflix-eureka-client -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>2.1.4.RELEASE</version>
</dependency>

6) application.properties

application.properties에서 Eureka Server 처럼 Eureka Client를 위한 설정을 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# set application name
spring.application.name=DemoAPI
# set application host
server.address=localhost
# set application port
server.port=8090

# configuration to set the ip of host instead of the default localhost
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=${server.address}
eureka.instance.instance-id=${server.address}:${server.port}

# Eureka Server URL
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka

7) DemoApplication.java

DemoApplication.java에 @EnableEurekaClient 어노테이션을 추가한다. @EnableEurekaClient 어노테이션은 해당 어플리케이션이 유레카 클라이언트임을 명시하고, application.properties에 명시한 Eureka Server에 해당 API를 등록한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class DemoApplication {

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

}

8) DemoController.java

Eureka Client 호출 결과를 위한 DemoController.java 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.demo.web;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String demo() {
        return "Hello World!";
    }
}

9) 실행

Eureka Server가 실행되어 있는 상태에서 demo를 실행시키면 Eureka Server 웹 화면 Instances currently registered with Eureka 목록에 DemoAPI가 등록되어 있다.

img011

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.