Microservices Architecture / / 2024. 12. 16. 09:43

Netflix Zuul

Netflix ZuulAPI Gateway 역할을 하는 서버 애플리케이션으로, 마이크로서비스 아키텍처에서 요청 라우팅, 로드 밸런싱, 보안 등의 기능을 제공하는 도구입니다.

Zuul은 Netflix의 OSS(Open Source Software) 프로젝트 중 하나로 개발되었으며, 주로 Spring Cloud Netflix 프로젝트와 함께 사용됩니다.


Zuul의 핵심 역할

Zuul은 클라이언트 요청과 여러 마이크로서비스 사이에서 중간 관문 역할을 합니다.

  1. 라우팅 (Routing)

    • 클라이언트의 요청을 적절한 서비스로 전달합니다.
    • 예: /api/users → 사용자 서비스, /api/orders → 주문 서비스
  2. 로드 밸런싱 (Load Balancing)

    • 여러 인스턴스 중 하나로 요청을 균등하게 분산시킵니다.
    • Ribbon과 함께 사용하면 로드 밸런싱이 가능합니다.
  3. 필터링 (Filters)

    • 요청과 응답에 대해 사전 또는 사후 처리 기능을 제공합니다.
    • 예: 인증/인가 확인, 로깅, 헤더 추가/변경
  4. 보안(Security)

    • 인증/인가와 관련된 필터를 통해 보안 로직을 수행합니다.
    • 예: 특정 IP 차단, 토큰 검증
  5. Monitoring & Analytics

    • API 사용 현황을 모니터링하고, 로그를 수집할 수 있습니다.

Zuul의 주요 특징

  1. 동적 라우팅

    • Zuul은 요청 경로(Route)를 동적으로 설정할 수 있습니다.
    • 예를 들어, 특정 조건에 따라 다른 서비스로 요청을 라우팅할 수 있습니다.
  2. 강력한 필터 기능

    • Zuul은 필터를 통해 요청과 응답을 조작할 수 있습니다.
    • 필터 타입:
      • Pre Filter: 요청이 라우팅되기 전에 실행
      • Routing Filter: 요청을 라우팅하는 중에 실행
      • Post Filter: 요청이 완료된 후 실행
      • Error Filter: 오류 발생 시 실행
  3. Spring Cloud Netflix 통합

    • Zuul은 Spring BootSpring Cloud Netflix와 쉽게 통합됩니다.
    • Eureka와 함께 사용하면 서비스 등록 및 발견 기능도 지원됩니다.

Zuul과 Eureka, Ribbon의 통합

  • Eureka: 서비스 등록 및 발견
  • Ribbon: 클라이언트 사이드 로드 밸런서
  • Zuul: API Gateway로 라우팅 및 필터링

동작 예시:

  1. 클라이언트 → Zuul에게 요청 (/api/users)
  2. Zuul은 Eureka에서 "User 서비스"의 위치를 찾음
  3. Zuul은 Ribbon을 통해 요청을 여러 인스턴스 중 하나로 라우팅
  4. User 서비스가 응답을 반환 → Zuul → 클라이언트

Zuul 필터 예시 (Spring Cloud Netflix Zuul)

1. 의존성 추가

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

2. Zuul 설정 추가 (application.yml)

zuul:
  routes:
    user-service:
      path: /api/users/**
      serviceId: user-service
  prefix: /api
  • 라우트 설정: /api/users/** 요청은 user-service로 전달
  • prefix: /api를 공통 경로로 사용

3. 필터 구현

@Component
public class PreFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre"; // 사전 필터
    }

    @Override
    public int filterOrder() {
        return 1; // 필터 실행 순서
    }

    @Override
    public boolean shouldFilter() {
        return true; // 항상 필터 실행
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        System.out.println("Pre Filter: " + request.getMethod() + " " + request.getRequestURL());
        return null;
    }
}

Zuul vs Spring Cloud Gateway

  • Zuul은 Netflix OSS 기반의 API Gateway입니다.
  • Spring Cloud Gateway는 Spring 팀이 개발한 새로운 API Gateway로, 더 나은 성능과 확장성을 제공합니다.
  • Spring Cloud Gateway는 리액티브(Non-Blocking) 기반이기 때문에 최신 프로젝트에서는 이를 더 많이 사용합니다.

정리

Netflix Zuul은 마이크로서비스에서 API Gateway 역할을 수행하며,
라우팅, 로드 밸런싱, 보안, 필터링 기능을 제공합니다.

  • Spring Cloud Netflix와 통합되어 Eureka, Ribbon과 함께 사용할 수 있습니다.
  • 필터를 통해 다양한 요청/응답 전후 처리를 수행할 수 있습니다.

최근에는 Spring Cloud Gateway가 Zuul을 대체하는 추세이지만, Zuul은 여전히 많은 프로젝트에서 사용되고 있습니다.

'Microservices Architecture' 카테고리의 다른 글

Spring Cloud Gateway  (4) 2024.12.16
서비스 게이트웨이(Service Gateway)  (0) 2024.12.16
링 버퍼(Ring Buffer)  (0) 2024.12.13
Circuit Breaker(서킷 브레이커)  (1) 2024.12.13
폴백(Fallback)  (0) 2024.12.13
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유