티스토리 뷰

마이크로서비스 아키텍처(MSA) 를 운영하며 API 관리할 때, Kong Gateway 는 확장성과 성능을 겸비한 API 게이트웨이로, 인증, 라우팅, 모니터링을 손쉽게 처리할 수 있습니다. 이 글에서는 Kong Gateway 의 주요 특징과 설정 방법을 간단히 소개합니다.

주요 특징

  • API 라우팅 및 관리: 다양한 서비스로의 요청 라우팅, 로드 밸런싱, 인증/인가 등 API 관리를 통합적으로 제공합니다.
  • 확장성과 플러그인 시스템: 플러그인을 통해 인증(JWT, OAuth2), 요청 제한, 로깅 등 기능을 쉽게 확장할 수 있습니다.
  • 다양한 배포 옵션: Kubernetes, Docker, VM 등 다양한 환경에 배포 가능하며, MSA와 클라우드 네이티브 아키텍처에 최적화되어 있습니다.

설치 방법

Docker 와 Docker Compose 가 설치되어 있어야 합니다.

1. Kong 이미지 다운로드

docker pull kong:latest
  • cmd 또는 터미널을 열고 Kong 이미지를 다운로드합니다.

 

2. docker-compose 작성

1. 인증요청 : 
	- 방식 : Rest
	- URL : /auth/login
	- ip/port : 127.0.0.1/31000
	
2. 사용자조회 : 
	- 방식 : GraphQL
	- URL : /api/query
	- ip/port : 127.0.0.1/32000

3. 알림전송 : 
	- 방식 : Rest
	- URL : /noti/send
	- ip/port : 127.0.0.1/33000
  • 위와 같이 3개의 백엔드 서비스를 준비합니다.
  • docker build 명령어를 통해 이미지를 준비합니다.
    • docker build -t my-api-auth .
    • docker build -t my-api-core .
    • docker build -t my-api-noti .
project-root/
├── docker-compose.yml  # 필수 Docker Compose 파일
└── postgres/           # PostgreSQL 데이터 저장소
    └── data/           # 데이터 볼륨
  • 위와 같이 폴더를 만들고 docker-compose.yml 파일을 작성합니다.
version: "3.8"

services:
  kong-database:
    image: postgres:13
    container_name: kong-database
    environment:
      POSTGRES_USER: kong
      POSTGRES_PASSWORD: kong
      POSTGRES_DB: kong
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    networks:
      - my-network

  kong:
    image: kong:latest
    container_name: kong
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-database
      KONG_PG_USER: kong
      KONG_PG_PASSWORD: kong
      KONG_ADMIN_LISTEN: 0.0.0.0:8001
      KONG_PROXY_LISTEN: 0.0.0.0:8000
    ports:
      - "8000:8000" # Proxy API
      - "8001:8001" # Admin API
    depends_on:
      - kong-database
    networks:
      - my-network

  my-api-auth:
    image: my-api-auth
    container_name: my-api-auth-container
    environment:
      SPRING_PROFILES_ACTIVE: dev
    ports:
      - "31000:31000"
    networks:
      - my-network

  my-api-core:
    image: my-api-core
    container_name: my-api-core-container
    environment:
      SPRING_PROFILES_ACTIVE: dev
    ports:
      - "32000:32000"
    networks:
      - my-network

  my-api-noti:
    image: my-api-noti
    container_name: my-api-noti-container
    environment:
      SPRING_PROFILES_ACTIVE: dev
    ports:
      - "33000:33000"
    networks:
      - my-network

networks:
  my-network:
    driver: bridge
  • 데이터베이스 설정 : PostgreSQL 컨테이너를 실행하여 Kong의 설정을 저장, 환경 변수로 DB 사용자, 비밀번호, 데이터베이스 이름 설정
  • Kong 설정 : 데이터베이스 연결(KONG_DATABASE, KONG_PG_HOST), Admin API 활성화(KONG_ADMIN_LISTEN: 0.0.0.0:8001)
  • 필수 포트 노출 : 8000: Proxy API (클라이언트 요청 처리), 8001: Admin API (Kong 관리)

 

3. 설치 및 실행

3.1. Docker Compose 실행

docker-compose up -d
  • 프로젝트로 이동하여, Docker Compose 를 실행합니다.

 

3.2. Kong 초기화

docker-compose run --rm kong kong migrations bootstrap
  • kong 초기화를 합니다.

 

3.3. 실행

  • 이후 컨테이너를 각각 실행한 후, http://localhost:8001/ 을 접속하여 정상동작 하는지 확인합니다.

 

3.4. Kong 서비스 추가

curl -i -X POST http://localhost:8001/services --data name=auth-service --data url=http://my-api-auth-container:31000
curl -i -X POST http://localhost:8001/services --data name=core-service --data url=http://my-api-core-container:32000
curl -i -X POST http://localhost:8001/services --data name=noti-service --data url=http://my-api-noti-container:33000
  • 서비스 등록 후, curl http://localhost:8001/services 로 서비스 확인 가능합니다.

 

3.5. Kong 라우트 추가

curl -i -X POST http://localhost:8001/services/auth-service/routes --data name=auth-route --data paths[]=/ --data headers.X-Service-Type=auth --data strip_path=false
curl -i -X POST http://localhost:8001/services/core-service/routes --data name=core-route --data paths[]=/ --data headers.X-Service-Type=core --data strip_path=false
curl -i -X POST http://localhost:8001/services/noti-service/routes --data name=noti-route --data paths[]=/ --data headers.X-Service-Type=noti --data strip_path=false
  • Header "X-Service-Type" 값을 통해 라우팅 합니다.

 

3.6. 요청

헤더 : X-Service-Type: auth
URL : http://localhost:8000/auth/login
  • 헤더값에 [auth/core/noti] 를 작성하고 URL 을 호출

 

감사합니다.

최근에 올라온 글
Total
Today
Yesterday