본문 바로가기
Spring Cloud

스프링으로 배우는 MSA (1) - Spring Cloud Netflix Eureka

by DarrenH 2023. 6. 23.
반응형

MSA를 만들 때 사용할 언어는 자바를 사용할 것이다. 프레임워크는 스프링부트를 이용하며, 무에서 유를 만드는 것이 아닌

OSS를 이용하여, 만들 예정이다.

 

이름에서 익숙한 단어가 있다. 바로 넷플릭스인데, 우리가 흔히 사용하는 OTT인 넷플릭스가 맞다.

이 오픈소스는 넷플릭스에서 개발하였으며, 모든 코드가 공개되어있다. (깃허브에 검색)

 

그 중 오늘은 유레카에 대해 설명하고 실습하려고한다.

먼저 시작하기 전에 재밌는 사실을 알게 되었다. 

GPT한테 왜 이름이 유레카냐고 물어봤더니 이런 대답이 왔다. 

결론은 애플리케이션을 등록하면 다른 서비스들이 해당 서비스를 "발견"하므로 이름을 이렇게 지은 것으로 추정한다고 하는데, 얼추 맞는것 같다. ㅋㅋㅋㅋ

 

그럼 이름에서 부터 벌써 이 유레카가 무엇을 하는지 짐작할 수 있다. 

앞 장에서 말했듯이 MSA는 여러개의 서비스가 존재한다. 하지만 이 서비스를 찾으려면 각각의 IP와 PORT를 찾아가야만 한다.

하지만 시스템은 트레픽에 따라 동적으로 늘어나기도 하고, 줄어들기도 한다. 그러면 host와 port가 동적으로 변경되는데 그 때마다 변경 된 값들을 일일이 적어줄 수 없기 때문이다. 

 

그래서 유레카를 이용하여 서비스를 등록하면 유레카에 등록된 서비스 ID를 찾아가 host와 port를 몰라도 유레카에 등록되어있으면 서비스를 찾아 갈 수있게 해준다.

 

유레카 서버가 제공해주는 것은 이뿐만 아니라 하나의 서비스를 여러개의 포트로 나눠주는 로드-밸런싱과 장애복구 가 가능한데, 이는 나중에 포스팅에서 볼 수 있다.

 

먼저 스프링을 프로젝트를 만든다. 

 

여기서 Next를 누르면 다음과 같은 화면이 나온다.

우리는 유레카를 사용할 것이기 때문에 체크해준다. 

여기서 버전은 2.7.13으로 했지만 실제 build.gradle에서 버전은 낮출 생각이다. 

Spring Cloud는 스프링 부트 2.6버전에 가장 호환성이 좋기 때문에 버전을 낮출 것이다.

 

build.gradle 을 다음과 같이 작성 해준다.

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

group = 'com.eureka'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
    maven { url 'https://artifactory-oss.prod.netflix.net/artifactory/maven-oss-candidates' }
}

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

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}"
    }
}

tasks.named('test') {
    useJUnitPlatform()
}

 

application.yml을 작성 해준다. 

server:
  port: 8761

spring:
  application:
    name: DISCOVERYSERVICE

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

중복되는 값들이 많기 때문에 properties보단 가독성이 좋은 yml을 사용하는 것을 추천한다.

 

유레카서버는 포트는 8761로 설정하고(주로 예제로 8761을 사용한다.) eureka설정을 해주어야 하는데, register-with-eureka와 fetch-registry의 값은 default가 true기 때문에 false로 지정한다. 

유레카서버는 다른 서비스들을 찾아주는 기능을 하는데 자기 자신을 등록하면 의미도없고 역할에 맞지 않습니다. 

(주소록에 자기 번호가 저장 안되어있는 것처럼,,)

 

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

이렇게 어노테이션으로 유레카서버를 사용한다고만 적어주면 끝입니다.

 

 

http://localhost:8761로 접속 시 이런 화면이 뜬 다면 성공입니다. 

 

다음 포스팅에서는 서비스들의 설정파일을 저장해주는 Config서버를 만드려고 합니다.

 

참고 자료

https://imprint.tistory.com/m/213