LifeSports Application(ReactNative & Nest.js) - 13. kong api gateway

yellow_note·2021년 10월 8일
1

#1 API Gateway

Microservice에서 API Gateway는 중요한 부분을 차지합니다. 사용해 보았던 Api Gateway로는 Spring apigateway를 사용한 경험이 있습니다. 이 서버를 기반으로 제가 느꼈던 주요 기능들은 인증과 인가 기능에 대한 부분을 담당하기도 하고, 모든 API 서버들의 endpoint들을 하나로 묶어 주기도하고, 라우팅에 대한 기능이었습니다. 각 기능별로 느꼈던 장점들은 다음과 같습니다.

1) 인증과 인가
Spring Api Gateway를 사용할 때, 인가 필터를 만들어 필요 서비스에 이 필터를 적용하였습니다. 인가 필터는 유저가 서비스들을 이용할 때 사용됩니다. 이 필터는 유저가 서비스를 이용할 때 로그인 시에 발급받았던 jwt토큰을 검사하여 해당 유저가 타당한 유저인지 판별고, 토큰이 타당하지 않다면 에러 메시지를 반환합니다. 만일 API Gateway를 사용하지 않는다면 서비스를 이용시 각기 다른 서비스마다 토큰 판별을 위한 필터를 만들어야 하는 단점이 존재합니다. 그림으로 살펴 보면 다음과 같습니다.

그림으로 보면 차이점이 명확히 드러납니다. Gateway가 존재할 때는 Gateway에서 필터를 이용해 service 앞단에서 오류 메시지를 반환할 수 있고, 하나의 서버를 이용하여 인가에 대한 부분을 처리할 수 있습니다.

하지만 Gateway가 존재하지 않을 때는 각 서비스마다 인가 필터를 작성해야하고, 꼭 서비스에 메시지를 전달해야만 합니다. 서비스에 부담만 가중하게 되죠.

2) api 라우팅
api 라우팅은 경로별로 각 서비스들에게 요청을 전달하는 기능입니다. api 라우팅은 다양한 라우팅을 지원하는데 예를 들어 Spring Api Gateway 코드를 살펴보겠습니다.

cloud:
    gateway:
      routes:
        ...
        - id: auth
          uri: lb://AUTH-SERVICE
          predicates:
            - Path=/auth-service/info/**
            - Method=GET
          filters:
            - RemoveRequestHeader=Cookie
            - RewritePath=/auth-service/(?<segment>.*), /$\{segment}
            - AuthorizationHeaderFilter

        ...

        - id: post
          uri: lb://POST-SERVICE
          predicates:
            - Path=/post-service/**
          filters:
            - RemoveRequestHeader=Cookie
            - RewritePath=/post-service/(?<segment>.*), /$\{segment}

        ...

코드를 보면 auth-service, post-service별로 라우팅이 설정이 되어있고, 와일드카드를 이용하여 하위 url별로 라우팅, filter, Method별 라우팅 등 다양하게 라우팅이 가능합니다.

3) endpoint

msa에서 서비스들은 각각의 포트번호를 가지고 독립적인 서버로 운용이 됩니다. 예를 들어 /auth-service:1000/, /post-service:2000/과 같이 독립적인 endpoint를 가진 서버로 운용이 되는데 API Gateway에서는 이 서버들을 하나의 포트로 묶어 클라이언트의 요청 시 알맞는 서비스로 요청을 보낼 수 있습니다.

#2 kong 설치

도커를 이용하여 Kong api gateway를 구축하도록 하겠습니다.

윈도우 기준 https://hub.docker.com/editions/community/docker-ce-desktop-windows/ 에서 Docker를 설치합니다.

도커 설치 - https://goddaehee.tistory.com/251

도커를 설치한 후 kong 문서를 이용하여 kong gateway를 설치하도록 하겠습니다.

1) network 생성

docker network create kong-ee-net

2) postgres 설치

docker run -d --name kong-database --network=kong-ee-net -p 5432:5432 -e "POSTGRES_USER=kong" -e "POSTGRES_DB=kong" -e "POSTGRES_PASSWORD=kong" postgres:9.6

3) database 설정

docker run --rm --network=kong-ee-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_PG_PASSWORD=kong" -e "KONG_CASSANDRA_CONTACT_POINTS=kon-database" kong:latest kong migrations bootstrap

4) kong 설치

dokcer run -d --name kong --network=kong-ee-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-database" -e "KONG_PG_PASSWORD=kong" -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" -e "KONG_PROXY_ACCESS_LONG=/dev/stdout" -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" -e "KONG_PROXY_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8441 ssl" -p 8000:8000 -p 8443:8443 -p 127.0.0.1:8001:8001 -p 127.0.0.1:8444:8444 kong:latest

5) konga 설치

docker run --rm --network=kong-ee-net pantsel/konga:latest -c prepare -a 'postgres' -u postgresql://kong:kong@kong-database:5432/konga

6) konga 실행

docker run -p 1337:1337 --network=kong-ee-net -e "TOKEN_SECRET=user-token" -e "DB_ADAPTER=postgres" -e "DB_URI=postgresql://kong:kong@kong-database:5432/konga" -e "NODE_ENV=production" --name konga pantsel/konga

7) konga 접속
웹 브라우저 창에서 localhost:1337로 접속하겠습니다.

위의 화면에서 admin 계정을 만든 후 접속을 하겠습니다.

admin url을 http://kong:8001로 기입하니 접속이 가능했습니다.

서비스 탭으로 들어가서 서비스를 등록하겠습니다.

  • Host에 host.docker.internal, localhost 등 많은 부분들을 시도해봤지만 제 경우에는 이 방법으로 해결되지 않아 Host부분에 현재 쓰고 있는 인터넷 ip를 넣어 시도를 했더니 해결이 됐습니다. 우선 docker container ip를 써야하는건지에 대한 부분이 문제인건지, host.docker.internal같은 docker의 루프백 주소를 써야하는건지 등에 대한 부분을 좀 더 찾아보고 변경하도록 하겠습니다.

  • 제 경우 윈도우에서 docker는 wsl위에서 돌아가는 컨테이너였습니다. 즉, wsl을 하나의 가상 컴퓨터로 보고 해당 ip를 사용하니 위의 문제를 해결할 수 있었습니다. 제 경우에 ipconfig로 ip탐색 결과 ipv4주소가 172.26.176.1로 나왔습니다. 그래서 Host에 172.26.176.1를 넣고 postman에 localhost로 요청한 결과 반환 값이 잘 받아오는 모습을 확인할 수 있었습니다. 만약 윈도우를 사용할 경우 docker 컨테이너는 wsl로 실행해야하므로 wsl의 ipv4 혹은 docker의 ipv4를 Host에 기입하면 되겠습니다.

우선 auth-service의 name, url을 등록하도록 하겠습니다.


그리고 route를 등록하고 테스트를 진행해보겠습니다.

auth-service에 대한 접근이 정상적으로 이루어졌습니다. 그러면 이 방법을 이용해서 API Gateway를 react native 클라이언트에 연결하도록 하겠습니다.

참고

도커 설치 - https://goddaehee.tistory.com/251
kong 설치 - https://bcho.tistory.com/1361
윈도우 /var찾기 - https://velog.io/@ette9844/Windows10-%EC%97%90%EC%84%9C-varlibdocker-%EC%B0%BE%EA%B8%B0

0개의 댓글

관련 채용 정보