Spring Cloud Gateway - 간단하게 알아보자

2024. 2. 27. 13:35

API Gateway?

https://spring.io/projects/spring-cloud-gateway

Spring Cloud GateWay 공식 사이트에서 Spring Cloud GateWay 치면 나오는 화면을 캡쳐한 것이다.
간단하게 첫줄만 요약하면 

API GateWay 를 구축하기 위해서 제공되는 Spring webFlux 나 Spring WebMVC 기반의 프로젝트

라고 한다. 

쉽게 말하면 API GateWay 라는 모듈을 구축하기 위해서 Spring 에서 제공하는 컴포넌트 정도로 보면 될 것 같은데.
API Gate가 무엇인지 잘 모르니 이것부터 알아보자

 

API Gateway??

쉽게 설명해 달라고 가스라이팅 했는데, 말을 놔버린 챗지비티다. 싸가지가 없다. 
예의없는 인공지능을 뒤로하고 여러 가지 문서를 찾아보고 내가 내린 API GateWay 를 사용하는 가장 큰 이유는 

마이크로 서비스들을 통합하는 하나의 주소를 제공하기 위함이다.

 여러개의 서비스를 하나의 서비스 처럼 사용하는 MSA 에서 필요한 기능이다.
물론 필수적인 것은 아니지만 API GateWay 를 사용하면 다른 여러 이점들을 활용하여 
복잡성이 줄어들 수 있다. 

API Gateway 의 주된 기능은 


1. Routing : Client 의 요청을 적절한 마이크로 서비스로 연결
2. Protocol 반환 : 클라이언트가 요청 서비스를 이해할 수 있는 형식으로 변환하고,
                                 서비스의 응답을 클라이언트에게 적절한 형식으로 반환
3. Load Balancing : 백엔드 서비스 부하 분산을 시켜 고가용성을 유지
4. Authentication Authorization : 클라이언트의 인증과 인가 처리를 수행
5. Monitor 와 Logging : API 요청과 응답에 대한 정보를 기록하고, 모니터링 해서 식별
6. Circuit Breaker : 장애에 대비하여 서비스 요청을 중단시키고 격리
7. Caching : 반복적인 요청에 대한 응답을 캐싱하여 성능 향상

이러한 기능들을 한꺼번에 수행할 수 있다. 

결국 Spring Cloud GateWay 는 이러한 API GateWay 기능을 Spring 으로 구현할 수 있도록 구성한 컴포넌트 라 
볼 수 있을 것 같다.

 

Spring Cloud Gateway 의 특징 

1. Non-Blocking, Async

Non-Blocking, Async
- Spring Cloud Gateway를 실행하면 Tomcat 대신 Netty가 기동되는데,
이는 마이크로서비스의 모든 요청이 API Gateway를 통과하며 대량의 요청을 처리해야 하는 상황에서
Tomcat을 사용하면 성능 문제가 발생할 수 있기 때문이다. 

Netty는 입출력 작업이 완료되지 않아도 Thread를 차단하지 않아 하나의 Thread가 여러 요청을 동시에 처리할 수 있다.
이는 Non-Blocking I/O의 특성으로, 클라이언트의 대기 시간을 줄이고 여러 작업을 동시에 처리할 수 있도록 한다.
또한, 이러한 Non-Blocking 및 비동기 방식을 지원하기 위해 WebFlux 라이브러리가 사용된다.

 

2. Spring Cloud !!
Spring 에서 제공하는 다양한 모듈과 접목 시켜서 API GateWay 를 수행할 수 있다.

 

3. Filter !!

Filter 를 통해 다양한 요청이나 응답 처리가 가능하며, 이를 사용하여 
Logging 이나. 인증 인가 처리를 구현할 수 있다.

 

SpringCloud GateWay 가 API GateWay 기능을 수행하는 방법 ★

1. Routing 기능 
 
 yml 
 spring:
   cloud:
     gateway:
       routes:
         - id: myroute
           uri: http://example.org
           predicates:
             - Path=/myroute/**
 
다음과 같이 YML 설정으로 
SCG (Spring Clout Gate Way) 에 myroute 로 들어오는 요청을
http://example.org 으로 보내버리는
라우팅 기능을 수행한다.

 

2. Protocol 변환 기능 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("https_to_http", r -> r.scheme("https")
                .uri("http://backend-service"))
            .build();
    }
}
다음과 같이 특정 protocol 의 요청을 특정한 서비스로 반환한다.
위의 경우 https 요청을 http://backend-service 로 반환한다.

 

3. Load Balancing 기능 
```yml
  spring:
    cloud:
      gateway:
        routes:
          - id: myroute
            uri: lb://mybackend
            predicates:
              - Path=/myroute/**
```
YML 설정을 통해서 Load Balancing 을 처리한다. 

해당 설정으로 인해
SGC 로 myroute 를 시작으로 하는 요청이 오면 
mybackend 라는 이름의 서버스 인스턴스 들에게 로드밸런싱 처리를 한다.


- lb : Spring Cloud 에서 정의한 로드밸런싱 방식을 참조한 것이다.
- mybackend : MSA 의 서비스 디스커버리에 등록된 서비스의 이름이다. 

Spring Cloud GateWay는 Ribbon 을 기반으로 하는 로드밸런싱을 가지고 있으며,
이 방식을 통해 부하 분산을 시키고 고가용성을 유지한다.

 

4. 인증 인가 
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
    return http
        .authorizeExchange()
            .pathMatchers("/myroute/**").hasRole("USER")
            .anyExchange().permitAll()
            .and().build();
@Component
@Slf4j
public class AuthorizationHeaderFilter extends AbstractGatewayFilterFactory<AuthorizationHeaderFilter.Config>{


    private String secretKey;

    public  AuthorizationHeaderFilter(){
        super(Config.class);
        this.secretKey = "a2FyaW10b2thcmltdG9rYXJpbXRva2FyaW10b2thcmltdG9rYXJpbXRva2FyaW10b2thcmltdG9rYXJpbXRva2FyaW10b2thcmltdG9rYXJpbXRva2FyaW10b2thcmltdG9rYXJpbXRva2FyaW10b2thcmltdG9rYXJpbXRva2FyaW10b2thcmltdG9rYXJpbQ==";
    }
    public static class Config{

    }

    @Override
    public GatewayFilter apply(Config Config) {

        return ((exchange, chain) -> {
            ServerHttpRequest  req = exchange.getRequest()  ;

            if (!req.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) {
                return onError(exchange,"NO Authorization Header",HttpStatus.UNAUTHORIZED);
            }

 

Spring Security 를 추가하여 GateWay 에서 
Page 인증 , 인가 처리를 구현할 수 있다.  

 

이외에도 Spring 에서 제공하는 다양한 Component 를 함께 사용하여
API GateWay 역할을 수행할 수 있다.

Spring Cloud GateWay 의 단점 

- Learning Curve 
- Non-Blocking, Async 로 인한 성능 문제
- Logging 과 Monitoring 부분의 발전 필요

라고 하는데.. 

사용해보고 느낀 거는 생각보다 Learning Curve 가 오래 걸린다는 것이다!

 

간단하게 개념을 알아봤으니 
구현 하는 방법에 대해서 알아보자!

BELATED ARTICLES

more