Spring Cloud Gateway 커스텀 라우팅 설정 및 기본 동작 비활성화

날아올라돼지야·2024년 8월 28일
0

앞서 기본 라우팅 동작으로 실행까지 해봤는데, Spring Cloud Gateway를 사용하여 커스텀 라우팅을 설정하는 방법과 기본 라우팅 동작을 비활성화하는 방법을 알아보겠습니다.

주요 내용 요약:

  1. 커스텀 라우팅 설정:

    • RouteLocator 빈을 정의하여 특정 경로에 대한 커스텀 라우팅을 설정합니다.
    • 예를 들어, /easybank/accounts/**와 같은 경로를 사용하여 클라이언트가 더 직관적으로 API를 호출할 수 있게 합니다.
    • 경로 재작성 필터(rewrite path filter)를 사용하여 요청 경로를 적절히 변환하여 실제 마이크로서비스로 전달합니다.
  2. 기본 동작 비활성화:

    • 기본적으로, Spring Cloud Gateway는 Eureka 서버로부터 자동으로 마이크로서비스의 라우팅 정보를 가져옵니다.
    • 그러나 이 기본 동작이 필요하지 않거나 혼란을 줄 수 있는 경우, application.yml 파일에서 spring.cloud.gateway.discovery.locator.enabled 값을 false로 설정하여 이를 비활성화할 수 있습니다.
    • 이로 인해, 오직 커스텀 라우팅 설정만 활성화되어 클라이언트에게 더 일관된 경험을 제공할 수 있습니다.
  3. Java 기반 설정의 이점:

    • Java 기반 설정을 사용하여 복잡한 라우팅 로직과 필터를 보다 유연하게 정의할 수 있습니다.
    • 반면, application.yml 파일을 사용한 설정에는 제한이 있을 수 있어, 보다 복잡한 요구사항을 처리하는 데에는 Java 설정이 더 적합합니다.

구현된 코드 요약:

@Bean
public RouteLocator easybankRouteConfig(RouteLocatorBuilder builder) {
    return builder.routes()
        .route(p -> p.path("/easybank/accounts/**")
            .filters(f -> f.rewritePath("/easybank/accounts(?<segment>/.*)", "$\\{segment}"))
            .uri("lb://ACCOUNTS"))
        .route(p -> p.path("/easybank/loans/**")
            .filters(f -> f.rewritePath("/easybank/loans(?<segment>/.*)", "$\\{segment}"))
            .uri("lb://LOANS"))
        .route(p -> p.path("/easybank/cards/**")
            .filters(f -> f.rewritePath("/easybank/cards(?<segment>/.*)", "$\\{segment}"))
            .uri("lb://CARDS"))
        .build();
}

이 코드는 클라이언트가 easybank를 포함한 경로를 통해 API를 호출할 때, 해당 요청을 각 마이크로서비스로 라우팅하도록 설정합니다.

이제 클라이언트가 /easybank/accounts, /easybank/loans, /easybank/cards와 같은 경로로 요청을 보낼 수 있으며, Spring Cloud Gateway는 이를 적절한 마이크로서비스로 전달합니다. 또한, 기본적인 라우팅 동작을 비활성화하여 불필요한 경로 혼동을 줄이고, 보다 일관된 API 접근 방식을 제공할 수 있습니다.

추가 필터 적용 및 Spring Cloud Gateway에서 사용자 정의 필터 생성

1. 기본 경로 Predicate 및 필터 설명:

  • Path Predicate: 클라이언트 요청 경로가 지정된 경로와 일치하는지 확인합니다. 경로가 일치할 경우, 필터를 적용하고 실제 마이크로서비스로 요청을 전달합니다.
  • Rewrite Path Filter: 요청 경로를 재작성하여 실제 마이크로서비스로 전달하기 전에 경로를 수정합니다. 예를 들어, easybank/accounts/**와 같은 경로가 들어오면, 해당 경로를 재작성한 후, 실제 마이크로서비스로 전달합니다.

2. 다중 필터 적용:

  • Spring Cloud Gateway는 여러 필터를 사용할 수 있습니다. 예를 들어, 응답에 추가 헤더를 포함시키는 필터를 적용할 수 있습니다.
  • AddResponseHeader 필터를 사용하여 응답에 X-Response-Time 헤더를 추가하여 응답이 생성된 시간을 클라이언트에게 전달할 수 있습니다.
  1. Spring Cloud Gateway 공식 문서 참조:

    • 공식 문서를 통해 Spring Cloud Gateway에서 제공하는 다양한 필터와 프레디케이트를 확인할 수 있습니다. 이러한 문서를 통해 필요한 필터를 선택하고 구현할 수 있습니다.
    • AddResponseHeader와 같은 사전 정의된 필터는 공식 문서에서 확인할 수 있으며, 이러한 필터를 활용하여 비즈니스 요구사항을 충족할 수 있습니다.
  2. 사용자 정의 필터 필요성:

    • Spring Cloud Gateway에서 제공하는 사전 정의된 필터가 비즈니스 요구사항을 충족하지 못할 경우, 사용자 정의 필터를 만들어야 합니다.
    • 사용자 정의 필터는 Java 코드를 사용하여 직접 정의할 수 있으며, Spring Cloud Gateway의 강력한 확장 기능을 활용할 수 있습니다.

구현된 코드 요약:

@Bean
public RouteLocator easybankRouteConfig(RouteLocatorBuilder builder) {
    return builder.routes()
        .route(p -> p.path("/easybank/accounts/**")
            .filters(f -> f
                .rewritePath("/easybank/accounts(?<segment>/.*)", "$\\{segment}")
                .addResponseHeader("X-Response-Time", LocalDateTime.now().toString()))
            .uri("lb://ACCOUNTS"))
        .route(p -> p.path("/easybank/loans/**")
            .filters(f -> f
                .rewritePath("/easybank/loans(?<segment>/.*)", "$\\{segment}")
                .addResponseHeader("X-Response-Time", LocalDateTime.now().toString()))
            .uri("lb://LOANS"))
        .route(p -> p.path("/easybank/cards/**")
            .filters(f -> f
                .rewritePath("/easybank/cards(?<segment>/.*)", "$\\{segment}")
                .addResponseHeader("X-Response-Time", LocalDateTime.now().toString()))
            .uri("lb://CARDS"))
        .build();
}

이 코드에서는 각 라우트에 대해 AddResponseHeader 필터를 추가하여 응답에 현재 시간(X-Response-Time)을 포함하도록 설정했습니다.

결론:

이제 Spring Cloud Gateway에서 다양한 필터를 사용하여 요청과 응답을 처리할 수 있습니다. 또한, Spring Cloud Gateway에서 제공하는 사전 정의된 필터를 활용해 대부분의 비즈니스 요구사항을 충족할 수 있습니다. 하지만 특정 요구사항이 존재할 경우, 사용자 정의 필터를 만들어 구현할 수 있습니다.

다음 강의에서는 사용자 정의 필터를 구현하는 방법에 대해 자세히 알아보겠습니다. 감사합니다!

profile
무슨 생각하며 사니

0개의 댓글