[DEV] 기록

[Spring Cloud] Spring Cloud 정리

꾸준함. 2022. 10. 31. 01:28

개요

최근에 MSA와 함께 Spring Cloud를 학습하고 있어 Spring Cloud 하위 프로젝트들 중 자주 쓰이는 프로젝트들 위주로 개념 정리해보겠습니다.

 

1. Spring Cloud란?

  • 마이크로서비스 아키텍처를 지원하기 위한 프레임워크
  • 공식 사이트: https://spring.io/projects/spring-cloud
  • Spring Boot와 Spring Cloud와 연동돼서 개발이 진행되기 때문에 Spring Boot 환경에서 개발하는 것이 필수
    • 버전 디펜더시를 가짐
    • ex) Spring Boot 2.4.x, 2.5.x는 Spring Cloud 2020.0.x 버전을 사용 (그 미만 버전들은 호환 불가능)
    • 최신 버전인 2.6.x와 2.6.x는 Spring Cloud 2021.0.x 버전만 연동 가능
  • Spring Cloud 다양한 하위 프로젝트 존재
  • Spring Cloud를 이용하게 되면 환경설정 관리, 서비스 검색, 회복성 처리, 라우팅, 프록시, 기타 등등의 서비스를 사용함에 있어서 필요한 분산 시스템에 빠르게 애플리케이션을 개발하는 것에 목적을 두고 Spring Cloud가 만들어짐
  • 환경 설정을 위해서는 Spring Cloud Config Server가 필요
    • 다양한 microservice에서 사용할 수 있는 어떠한 정보를 CloudConfig이란 서버를 통해가지고 외부의 저장소에 환경설정 정보를 집어넣을 수 있음 (gateway ip, 서버가 가지고 있어야 할 token 정보 등등)
    • 변경된 내용이 있더라도 마이크로서비스를 다시 빌드하고 재기동하는 방식이 아니라 외부 저장소에 있는 자료만 변경하면 됨에 따라 유지보수 측면에서 편리
  • 서비스 등록과 위치 정보 확인 및 검색을 위해 Netflix Eureka 서버 사용 (Naming 서버)
  • Netflix Eureka 서버와 함께 서버에 들어온 요청 정보를 분산하기 위해 Ribbon 혹은 Spring Cloud Gateway를 사용 (Load Balancing과 Gateway 기능)
    • Gateway 서버도 Naming Server인 Netflix Eureka 서버에 등록하여 위치를 검색하는 용도로 사용
  • 각각의 마이크로서비스 간 통신을 위해 FeignClient 사용
  • 분산 추적을 위해 Spring Cloud Sleuth 활용하여 Zipkin 적용
  • 장애를 복구하기 위해 Hystrix을 통해 구현 (Fault Tolerant)

 

2. Spring Cloud Netflix Eureka

  • Service Discovery (외부에서 다른 어떤 서비스들이 마이크로서비스들을 검색하기 위해 존재하는 서비스)
    • Key-Value 형식으로 서비스(key)의 위치(value)를 저장
    • 등록 및 검색을 지원
  • 마이크로서비스가 우선 Eureka 서버에 자신의 위치 정보를 등록
    • Client가 Load Balancer 혹은 Api Gateway를 통해 요청하면 해당 요청 정보가 Service Discovery에 전달돼서 필요한 정보의 위치를 파악
    • Service Discovery는 요청한 위치를 반환
    • Api Gateway가 반환받은 위치 정보를 기반으로 요청 전달

 

3. Spring Cloud Gateway

 

3.1 Api Gateway Service

  • 사용자가 설정한 routing 설정에 따라서 각각 end-point에 client 대신 요청하고 반환 값을 client에 전달해주는 proxy 역할
  • 시스템의 내부 구조는 숨기고 외부의 요청에 대해서 적절한 형태로 가공해서 응답할 수 있는 장점을 지님
  • 제공하는 기능
    • 인증 및 권한 부여
    • 서비스 검색 통합
    • 응답 캐싱
    • 정책, 회로 차단기 및 QoS 다시 시도
    • 속도 제한
    • 부하 분산
    • 로깅, 추적, 상관관계
    • 헤더, 쿼리 문자열 및 청구 변환
    • IP 허용 목록에 추가

 

3.2 Spring Cloud에서의 MSA 간 통신

  • RestTemplate
  • Feign Client
    • Eureka 서버에 등록된 마이크로서비스 이름만 가지고 API를 호출할 수 있는 것이 장점

 

3.3 Netflix Ribbon

  • Client-side Load Balancer
  • 서비스 이름으로 호출 가능
  • health check 기능 제공
  • 비동기화 처리가 잘 안 되기 때문에 최근에는 Spring Cloud Gateway를 주로 사용
    • Spring Boot 2.4.x부터는 maintenance 상태

 

3.4 Spring Cloud Gateway

  • Netflix Zuul Service를 대체하는 서비스이며 비동기화 처리도 지원
  • Spring Cloud Gateway 내부 동작 과정
    • client 요청 -> gateway handler mapping -> predicate(요청에 대한 사전 조건 분기) -> pre filter -> business logic -> post filter -> gateway handler mapping -> client 
  • Eureka와 연동할 경우 Client 요청이 Api Gateway로 도달한 뒤 Eureka 서버로부터 마이크로서비스의 위치 정보를 반환받은 뒤 해당 마이크로 서비스로 요청을 전달 후 응답 값을 클라이언트에 반환
  • Eureka와 연동할 경우 Discover Server에 등록된 이름으로 uri를 등록할 수 있어 클라우드 환경에서 인스턴스가 재기동되어 주소가 변경되었더라도 Eureka의 HeartBeat 체크 기능을 통해 위치 정보를 확인 가능

 

