uEngine solutions

오픈클라우드엔진 - 성공적 클라우드 서비스 구축을 위한 가장 빠른 방법

uEngine GW 리팩토링 3. Api gateway 핵심, proxy 선택

24 Jul 2017 » api-gateway

Api gateway 핵심, proxy 선택

Api gw 의 핵심은 요청지 - 룰엔진 - 엔드포인트 간의 커넥트이며, 이를 가능하게 해주는 proxy 를 선택해야 한다.

기존 uengine-gw 는 직접 작성한 servlet 코드로 proxy 를 작성하였다. 직접 작성한 코드의 단점으로는

  • 1) TCP 프로토콜 밖에 서포트 하지 못한다.
  • 2) Battle-tested 되지 못한 코드로서 신뢰성이 없다.

해서 대체할 proxy 엔진을 분석해본다.

Ngnix

Ngnix 프락시 서버는 Kong, Tyk 에서 선택한 프락시 서버이다. Haproxy 와 설정법이 유사하다.

  • 설정예
server {
    listen 443 ssl proxy_protocol;

    server_name localhost;

    set_real_ip_from  172.31.0.0/20;
    real_ip_header    proxy_protocol;

    access_log /var/log/nginx/elb-access.log elb_log;

    # SSL Certificate settings go here.

    location / {
        proxy_pass          http://docker;
        proxy_http_version  1.1;

        proxy_set_header Connection         "";
        proxy_set_header Host               $host;
        proxy_set_header X-Real-IP          $proxy_protocol_addr;
        proxy_set_header X-Forwarded-For    $proxy_protocol_addr;
        proxy_set_header X-Forwarded-Proto  $scheme;
    }
}

지원 프로토콜은 UDP,TCP,WebSocket 를 지원하며, Plus 버젼에서는 Iot 를 위한 MQTT 프로토콜 등도 지원한다.

But. Haproxy 와 마찬가지로, Proxy 과정중에 일어나는 이벤트에 대한 확장, 커스텀 로직등을 코딩으로 인젝트 할 수 없고, 정해진 문법의 Configuration 을 통해서만 가능하다. 이 Configuration 에서는 타임아웃, 로드밸런싱 등 메커니즘 적인 요소에 특화되어있다.

그래서, Kong 과 Tyk 에서는 Ngnix proxy 실행 전과 후 룰엔진 필터를 살행하고, 필터를 통과할 경우 Ngnix proxy 를 실행시키는 아키텍쳐 구조로 되어있다.

  • Kong, Tyk 의 기본컨셉

Spring Cloud Netflix

http://cloud.spring.io/spring-cloud-netflix/

Spring Cloud Netflix 는 Zull, eureka, Ribbon, Hystrix, Spring cloud config 등 넷플릭스의 클라우드 라이브러리를 통합하여 제공하는 라이브러리다.

Spring Cloud Netflix 를 씀으로써 상황에 따라 어플리케이션을 디스커버리 서버로, 게이트웨이로 사용할 수 있다.

지원 프로토콜은 UDP,TCP,WebSocket 이다.

@Configuration
@EnableAutoConfiguration
@EnableEurekaClient
@RestController
public class Application {

  @RequestMapping("/")
  public String home() {
    return "Hello World";
  }

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

}

Spring Cloud Netflix 를 쓸 경우 서비스 디스커버리와 로드밸런싱 이외의 기능들은 모두 만들어야 하는 부담이 있지만, 코어 기능인 proxy 를 비롯하여 검증된 솔루션이라는 점에서 신뢰성이 있다.

uengine-gw 의 proxy 엔진 선택

  • 당장의 완성도 있는 솔루션은 Tyk, Kong
  • Tyk, Kong 이 유지보수가 가능한가? 책임질 수 있는가?
  • Tyk, Kong 을 선택할 경우 플러그인 제작 방식으로 확장.
  • Spring Cloud Netflix 을 선택할 경우 오픈소스들간의 Mash-up 컨셉으로 만들어나갈 때 소요되는 시간.
  • 외부에 소개 할 때 Netflix 기반 vs Tyk 기반 일때의 반응.
  • 유엔진의 자산화 관점.

==> Spring Cloud Netflix 가 적합해 보인다.