[Spring Cloud] Spring Cloud Netflix

lin·2023년 9월 18일
0

Spring Cloud Netflix
이름이 넷플릭스~~ MSA를 잘하는 넷플릭스가 오픈소스로 내놓은 라이브러리

Spring Cloud Netflix

자동 환경 설정과 spring environment 및 다른 Spring 프로그래밍 모델 관념의 바인딩을 바탕으로 Spring boot 어플리케이션을 위한 Netflix OSS 통합을 제공한다. 몇가지 어노테이션을 통해 어플리케이션 내부의 공통 패턴을 사용하고 설정할 수 있다.
제공되는 패턴으로는 서비스 검색(Eureka), 회로 차단기(Hystrix), 지능형 라우팅(Zuul), 로드 밸런싱(Ribbon)이 포함된다.

용어 정리
Service Registration : 서비스가 자기 자신의 정보를 Eureka에 등록하는 행동
Service Registry : 서비스가 스스로 등록한 정보들의 목록
Service Discovery : 서비스 클라이언트가 요청을 보내고자 하는 대상의 정보를 서비스 레지스트리를 통해 발견하는 과정

Service Discovery: Eureka Clients

서비스 검색은 마이크로서비스 기반 아키텍처의 핵심 원칙 중 하나이다.

Eureka는 Netflix 서비스 검색 서버 및 클라이언트이다. 서버는 고가용성으로 구성 및 배포될 수 있으며, 각 서버는 등록된 서비스에 대한 상태를 다른 서버에 복제한다.

Eureka is the Netflix Service Discovery Server and Client. The Server can be configured and deployed to be highly available, with each server replicating state about the registered to the others.

프로젝트에 Eureka Clients를 추가하려면 gradle 기준으로는 이걸 추가하면 된다.

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'

classpath에 eureka-client를 포함시킴으로 해당 프로젝트는 Eureka Server에 automatically registers하게 된다.

@EnableDiscoveryClient 어노테이션을 추가하고

@EnableDiscoveryClient
@SpringBootApplication
@EnableScheduling
public class MainApplication {

}

Eureka server를 찾기 위한 config가 필요하다

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

자격 증명이 필요한 서버의 경우엔 http://user:password@localhost:8761/eureka 이처럼 작성할 수 있다.
좀더 복잡한 설정이 필요하다면 DiscoveryClientOptionalArgs 유형의 @Bean을 생성하고 여기에 ClientFilter 인스턴스를 삽입할 수 있다.

++ Status Page and Health Indicator
The status page and health indicators for a Eureka instance default to /info and /health.

기본적으로 Eureka는 Client heartbeat를 사용하여 클라이언트가 작동중인지 확인한다. 다른 모든 애플리케이션은 'UP' 이외의 상태에 있는 애플리케이션에 트래픽을 보내지 않는다.

Client는 leaseRenewalIntervalInSeconds에 정의된 값에 맞춰 HeartBeat를 주기적으로 서버에 보내 생존을 알린다. (defalut 30초)
이때 lease-expiration-duration-in-seconds에 정의된 값에 맞춰 HeartBeat가 송신되지 않은 경우 서비스를 Registry로 부터 제거한다.
해당 설정들은 Client 측에서 이뤄지며 eureka에서는

Eureka Metadata for Instances and Clinets.

기본 metadata로는 hostname, IP address, port numbers, and health check가 있다. 이는 서비스 레지스트리에 게시되고 클라이언트가 서비스에 연결하는 데 사용된다.

순정 netflix Eureka instance는 그 host name과 같은 id로 등록된다. (즉 호스트당 하나의 서비스만 있음)
이런 식으로 ::
${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}}

따라서 spring cloud를 사용하면, eureka.instance.instanceId에 고유 식별자를 제공하여 값을 재정의할 수 있다.

eureka:
  instance:
    instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

Service Discovery: Eureka Server

How to Run a Eureka Server

@EnableEurekaServer 어노테이션을 이용하면 된다.

dependencies에 추가
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'

그리고 applicaton.yml을 수정하는데

 eureka:
   instance:
     hostname: localhost
   client:
     registerWithEureka: false
     fetchRegistry: false
     serviceUrl:
       defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
   server:
     enable-self-preservation: true

DefalutZone url 설정을 통해 동일한 zone의 eureka server clstering 설정이 가능하다.

eureka.client.registerWithEureka: 본인 서비스를 eureka 서버에 등록 할지 여부.(eureka는 서버이면서 client가 될 수도 있음)
eureka.client.fetchRegistry: client 서비스가 eureka 서버로 부터 서비스 리스트 정보를 local에 caching 할지 여부

기본적으로 모든 Eureka 서버도 Eureka 클라이언트이며 피어를 찾기 위해 서비스 URL이 하나 이상 필요하다. 그래서 클라이언트 측 동작을 해제하는 것이다.

enable-self-preservation은 일시적인 네트워크 장애로 인한 서비스 해재를 막기 위한 자기 보호 모드이다.
Eureka로의 네트워크는 단절되었지만, 해당 서비스 API를 호출하는데 문제가 없는 경우가 있을수 있어서,
self-preservation 을 사용하여 registry에서 문제된 instance를 정해진 기간 동안 제거하지 않을 수 있다.
https://subji.github.io/posts/2020/08/11/springcloudeurekaregistry

Eureka Client와 Server간 커뮤니케이션

  • Self-Identification & Registration
    Instance Startup 이후 Instance 정보 Replication
    등록 이후 Instance 정보가 변경 되었을 때 Registry 정보를 갱신하기 위한 REST를 eureka.client.instance-info-replication-interval-seconds에 설정된 주기마다 호출한다 (default: 30)

  • Instance Startup 이후 Eureka server info refresh
    Eureka Server 추가, 변경, 삭제가 일어날 때 Eureka Client가 얼마나 자주 service urls를 갱신할 것인지 eureka.client.eureka-service-url-poll-interval-seconds 값으로 조정할 수 있다 (default: 0, 단 DNS를 통해 service urls를 가져오는 경우)
    eureka.instance.instance-enabled-onit 설정값을 통해 Startup 후 Traffic 받을 준비가 되었을 때 status:UP이 되도록 할 수 있다 (default: false)

참고 포스트
https://coe.gitbook.io/guide/service-discovery/eureka_2
https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/multi/multi_spring-cloud-eureka-server.html#spring-cloud-eureka-server-zones-and-regions

profile
BE

0개의 댓글