파란하늘의 지식창고
article thumbnail
반응형

Eureka 소개

msa를 구성하면 각 application은 서비스 상황에 따라 트래픽이나 부하가 증가할 경우 인스턴스를 추가로 생성하거나, 반대로 트래픽이나 부하가 감소할 경우 인스턴스를 줄이는 등 microservice에 대한 개별 관리를 하게 되고 이러한 확장과 축소를 수동이 아닌 자동으로 처리를 하여 빈번하게 변화하게 된다.

수시로 변하는 환경을 감지하고 로드 밸런싱을 할 수 있어야 각 msa 간 연계를 관리할 수 있다.
이렇게 동적으로 변하는 환경을 감지하기 위해 Service Discovery 기능을 제공하는 것이 Eureka Server이다.

각 application은 Eureka Client를 통해 Eureka Server로 스스로의 정보를 전달한다.
Eureka Server는 이렇게 전달된 application에 대해 주기적으로 상태를 체크하면서 관리를 하고 요청받은 application 정보를 응답해 준다.

Spring Cloud Netflix Eureka는 Spring Cloud Netflix에서 제공하는 Service Discovery 기능이다.
https://spring.io/projects/spring-cloud-netflix
이전에는 Spring Cloud Netflix 관련 모듈이 Ribbin, Hystrix, Zuul 같은 것들도 있었지만 현재는 Eureka만 남아있고 앞의 세 가지는 대체 라이브러리가 존재한다.
Spring Cloud LoadBalnacer, Spring Cloud Circuit Breaker, Spring Cloud Gateway가 그 대체된 라이브러리 들이고 이러한 라이브러리는 시간이 지나면 다시 변할 수 있다.

Service Discovery를 제공하는 라이브러리는 netflix의 eureka, hashicorp의 consul, apache zookeeper, CNCF의 etcd 등 다양하다.
어떤 라이브러리를 선택할지는 각자의 선택이다.

Eureka Server 구축하기

maven 설정

Spring Boot 및 Cloud bom 설정 부분은 생략하였다.
다음과 같이 eureka server 의존성을 추가한다.

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

java 설정

java에서 @EnableEurekaServer를 선언하면 eureka server가 실행된다.

@SpringBootApplication
@EnableEurekaServer
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

properties 설정

client 등록 제외하기

Eureka Server가 스스로를 client로 등록할 필요는 없다.
또한 로컬 개발 시 client에서도 마찬가지로 아래 설정을 통해 Eureka Server에 client 등록을 제외해야 한다.

eureka.client.register-with-eureka=false

registry 호출 저장 비활성화 하기

해당 옵션은 기본이 true이며 server로부터 registry 정보를 가져와서 로컬에 캐시하고 30초마다 업데이트하도록 하는 옵션이다.
server 입장에서는 자신이 제공자이지 사용자가 아니므로 호출 캐시 처리가 필요 없다.

eureka.client.fetch-registry=false

Peer Awareness 처리

Eureka Server는 재기동 시 자신이 가지고 있던 client의 application 정보를 모두 잃게 된다.
따로 store 관리를 지원하지 않으며 한번 잃은 application 정보는 이후 client가 시작하면서 등록 요청을 하지 않는 한 재등록되지 않는다.

Eureka Server가 application 정보를 유지하는 방식은 여러 개의 Eureka Server가 서로 application 정보를 공유하는 것이다.
주기적으로 application 정보를 공유하고 여러 개의 Eureka Server 중 한 개라도 살아 있으면 이 정보는 유지가 된다.
Eureka Server를 운영하려면 최소 2개 이상 Eureka Server를 띄우고 1개 이상은 항상 살아 있어야 한다.
여러 개를 띄우면서 각 Eureka Server의 정보를 다음과 같이 설정하면 된다.

eureka.client.service-url.defaultZone=http://eureka1주소,http://eureka2주소

여기서 주의해야 하는 부분은 defaultZone의 경우 default-zone과 같은 형태의 kebab-case가 아닌 camel-case로 등록해야 한다는 점이다.
defaultZone은 serviceUrl 'Map<String, String>'에 들어가는 Key 값이기 때문에 property binding 규칙을 지키면 안 된다.

위 설정은 여러 Eureka Server가 각각 application 정보를 공유할 동료를 인식하게 해주기도 하면서 또한 client에서 설정하면 자신을 등록할 eureka server가 누구인지 인식하게 해 준다.

Eureka Client 설정하기

maven 설정

Spring Boot 및 Cloud bom 설정 부분은 생략하였다.
다음과 같이 eureka server 의존성을 추가한다.

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

java 설정

이전엔 java에서 @EnableDiscoveryClient를 선언하여 활성화하였는데 이 부분은 이제 필요하지 않게 되었다.
https://cloud.spring.io/spring-cloud-commons/reference/html/#discovery-client
따라서 java에선 별도의 설정이 필요없다.

properties 설정

eureka server 주소 지정

server 입장에선 peer awareness 설정이지만 client 입장에선 등록할 server 주소 설정이다.

eureka.client.service-url.defaultZone=http://eureka1주소,http://eureka2주소

여러 개의 eureka server를 사용하는 경우가 아니라면 eureka server가 먼저 시작된 이후 client를 띄우면 server에 client application이 등록되는 것을 확인할 수 있다.

서버에서 등록된 application 세부정보 확인하기

이제 server와 client를 각각 띄운 후 eureka 서버에 접근하면 등록된 eureka server replica 정보와 client 정보를 확인할 수 있다.

또한 상단 'LAST 1000 SINCE STARTUP' 메뉴에서 등록 로그 및 취소 로그도 확인할 수 있다.
등록된 applicaiton의 세부정보는 /eureka/apps 주소를 통해 확인할 수 있다.

이렇게 등록된 application 정보는 gateway, openfeign 등 여러 다른 라이브러리를 통해 msa 구성을 위해 효율적으로 사용할 수 있게 된다.

반응형
profile

파란하늘의 지식창고

@Bluesky_

도움이 되었다면 광고를 클릭해주세요