4. Spring Cloud Config

  • 분산 시스템에서 서버, 클라이언트 구성에 필요한 설정 정보(application.yml)를 외부 시스템에서 관리
  • 하나의 중앙화 된 저장소에서 구성요소 관리 가능
  • 각 서비스를 다시 빌드하지 않고 바로 적용 가능
  • spring boot actuator (Metric 수집을 위한 http End point 제공) 
    • actuator refresh (각각의 microservice refresh api 호출해야 하는 일은 번거로움)
    • Spring Cloud Bus 연동 시 단 한 번의 api 호출로 해결 (actuator busrefresh)
  • 애플리케이션 배포 파이프라인을 통해 DEV-UAT-PROD 환경에 맞는 구성 정보 사용
    • 각 환경마다 db 정보가 다를 수도 있고
    • 테스트하기 위한 value 정보가 다를 수도 있고
    • gateway ip가 다를 수도 있음
    • 필요한 환경에 따라 자유롭게 변경 가능
  • application명이 정의되어 있지 않을 경우 application.yml을 기준으로 환경 설정
  • application명이 정의되어 있지만 profile이 정의되어 있지 않을 경우 application-name.yml을 기준으로 환경 설정
  • application명과 함께 profile명도 정의되어 있을 경우 application-name-<profile>.yml 기준으로 환경 설정

 

5. Spring Cloud Bus

 

5.1 메시지 브로커

  • RabbitMQ
    • 메시지 브로커
    • 초당 20+ 메시지를 소비자에게 전달
    • 메시지 전달 보장, 시스템 간 메시지 전달
    • 브로커, 소비자 중심
  • Kafka 프로젝트
    • Apache Software Foundation이 Scalar 언어로 개발한 오픈 소스 메시지 브로커 프로젝트
    • 분산형 스트리밍 플랫폼
    • 대용량의 데이터를 처리 가능한 메시징 시스템
    • 초당 100K+ 이상의 이벤트 처리
    • Pub/Sub, Topic 메시지 전달
    • Ack를 기다리지 않고 전달 가능
    • 생산자 중심

 

5.2 Spring Cloud Bus

  • 분산 시스템의 노드를 경량 메시지 브로커와 연결 (RabbitMQ와 같은 경량 메시지 브로커)
  • 상태 및 구성에 대한 변경 사항을 연결된 노드에게 전달 (Broadcast)
  • AMQP(Advanced Message Queuing Protocol)을 이용
    • 메시지 지향, 큐잉, 라우팅 (P2P, Publisher-Subscriber), 신뢰성, 보안
    • Erlang, RabbitMQ에서 사용 
    • Spring Cloud Config Server가 업데이트 후 actuator busrefresh api를 호출하면 AMQP 프로토콜을 이용하여 Spring Cloud Bus에 연결된 모든 마이크로서비스 설정 정보를 업데이트
    • Spring Cloud Bus에 연결된 어떠한 서비스에 호출하더라도 모든 서비스에 적용

 

6. Feign Web Service Client

  • Feign Client
    • HTTP Client
    • Rest Call을 추상화 한 Spring Cloud Netflix 라이브러리
  • 사용 방법
    • 호출하려는 HTTP Endpoint에 대한 interface 생성
    • @FeignClient 선언
  • Load balanced 지원
  • Eureka 서버에 등록된 애플리케이션에 RestTemplate보다 간단하게 호출할 수 있는 점이 장점

 

6.1 RestTemplate을 통해 HTTP Get 메서드 호출

 

String orderUrl = String.format(environment.getProperty("order_service.url"), userId);
    ResponseEntity<List<ResponseOrder>> ordersResponse = restTemplate.exchange(orderUrl
    , HttpMethod.GET
    , null
    , new ParameterizedTypeReference<List<ResponseOrder>>() {
});

 

6.2 Feign Client를 통해 동일 메서드 호출 (사용하기 위해서는 @EnableFeignClients 어노테이션 추가 필수)

 

List<ResponseOrder> orders = getOrdersByRestTemplate(userId);
@FeignClient(name = "order-service")
public interface OrderServiceClient {

    @GetMapping("/order-service/{userId}/orders")
    List<ResponseOrder> getOrders(@PathVariable String userId);
}

 

7. CircuitBreaker와 Resilience4J

8. Spring Cloud Sleuth + Zipkin을 이용한 Microservice의 분산 추적

 

아래 링크에 잘 정리되어 있으므로 참고하시면 좋을 것 같습니다.

 

https://jaimemin.tistory.com/2201

 

[MSA] 11번가 Spring Cloud 기반 MSA로의 전환 정리

개요 이전 게시글 https://jaimemin.tistory.com/2200에 이어서 이번 게시글에서도 인상 깊게 본 MSA 관련 유튜브 영상을 요약/정리해보겠습니다. [MSA] 우아콘 2020 배달의민족 마이크로서비스 여행기 정리

jaimemin.tistory.com

 

8. 참고

 

인프런 - Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

 

 

 

반응형