본문 바로가기
Web/Spring

[Spring Cloud] API Gateway

by Geunny 2022. 8. 26.
반응형

본 내용은 인프런에 Dowon Lee 님의 강의내용 간략하게 정리한 내용입니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) - 인프런 | 강의

Spring framework의 Spring Cloud 제품군을 이용하여 마이크로서비스 애플리케이션을 개발해 보는 과정입니다. Cloud Native Application으로써의 Spring Cloud를 어떻게 사용하는지, 구성을 어떻게 하는지에 대해

www.inflearn.com

 

API Gateway 란?

- Spring Cloud 에서 사용되는 로드벨런서 역할을 하는 API

- Netflix 에서 사용되었던 Zuul Service의 확장된 서비스이다.

- Zuul 서비스의 신규개발은 더이상 진행되지 않는다 함.

 

Spring Cloud gateway 의 역할.

 

- 로드밸런서의 역할

- 사용자가 Spring Cloud gateway 의 호스트/포트 정보로 데이터를 요청하게 됨.

- gateway 에 다른 마이크로서비스(이하MS)의 url을 등록하여 사용함.

- 요청 url에 따라 gateway는 등록된 MS의 host 정보를 찾고 해당 서비스로 데이터를 요청.

 

1. Eureka를 사용하지 않고 구성해보기.

 

먼저 gateway의 사용법을 익히기 위해 Eureka 서버에 등록하지 않은 상태로 구성해 보고자 한다.

 

Spring Cloud gateway 서비스 

원래 Netflix에서는 Zuul 서비스라 불렸지만 Netflix 에서 Spring 재단에 오픈소스로 재공하게 된 후부터

재단에서는 Zuul서비스를 확장시킨 Spring Cloud gateway 서비스로 새로운 패키지로 구성함.

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

 

gateway가 로드벨런서로 역할하기 위해 설정하는 방법으로는

application.yml 에 서비스 정보를 등록하는 방법(1)과 해당정보를 @Bean 어노테이션을 이용해 만드는 방법(2) 2가지가 존재한다.

 

1) application.yml 에 등록하기

spring:
  application:
    name: api-gateway-service
  cloud:
    gateway:
      routes:
        - id: first-service
          uri: http://localhost:8081
          predicates:
          - Path=/first-service/**
          filters:
          - CustomFilter
        - id: second-service
          uri: http://localhost:9091
          predicates:
          - Path=/second-service/**
          filters:
          - name: CustomFilter

yml 로 등록할 때 위와 같이 spring.cloud.gateway.routes 에 라우팅될 서비스들의 정보를 입력하면 된다.

입력값으로는 MS 의 id 정보, uri를 등록할 수 있고, predicates 항목으로 해당 MS로 요청될 uri뒤에 올 Path 정보를 입력해준다.

filters 를 통해 해당 서비스를 이용할 때 사용될 필터도 등록할 수 있다. 

AddRequestXXX, AddResponseXXX 를 통해 직접 다룰수도 있고, 위 처럼 필터 컴포넌트를 하나 정의하여 컴포넌트 클래스 이름을 등록해 주면 등록된 MS 요청시 필터로 사용될 수 있다.

 

2. Bean으로 등록하기.

@Configuration
public class FilterConfig {
    // yml 설정에서 할수 있는 것을 Java로 설정
    @Bean
    public RouteLocator gatewayRouter(RouteLocatorBuilder builder){
        return builder.routes()
                .route(r -> r.path("/first-service/**")
                            .filters(f -> f.filter(customFilter.apply(customFilter.newConfig())))
                            .uri("http://localhost:8081"))
                .route(r -> r.path("/second-service/**")
                        .filters(f -> f.addRequestHeader("second-request","second-request-header")
                                .addResponseHeader("second-response","second-response-header"))
                        .uri("http://localhost:8082"))
                .build();
    }
}

@Configuration 어노테이션 안에서 RouteLocator 클래스의 Bean을 생성해준다. 생성파라미터로 RouteLocatorBuilder 를 받는다.

 

라우트 정보는 builder.routes().route(라우팅정보).build() 로 객체를 생성해 준다.

route 메서드 안에서는 람다식으로 Functional 인터페이스를 정의해 준다.

여기서 r 은 PredicateSpec 인터페이스의 메서드를 체인닝 메서드 방식을 이용하여 정의해준다.

정의되는 정보로는 path(요청패스정보), filters(필터정보), uri(uri정보) 등이다.

 

위처럼 작성시 application.yml 에 작성된 내용과 동일한 방식으로 동작하게 된다.

 

 

 

 

게이트웨이를 Eureka 와 연동

게이트웨이를 Eureka에 등록하여 사용하려면 로드벨런싱 되는 서비스의 uri 를 아래와 같이 변경해야한다.

spring:
  cloud:
      routes:
        - id: first-service
          uri: lb://MY-FIRST-SERVICE # Eureka 에 등록할떄는 URL을 lb://{Eureka에 등록된 Name} 으로 설정해준다.
          predicates:
          - Path=/first-service/**
          filters:
          - CustomFilter
        - id: second-service
          uri: lb://MY-SECOND-SERVICE
          predicates:
          - Path=/second-service/**
          filters:
          - name: CustomFilter
          - name: LoggingFilter
            args:
              baseMessage: Spring Cloud Gateway Logging Filter
              preLogger: true
              postLogger: true

 

각 서비스가 돌고있는 호스트정보를 바로 넣지 않고, Eureka에 등록된 Application 네임을 이용하여 uri 접근을 한다.

lb://{Eureka에 등록된 Name} 형식으로 작성하면 된다.

댓글