포스트

LG CNS 부트캠프 학습일지 45일차

학습 내용

  • API Gateway 서버 만들기
  • Spring MVC vs Spring WebFlux
  • API Gateway에서 내부 서버를 아이디로 식별하기

API Gateway 서버 만들기

게이트웨이(Gateway)란 무엇인가. 같은 이름으로 스타크래프트 프로토스 건물이 있다. 차원관문이라고 번역이 되는데, 관문이라는 말이 가장 묘사한다고 볼 수 있다. 즉 모든 요청이 지나가는 곳이라는 것이다. 때문에 자연스럽게 API Gateway 서버는 그 요청이 어디로 가야하는지 통제해주는 중요한 역할을 담당한다.

API Gateway 서버도 Eureka 디스커버리 서비스에 등록해야 한다.

Spring MVC vs Spring WebFlux

마이크로서비스 아키텍처에서는 하나의 서버 안에서 모든 것이 이루어지는 것이 아니라 여러 서버들이 통신하여 역할을 나누고 데이터를 동일하게 유지한다. 구현하는데 두 가지 방식이 있는데, Spring MVC는 동기적이고 Spring WebFlux는 비동기적이다. 옛날에 전자회로를 배울 때 동기적과 비동기적의 차이점에 대해서 배웠던 것이 생각났다. 정리하자면 동기적인 시스템은 하나의 모듈이 다른 모듈의 작업이 끝날 때까지 기다리는 것이고, 비동기적인 시스템은 하나의 모듈이 다른 모듈의 결과를 기다리지 않고 자신의 작업을 수행한다. 다른 모듈의 작업이 끝날 때까지 기다릴 필요가 없기 때문에 비동기적 시스템이 구현하기 복잡하더라도 효율적인 시스템이라고 생각했다. 하지만 때로는 동기적 시스템이 충분히 좋을 수 있기 때문에 상황에 따라 적절하게 선택할 수 있어야 할 것이다.

아무튼 Spring WebFlux를 사용해서 API Gateway 서버를 구성했다.WebFlux를 사용하면 필터를 사용할 수 있다. Spring Security와는 다른 필터인데, 들어오는 요청과 응답에 일괄적으로 헤더를 추가하는 등의 작업을 해줄 수 있다.

application.yml 으로 구현하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
  cloud:
    gateway:
      server:
        webflux:
          routes:
            - id: first-service
              uri: lb://MY-FIRST-SERVICE
              predicates:
                - Path=/first-service/**
              filters:
			    - AddRequestHeader=f-request, 1st-request-header-by-yaml
                - AddResponseHeader=f-response, 1st-response-header-from-yaml
			...

Java 코드로 구현하기

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
  cloud:
    gateway:
      server:
        webflux:
          routes:
            - id: first-service
              uri: lb://MY-FIRST-SERVICE
              predicates:
                - Path=/first-service/**
              filters:
                - CustomFilter
			...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Component
@Slf4j
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
    public CustomFilter() { super(Config.class); }

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

			// Pre 필터
			...
			
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
				// Post 필터
                ...
            }));
        };
    }

    public static class Config {

    }
}

API Gateway에서 내부 서버를 아이디로 식별하기

application.yml 파일에 다음과 같은 부분이 있다. uri: lb://MY-FIRST-SERVICE. lb는 Load Balance를 의미하고 MY-FIRST-SERVICE는 내부 서버의 아이디를 의미한다. 만약 내부 서버의 IP 주소와 포트 번호가 고정되어 있다면 그것을 바로 사용해도 좋은데, DHCP로 IP가 바뀌고 포트번호도 무작위로 바뀌는 상황에서는 Eureka 서버에 등록된 내부 서버의 아이디를 사용하는 것이 합리적인 생각이다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

Comments powered by Disqus.