API Gateway Service

용씨·2023년 1월 30일
0

개념

API Gateway는 사용자의 설정에 따라서 client 대신 요청하고 client의 요청에 응답하는 프록시 구조이다.

API Gateway는 단일 진입점이다. 클라이언트는 API Gateway만 접근할 수 있다.

기능

  • 인증 및 권한 부여
  • 서비스 검색 통합
  • 응답 캐싱
  • 정책, 회로 차단기 및 Qos 다시 시도
  • 속도 제한
  • 부하 분산
  • 로깅, 추적, 상관관계
  • 헤더, 쿼리 문자열 및 청구 변환
  • IP 허용 목록에 추가

Netflix Ribbon

  • Spring Cloud에서 MSA간 통신
    1) RestTemplate
    2) Feign Client
  • Ribbon: Client side Load Balancer
    • 서비스 이름으로 호출
    • Health Check
    • 비동기를 지원을 안 해서 잘 쓰이지 않고 있음
    • 이제 Spring에서 지원을 안하는 것 같음

대체

https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now

  • Spring Cloud GatewayNetty 서버를 가동해 비동기를 지원
  • Neflix ZuulTomcat 서버를 가동해 비동기를 지원하지 않는다.

Spring Cloud Gateway

Config

  • Java 코드 또는 property로 라우팅 설정을 할 수 있다.
  • "요청 ➔ Gateway Handler Mapping ➔ Predicate ➔ Pre filter ➔ 서비스 ➔ Post filter ➔ Gateway Handler Mapping ➔ 응답" 의 구조로 이루어져 있다.
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {
    @Bean
    public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/first-service/**")
                            .filters(f -> f.addRequestHeader("first-request", "first-request-header")
                                           .addResponseHeader("first-response", "first-response-header"))
                            .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();
    }
}
  • path: path로 들어온 요청을
  • uri: uri로 라우팅한다.
  • filters : request headerresponse header를 추가할 수 있다. 이는 Gateway Handler Mapping가 해준다.

Filter

Custom Filter

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

@Component
@Slf4j
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
    public CustomFilter() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        // Custom Pre Filter
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            ServerHttpResponse response = exchange.getResponse();

            log.info("Custom PRE filter: request id -> {}", request.getId());

            // Custom Post Filter
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("Custom POST filter: response code -> {}", response.getStatusCode());
            }));
        };
    }

    public static class Config {
        // Put the configuration properties
    }
}
  • ServletHttpRequest(동기) 대신 ServerHttpRequest(비동기)를 사용한다.
    • import org.springframework.http.server.reactive.ServerHttpRequest;
    • import org.springframework.http.server.reactive.ServerHttpResponse;
  • reactive: Web Flux의 기능
  • Mono: 비동기 방식에서 단일 응답 시 사용한다
spring:
  application:
    name: apigateway-service
    cloud:
      gateway:
        routes:
          - id: first-service
            uri: http://localhost:8081/
            predicates:
              - Path=/first-service/**
            filters:
              - CustomFilter
profile
아침형 인간이 목표

0개의 댓글