본문 바로가기
Web/Spring

[Spring Cloud] Eureka 서버 기동하기

by Geunny 2022. 8. 18.
반응형

먼저 Eureka 란..

Netflix 에서 오픈소스로 공개한 MSA 에서 사용되는 Naming Server 이다.

https://cloud.spring.io/spring-cloud-netflix/reference/html/

 

Spring Cloud Netflix

This project provides Netflix OSS integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms. With a few simple annotations you can quickly enable and configure the common pat

cloud.spring.io

 

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

Eureka 서버를 통해 Scale out방식으로 실행한 동일한 어플리케이션 or 마이크로 서비스의 이름과 서버주소를 관리해준다.

이는 추후에 작성할 로드벨런서에 요청된 api 정보를 Eureka 서버에서 해당 요청이 어느서버로 갈지 지정해 준후 해당 서비스에 요청해 주는 Middle tier 서버로서의 역할을 수행하게 된다.

Eureka는 Eureka Server, Eureka Client 두가지로 구성되어있다.

1. Eureka Server

유레카 서버는 각 마이크로서비스가 어떤이름으로 동작하는지, 동작하는 어플리케이션의 호스트, 포트정보를 모아주는 서버의 역할을 한다.

2. Eureka Client

실제 마이크로서비스들이 동작하는 인스턴스로 실제 비지니스 로직이 포함되는 Rest API들이다. Eureka Client가 동작하면서 Eureka Server에 자신의 정보를 등록하여 서버에서 해당 클라이언트의 정보를 출력하게 된다.

(Eureka Server 와 Eureka Client는 서로다른 내장톰켓으로 동작하는 각각의 웹서비스로 보면 된다.)

Eureka Server 생성

Eureka Server 는 간단히 아래 하나의 디펜던시의 추가로 만들수 있다.

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

단 주의할 점으로 스프링부트의 버전에 따라 호환되는 스프링 클라우드의 버전정보가 다르므로 아래 Docs를 확인하여 생성하거나 Spring-Initializer를 이용하여 호환되는 버전으로 생성하는것을 추천한다.

https://spring.io/projects/spring-cloud

 

Spring Cloud

Spring Cloud is an umbrella project consisting of independent projects with, in principle, different release cadences. To manage the portfolio a BOM (Bill of Materials) is published with a curated set of dependencies on the individual project. Go here to r

spring.io

 

위 내용으로 프로젝트를 생성한후 서버등록을 위해 스프링 실행 클래스에 `@EnableEurekaServer` 어노테이션을 추가함으로써 해당 어플리케이션을 Eureka Server 로써 동작시킬 수 있다.

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryserviceApplication {

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

}

다음은 해당 어플리케이션의 application.yml 설정파일이다.

server:
  port: 8761
spring:
  application:
    name: discoveryservice
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false

현재는 하나의 컴퓨터로 동작하기에 포트번호를 서로 다르게 설정하여 실행할 예정이라 포트번호를 지정해 주었다.

어플리케이션 네임은 해당 서비스가 어떤 이름으로 동작하는지 알려주기 위해 등록한 이름이고

중요한건 eureka 설정이다.

eureka 설정으로 어플리케이션을 실행하게 되면 서버로 동작하지만 클라이언트에 위 두 설정 default값이 true 로 지정되어 현재 서버를 유레카 서버의 클라이언트로 등록하게 된다.

하지만 현재 동작하는 Eureka Server는 등록이 필요없는 서버이므로 위 두 설정을 false 로 지정해 줌으로 서버 서비스는 유레카에 등록이 되지 않도록 설정할 수 있다.

아래는 서버 기동후 유레카에서 제공하는 대쉬보드 화면이다. 해당 화면에서는 현재 서버에 등록된 클라이언트 정보들을 보여준다.

1. 클라이언트 설정을 false 로 지정한 경우

Instances currently registered with Eureka 안에 아무것도 등록되어 있지 않다.

2. 클라이언트 설정을 안한 경우

Instances currently registered with Eureka안에 현재구동중인 서버정보가 담겨있다.

 

유레카 클라이언트 실행

Eureka Client는 각각의 서비스 로직이 있는 우리가 흔히 사용하는 Rest API 로 생성함과 동시에 Eureka Client 로 동작할 수 있는 디펜던시를 하나더 추가해 주어야한다.

<!--        rest api 설정을 위한 디펜던시-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        Eureka Client 설정을 위한 디펜던시-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

 

클라이언트도 서버와 유사하게 Application 시작점에 클라이언트로 동작한다는 어노테이션을 추가해 준다.

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {

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

}

클라이언트 등록시 위에서 사용한 @EnableDiscoveryClient 어노테이션 외에 @EnableEurekaClient 어노테이션도 존재한다.

@EnableDiscoveryClient는 spring-cloud-commons에 존재하고,
@EnableEurekaClient는 spring-cloud-netflix에 존재하고 유레카만을 위해 작동한다.

동작을 위해 어플리케이션 설정을 아래와 같이 설정해 준다.

server:
  port: 0 # 0은 랜덤포트

spring:
  application:
    name: user-service # 유레카 서버에 표시될 서비스 이름

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

위 설정에서 instance-id 를 직접 지정해 준 이유는

포트를 0으로 랜덤설정으로 지정하여도 유레카에서 서비스가 올라갈때 서비스 url 정보를 '호스트정보-어플리케이션이름-위에적인포트'로 등록하여 실제 실행은 다른포트로 실행되었어도 위정보가 같아 같은 url로 인식되어 여러개를 실행해도 한개 어플리케이션만 등록된 형태로 보여지게 되어 인스턴스 id 지정을 직접 작성해 주었다.

 

위 설정으로 여러개의 인스턴스 실행후 서버를 확인해보면 아래와 같이 UESR-SERVICE 이름으로 여러 인스턴스가 등록된 것을 확인할 수 있다.

 

 

댓글