[MSA] 서비스 디스커버리 / 로드밸런싱 / 서킷브레이커 / API GW

왕감자·2025년 2월 6일

2025 내일배움캠프

목록 보기
4/39
post-thumbnail

서비스 디스커버리 (Eureka)

마이크로 서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리하고 찾아주는 기능

  • 모든 서비스 인스턴스의 위치를 저장하는 중앙 저장소
  • 서비스 인스턴스의 상태를 주기적으로 확인하여 가용성 보장
  • 클라이언트 애플리케이션은 Eureka 서버에서 필요한 서비스 위치 조회

  • Eureka 클라이언트 설정해야 됨 (서비스 등록)
    • 각 서비스는 Eureka 서버에 자신을 등록
    • spring-cloud-starter-netflix-eureka-client 의존성 추가
    • application 파일에 spring: application: name 지정 되어있어야 함

  • [의존성]
    • 서버 : Eureka Server
    • 클라이언트 : Eureka Discovery Client + Spring Web
  • [Spring Boot 어플리케이션 설정]
    • @EnableEurekaServer



클라이언트 사이드 로드 밸런싱 (Feign Client / Ribbon)

  • 로드밸런싱: 네트워크 트래픽을 여러 서버로 분산시켜 서버 부하를 줄임
    • 클라이언트 사이드 로드 밸런싱: 클라이언트가 직접 여러 서버 중 하나를 선택하여 요청
    • 서버 사이드 로드 밸런싱
  • FeignClient
    • Spring Cloud에서 제공하는 HTTP 클라이언트, 선언적으로 RESTful 웹 서비스 호출 (인터페이스와 어노테이션 사용)
    • 서비스 디스커버리와 연동하여 동적으로 서비스 인스턴스 조회하고 로드밸런싱 수행
    • Ribbon(로드밸런서)이 통합되어 있어 자동으로 로드밸런싱 수행
  • FeignClient & Ribbon 사용
    • [의존성]
      • Eureka-client
      • OpenFeign
    • [Spring Boot 어플리케이션 설정]
      • @EnableFeignClients
    • FeignClient 인터페이스 작성

Order 서비스가 Product 서비스 호출하여 상품 정보 가져옴
Order 서비스 인스턴스 1 / Product 서비스 인스턴스 3

  1. Order 서비스 실행 : Eureka 서버에서 Product 서비스 인스턴스 목록 가져옴
  2. Product 서비스 호출 : FeignClient를 사용하여 호출
  3. Ribbon을 통한 로드밸런싱 : FeignClient는 Ribbon을 통해 3개의 Product 인스턴스 중 하나를 선택하여 호출, RR 알고리즘을 사용하여 요청을 순차적으로 분배
  4. 응답 처리 : 선택된 Product 인스턴스에서 응답을 받아 Order서비스에 반환, 최종적으로 클라이언트에 응답




서킷브레이커 (Resilience4j)

마이크로서비스 간의 호출 실패를 감지하고 시스템의 전체적인 안정성을 유지하는 패턴

  • 상태변화 : 클로즈드→오픈→하프-오픈
  • Fallback : 호출 실패 시 대체 로직을 제공, 시스템 안정성 확보

Resilience4j 의존성은 Srping starter에서 추가 X

dependencies {
    implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
	implementation 'org.springframework.boot:spring-boot-starter-aop'
}
  • 스프링 스타터에서 제공하는 Resilience4j에는 추상화 계층을 포함
    - 실제 구현체가 포함되어있지 않음, 추상화 계층에 맞춰 구현체를 만들어야 함

Fallback

외부 서비스 호출 실패 시 대체 로직을 제공하는 메서드

  • 다른 서비스로 장애 전파 방지
@Service
public class MyService {

    @CircuitBreaker(name = "myService", fallbackMethod = "fallbackMethod")
    public String myMethod() {
        // 외부 서비스 호출
        return externalService.call();
    }

    public String fallbackMethod(Throwable t) {
        return "Fallback response";
    }
}

  • [의존성]
    • Spring Boot Actuator
    • Prometheus
    • implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
    • implementation 'org.springframework.boot:spring-boot-starter-aop'




API Gateway (Spring Cloud Gateway(3), Zuul(2))

클라이언트 요청을 받아 백엔드 서비스로 라우팅하고 다양한 부가 기능을 제공하는 중간 서버

  • 클라이언트 - 서비스 간 단일 진입점, 보안, 로깅, 모니터링, 요청 필터링 등 처리

라우팅 설정

application.yml

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  # 서비스 디스커버리를 통해 동적으로 라우트를 생성하도록 설정
      routes:
        - id: users-service  # 라우트 식별자
          uri: lb://users-service # 'users-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅
          predicates:
            - Path=/users/** # /users/** 경로로 들어오는 요청을 이 라우트로 처리
        - id: orders-service  # 라우트 식별자
          uri: lb://orders-service  # 'orders-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅
          predicates:
            - Path=/orders/** #/orders/** 경로로 들어오는 요청을 이 라우트로 처리

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

필터링

  • Global Filter : 모든 요청
  • Gateway Filter : 특정 라우트에만
    • GlobalFilter or GatewayFilter 인터페이스 구현 -> filter 메서드 오버라이드

  • [의존성]
    • Reactive Gateway
    • Spring Boot Actuator
    • Eureka Discovery Client

0개의 댓글