Spring Cloud

3. Eureka - [Spring Cloud를 활용한 MSA 기초 온라인 강의 실습]

앞선 리본 예제에서 서버 목록을 yml에 직접 넣었는데 이를 자동화 할 방법으로 유레카를 사용하게된다.

서버가 새롭게 시작되면 그것을 감지하여 목록에 자동으로 추가되고 서버가 종료되면 자동으로 목록에서 삭제하는 기능을 유레카가 제공한다고 생각하면된다.

 

유레카에는 유레카 서버와 유레카 클라이언트가 있습니다.

유레카 서버는 registry로 유레카에 등록된 서비스들을 관리한다 보시면 됩니다.

유레카 클라이언트는 각각의 서버 혹은 인스턴스의 시작시 유레카 서버에 자동으로 자신의 상태를 등록(설정으로 컨트롤 가능)

주기적 heartBeat를 통해서 유레카 서버에 자신이 살아 있음을 알리게 됩니다.

서버 측 설정

eureka.server.enable-self-preservation

  • 일시적인 네트워크 장애로 인한 서비스 해제 막기 위한 자기 보호 모드 (디폴트 true, 운영에선 반드시 true 로 설정 필요)
  • 원래는 해당 시간안에 하트비트가 일정 횟수 이상 들어오지 않아야 서비스 해제하는데 false 설정 시 하트비트가 들어오지 않으면 바로 서비스 제거

eureka.server.response-cache-update-interval-ms

  • Eureka Server 의 캐싱 업데이트 주기 (디폴트 30,000ms)
  • Eureka Server 실행 후 /eureka/apps API 실행 시 아무것도 나오지 않음 클라이언트 인스턴스 실행 수 /eureka/apps 실행 시 여전히 아무것도 나오지 않음 30초가 지나고 /eureka/apps 실행 시 클라이언트 인스턴스 조회됨.
  • Eureka Server 의 대시보드(유레카서버:8761/) 에 등록된 인스턴스가 표시될때에는 캐시 사용하지 않음
  • eureka.client.registry-fetch-interval-seconds 와 비교하여 볼 것

eureka.server.eviction-interval-timer-in-ms

  • 클라이언트로부터 하트비트가 계속 수신 되는지 점검 (디폴트 60초)

서버/클라이언트 측 모두 설정

eureka.client.register-with-eureka

  • 레지스트리에 자신을 등록할지에 대한 여부 (디폴트 true)
  • 클러스터링 모드의 Eureka Server구성은 서로 peering 구성이 가능. (Eureka Server 설정에 정의된 peering 노드를 찾아서 레지스트리 정보의 sync 를 맞춤)
  • 독립 실행형 모드(standalone)에서는 peering 실패가 발생하므로 Eureka Client측 동작을 끔

eureka.client.fetch-registry

  • 레지스트리에 있는 정보를 가져올지에 대한 여부 (디폴트 true)
  • true 로 설정 시 검색할 때마다 Eureka Server 를 호출하는 대신 레지스트리가 로컬로 캐싱됨
  • 30초마다 Eureka Client 가 유레카 레지스트리 변경 사항 여부 재확인함

클라이언트 측 설정

eureka.client.registry-fetch-interval-seconds

  • 서비스 목록을 설정한 시간마다 캐싱 (디폴트 30초)

eureka.client.disable-delta

  • 캐싱 시 변경된 부분만 업데이트할 지 여부 (디폴트 false)
  • false 로 설정 서 대역폭 낭비이므로 true 로 설정할 것

eureka.instance.lease-renewal-interval-in-seconds

  • Eureka Server 로 설정된 시간(second)마다 하트비트 전송 (디폴트 30초)

eureka.instance.lease-expiration-duration-in-seconds

  • 디스커버리는 서비스 등록 해제 하기 전에 마지막 하트비트에서부터 설정된 시간(second) 동안 하트비트가 수신되지 않으면 서비스 등록 해제 (디폴트 90초)
  • 단, 유레카 인스턴스가 정상적으로 종료된 경우는 레지스트리에서 바로 제거
  • 이 값은 lease-renewal-interval-in-seconds 보다 커야 함

등 여러 설정이 더 있습니다. 

 

유레카는 서버의 죽음은 어플리케이션 전체가 오작동하게 되기 때문에 이중화를 진행하는데 이를 피어 인식이라는 방식을 통해서 해결한다. (보다 더 자세한 내용은 https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-eureka-server.html)

# Two Peer Aware Eureka Servers
---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2/eureka/

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1/eureka/
      
      
      
 ---------------------------------------------------------
 
 # Three Peer Aware Eureka Servers
 eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1/eureka/,http://peer2/eureka/,http://peer3/eureka/

---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2

---
spring:
  profiles: peer3
eureka:
  instance:
    hostname: peer3

 

실습

 

1. 유레카 서버 설정

스프링 부트에 유레카 서버 의존성을 추가하고 @EnableEurekaServer을 통해서 auto config되면서 유레카 서버가 실행된다.

ext['springCloudVersion'] = 'Finchley.SR2'

...

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-server')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

 

2. 유레카 클라언트 등록

1) 유레카 클라이언트 의존성 추가

ext['springCloudVersion'] = 'Finchley.SR2'

...

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client') // To use Eureka client
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

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

 

2) 유레카 서버의 주소를 defaltzone으로 설정하여 서버와 연결한다.

eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka  # default address
@SpringBootApplication
@EnableEurekaClient
public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class);
    }
}

3) 기존 리본 실습에서 설정햇던 listOfServers설정을 제거한다.

product:
  ribbon:
    MaxAutoRetries: 0
    MaxAutoRetriesNextServer: 1

 

유레카에 정상적으로 등록된 것을 확인할 수 있다.

Reference

https://www.youtube.com/watch?v=iIqamVxYmUk&list=PL9mhQYIlKEhdtYdxxZ6hZeb0va2Gm17A5&index=6