Netflix Zuul은 API 게이트웨이 및 프록시 서버 역할을 하는 Netflix OSS(Open Source Software)의 라이브러리입니다. 주로 마이크로서비스 아키텍처에서 클라이언트 요청을 라우팅하고 필터링하기 위해 사용됩니다. Zuul은 Netflix의 다른 도구(Eureka, Ribbon 등)와 통합되어 강력한 API 게이트웨이 솔루션을 제공합니다.
Zuul의 주요 역할
라우팅 (Routing):
- 클라이언트 요청을 적절한 백엔드 마이크로서비스로 전달.
- URL 패턴에 따라 경로를 매핑하거나 서비스 등록(Discovery Service)을 통해 동적으로 라우팅.
- 예:
/users/**
요청을 사용자 서비스로 전달.
로드 밸런싱 (Load Balancing):
- Netflix Ribbon과 통합하여 여러 서비스 인스턴스 사이에서 요청을 분산.
필터링 (Filtering):
- 요청 및 응답을 인터셉트하여 필요한 작업(인증, 로깅, 데이터 변환 등)을 수행.
- 필터는 요청 전/후(before/after)에 작동 가능.
보안 및 인증 (Security and Authentication):
- 요청을 처리하기 전에 API 토큰이나 자격 증명 확인.
- 요청이 유효하지 않을 경우 거부 가능.
모니터링 및 로깅 (Monitoring and Logging):
- 요청, 응답, 오류 로그를 수집하여 분석 가능.
서비스 장애 대처 (Fallback):
- Hystrix와 함께 사용하여 서비스 장애가 발생하면 적절한 대체 응답(fallback)을 제공.
Zuul의 주요 구성 요소
Zuul은 주로 필터를 기반으로 동작합니다. 필터는 요청과 응답 흐름에 개입하여 다양한 작업을 수행합니다.
필터 종류:
- Pre Filter:
- 요청이 백엔드 서비스로 전달되기 전에 실행.
- 인증, 요청 검증, 로깅 등에 사용.
- Routing Filter:
- 요청을 적절한 백엔드 서비스로 라우팅.
- Post Filter:
- 응답이 클라이언트로 전달되기 전에 실행.
- 응답 데이터 가공, 로깅 등에 사용.
- Error Filter:
- 요청 처리 중 오류가 발생하면 실행.
- 에러 처리, 대체 응답 제공.
- Pre Filter:
구현 방식:
- Zuul 필터는 Java로 작성되며,
ZuulFilter
클래스를 상속하여 구현. - 필터의 우선순위와 적용 조건을 설정 가능.
- Zuul 필터는 Java로 작성되며,
@Component
public class PreFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre"; // 필터 타입 (pre, routing, post, error)
}
@Override
public int filterOrder() {
return 1; // 필터 우선순위
}
@Override
public boolean shouldFilter() {
return true; // 필터 실행 여부
}
@Override
public Object run() throws ZuulException {
// 필터 로직 구현
System.out.println("Pre Filter executed!");
return null;
}
}
Zuul의 아키텍처
Zuul은 클라이언트와 백엔드 서비스 간의 요청 흐름을 제어합니다.
- 클라이언트 요청 → Zuul 게이트웨이:
- 클라이언트는 Zuul 게이트웨이를 통해 요청을 보냅니다.
- Zuul → 서비스 디스커버리 (예: Eureka):
- Zuul은 서비스 디스커버리를 통해 백엔드 서비스의 위치를 조회.
- Zuul → 백엔드 서비스:
- 요청을 적절한 서비스로 라우팅하고 응답을 받아 클라이언트로 전달.
Zuul의 Spring Boot 통합
Zuul은 Spring Cloud Netflix를 통해 간단히 통합할 수 있습니다.
pom.xml 의존성
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml
zuul:
routes:
user-service:
path: /users/**
serviceId: user-service # Eureka에서 등록된 서비스 ID
order-service:
path: /orders/**
serviceId: order-service
Zuul 게이트웨이 애플리케이션
@SpringBootApplication
@EnableZuulProxy // Zuul 프록시 활성화
public class ZuulGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulGatewayApplication.class, args);
}
}
Netflix Zuul 1 vs Zuul 2
- Zuul 1:
- 동기식 기반.
- 요청 처리 속도가 느릴 수 있음.
- Spring Cloud Netflix에서 주로 사용.
- Zuul 2:
- 비동기 및 논블로킹(Non-blocking) 기반.
- 더 나은 성능과 확장성을 제공.
- Netflix 내부에서 사용되지만, Spring Cloud 지원은 제한적.
Zuul과 Spring Cloud Gateway 비교
- Zuul:
- Netflix OSS 기반.
- 비교적 오래된 기술(Zuul 1은 동기 방식).
- Spring Cloud Gateway:
- Spring 프로젝트로 개발됨.
- 비동기 및 리액티브 지원.
- Zuul의 대안으로 사용 중.
Zuul은 마이크로서비스 환경에서 API 요청을 효율적으로 관리하는 데 중요한 역할을 하며, 특히 라우팅, 인증, 필터링을 유연하게 처리할 수 있다는 점에서 유용합니다. 추가적으로 궁금한 점이 있으면 말씀해주세요!
'MSA' 카테고리의 다른 글
MSA에서의 필터(Filter)와 인터셉터(Interceptor) (0) | 2024.12.16 |
---|---|
refresh (0) | 2024.12.16 |
폴백(Fallback) (0) | 2024.12.13 |
Resilience4j (0) | 2024.12.13 |
allow-bean-definition-overriding (1) | 2024.12.11 |