백엔드 Backend/서버 Server

API 게이트웨이 서비스 - (1) Netfilx Zuul

달래dallae 2025. 1. 6. 13:28

1.  API 게이트웨이 서비스

사용자의 라우팅 설정에 따라서 클라이언트를 대신해 요청하고 응답을 받으면 클라이언트에게 전달해주는 proxy 역할 

시스템 내부구조 숨기고 외부의 요청에 대해 적절한 형태로 가공해 응답 가능 

 

모바일/웹 앱에서 요청한 것(프론트 형태에 상관없이)을 API게이트웨이가 각각의 마이크로 서비스로 요청되는 모든 정보에 대해 일괄처리

클라이언트는 마이크로서비스를 직접 호출하지 않고, API 게이트웨이만 상대. 

 

 

 

 

스프링 클라우드에서 MSA간의 통신 방법

1. RestTemplate 

2. Feign Client

 

 

로드밸런서 위치?

1) Netflix Ribbon : 현재는 비동기처리가 잘 되지 않아 사용하지 않음 -> 현재는 Spring cloud loadbalancer

- 외부 마이크로 서비스를 호출하기위해 ip와 port로  명시하는 것이 아니라, 서비스 이름으로 호출

- 클라이언트 사이드 로드밸런서 : 클라이언트 프로그램안에서 이동하고자하는 마이크로서비스의 주소값을 직접 관리 

- Health Check 가능 (정상작동하는지)

 

2) Netflix Zuul : Springboot 2.4에서도 사용할수 없는 상태  -> 현재는 Spring cloud gateway

- 라우팅, API 게이트웨이

- 동기 방식 지원 -> functional / 비동기 방식 지원하지 않음 => Spring Cloud Gateway 사용

 

 

 

 

--- 실습 ---

zuul 사용 (2.3 버전대까지만 사용 가능)

cloudRouting에 zuul 의존성 추가

 

 

yml파일

server:
  port: 8000

spring:
  application:
    name: zuul-service

zuul:
  routes:
    first-service:
      path: /first-service/**
      url: http://localhost:8081
    second-service:
      path: /second-service/**
      url: http://localhost:8082

 

 

이렇게 설정한 경우, 8081서비스와 8082 서비스가 모두 정상 작동할 경우에

zuul서비스의 포트 한번에 두 가지 서비스를 모두 호출할 수 있다.

 

예를들어 http://localhost:8000/first-service/welcome = http://localhost:8081/welcome

 

 

Zuul 사전 필터 생성

@Component
@Slf4j
public class ZuulLoggingFilter 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 {
        log.info("******************** printing logs : ");

        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info("******************** " + request.getRequestURI());

        return null;
    }

}
2025-01-06 13:25:56.344  INFO 15108 --- [nio-8000-exec-1] c.example.zuulservice.ZuulLoggingFilter  : ******************** printing logs : 
2025-01-06 13:25:56.344  INFO 15108 --- [nio-8000-exec-1] c.example.zuulservice.ZuulLoggingFilter  : ******************** /first-service/welcome
2025-01-06 13:26:11.856  INFO 15108 --- [nio-8000-exec-3] c.example.zuulservice.ZuulLoggingFilter  : ******************** printing logs : 
2025-01-06 13:26:11.856  INFO 15108 --- [nio-8000-exec-3] c.example.zuulservice.ZuulLoggingFilter  : ******************** /second-service/welcome

 

주소에 접속하면 사전 필터에서 설정한 로그를 확인할 수 있다.