TIL

TIL 2024-08-06 Spring MSA 라이브러리

wonow_ 2024. 8. 6. 23:44

현재 작성 중인 MSA 서버 아키텍쳐


서비스 디스커버리 (feat. Eureka)

  • MSA에서 각 서비스의 위치를 동적으로 관리하고 찾아준다.
  • 각 서비스는 등록된 서버에 각자 위치를 등록, 다른 서비스는 이를 조회하여 통신한다.
  • 주요 기능
    • 서비스 등록
    • 서비스 조회
    • 헬스 체크

Eureka란

넷플릭스에서 개발한 서비스 디스커버리 서버

  • 서비스 위치 동적 관리
  • 헬스 체크
  • 여러 인스턴스 지원 - 고가용성

 

Eureka 서버를 구성하고

각 서비스가 Eureka Client 로 서버에 자신을 등록해야 사용할 수 있다.


클라이언트 사이드 로드 밸런싱 (feat. FeignClient, Ribbon)

로드 밸런싱이란

  • 네트워크 트래픽 분산 기술
  • 가용성 UP, 성능 UP
  • 종류: 클라이언트, 서버

클라이언트 로드 밸런싱이란

  • 클라이언트가 여러 서버 중 하나를 선택 후 요청
  • 클라이언트는 서버의 목록(feat. Eureka Server)을 가지고 있고, 이를 바탕으로 로드밸런싱

FeignClient란

  • Spring Cloud 가 제공하는 Http Client
  • Eureka와 같은 서비스 디스커버리와 연동하여 인스턴스 조회 및 로드 밸런싱 수행 가능

주요 특징

  • 선언적 HTTP Client: 인터페이스, 어노테이션을 사용하여 REST API 호출 가능
    • RestTemplate 와 차이
      • 한 줄 요약: RestTemplate 로 구현하면 귀찮아진다.
      • FC == FeignClient && RT == RestTemplate
      • 1. FC의 높은 추상화 및 RT의 낮은 추상화
        • FC는 인터페이스 기반으로 구현체를 사용자가 직접 정의하지 않아도 된다.
        • 서버의 구성이 바뀌면 RT는 서비스 코드를 수정해야 한다. -> Open-Closed Principle 원칙 위반 -> 유지보수 Down
          FC는 yml(Config) 만 바꿔도 된다.
      • 2. 단위 테스트 용이성
        • 단위 테스트는 딱 서비스 코드만 테스트 해야한다.
        • 근데 단위 테스트 코드에 Mock 객체를 만들 때 RestTemplate 설정 넣어주고.. 막 한다면 이것도 상당히 객체지향적이지 않은 코드가 된다.
      • 3. 예외 처리
        • 만약 Client끼리 통신을 하다 예외가 발생한다면, 타 Client 에게 요청을 보낸 Client는 요청을 받지 못하여 500 에러를 발생시킨다.
        • 500 에러를 받은 Client 가 400 번대를 반환하고 싶을 때 어떻게 해야할까?
        • RT - try-catch
        • FC - ErrorDecoder 예외 핸들러 제공
    • 그냥 Feign Client 쓰자!
  • Eureka 연동: 서비스 인스턴스 목록 동적 조회 및 로드밸런싱
  • 자동 로드 밸런싱: 내부에 Ribbon이 들어있어 자동 로드밸런싱 실행

Ribbon이란

  • Netflix 가 개발한 클라이언트 사이드 로드 밸런서
  • 다양한 로드 밸런싱 알고리즘 지원, Eureka와 같은 서비스 디스커버리와 연동 가능

주요 특징

  • 서버 리스트 제공자: Eureka 등과 같은 서비스 디스커버리에서 인스턴스 리스트를 제공받아 사용
  • 로드 밸런싱 알고리즘: 라운드 로빈, 가중치 기반 등 다양한 로드 밸런싱 알고리즘 지원
  • Failover: 요청 실패 시 다른 인스턴스로 자동 전환

API 게이트웨이 (feat. Spring Cloud Gateway)

API 게이트웨이란

  • 클라이언트의 요청을 받아 백엔드 서버로 라우팅(주), 다양한 부가 기능 제공(부)
  • 클라이언트와 서비스 간 단일 진입점 역할, 보안, 로깅, 모니터링, 요청 필터링 등 처리

주요 기능

  • 라우팅: 클라이언트 요청을 적절한 서비스로 전달
  • 인증 및 권한 부여: 요청의 인증 및 권한 검증
  • 로드 밸런싱: 여러 서비스 인스턴스 간의 부하 분산
  • 모니터링 및 로깅: 요청 및 응답을 로깅하고 모니터링
  • 요청 및 응답 변환: 요청과 응답을 변환하거나 필터링

Spring Cloud Gateway

  • Spring 프로젝트의 일환으로 개발된 API 게이트웨이, 클라이언트 요청을 적절한 서비스로 라우팅 및 다양한 필터링 기능 제공

주요 특징

  • 동적 라우팅: 요청의 URL 패턴에 따라 동적으로 라우팅
  • 필터링: 요청 전후에 다양한 작업 수행할 수 있는 필터 체인 제공
  • 모니터링: 요청 로그 및 매트릭을 통한 서비스 모니터링
  • 보안: 인증 및 권한 검증

Application 설정 예시

spring.cloud.gateway.discovery.locator.enabled = true # 서비스 디스커버리를 통해 동적으로 라우트 생성
spring.cloud.gateway.routes.id = "product-service" # 라우트 식별자
spring.cloud.gateway.routes.uri = "lb://product-service" # "product-service" 라는 이름으로 로드 밸런싱된 서비스
spring.cloud.gateway.routes.pridicates = "Path=/product/**" # product/** 로 들어오는 모든 요청 라우트 처리

 

Spring Cloud Gateway Filtering

  • 종류
    • Global Filter: 모든 요청에 대한 필터
    • Gateway Filter: 특정 라우트에 대한 필터
  • Filter 구현 방법
    • 위 2 종류 중 1 택 후 구현체 설정, filter 메서드 오버라이드
  • 필터 주요 객체
    • Mono
      • 리액티브 프로그래밍에서 0 또는 1개의 데이터를 비동기적으로 처리
      • Mono<Void> 는 아무 데이터도 반환하지 않음을 뜻함
    • ServerWebExchange
      • HTTP 요청 및 응답을 캡슐화한 객체
    • GatewayFilterChain
      • GatewayFilterChain 은 여러 필터를 체인처럼 연결
      • chain.filter(exchange) -> 다음 필터로 요청 전달
  • 필터 시점 별 종류
    • PreFilter
      • 요청 전 필터
    • PostFilter
      • 응답 전 필터