Spring

API Gateway

Nonchrono 2024. 5. 9. 11:23

API Gateway란?

API Gateway란 개발자가 API를 쉽게 생성, 게시, 유지 관리, 모니터링 및 보안 유지할 수 있게 도와주는 완전관리형 서비스이다. 설정한 라우팅 설정에 따라 각각의 엔드포인트로 클라이언트를 대신해서 요청하고 응답을 받으면 다시 클라이언트한테 전달해주는 프록시 역할을 한다. 이러한 역할 덕분에 클라이언트는 내부 시스템의 복잡한 구조를 신경 쓰지 않고도 API Gateway를 통해 요청을 보내면 적절한 형태로 가공된 응답을 받을 수 있다.

출처 : https://cloud.google.com/blog/ko/products/serverless/google-cloud-api-gateway-is-now-available-in-public-beta

 

사용 이유

마이크로 서비스 아키텍처(이하 MSA)에서 마이크로 서비스가 3개가 띄워져있다고 가정해보자. 클라이언트가 마이크로 서비스를 직접 호출하는 방식이라면

  1. 마이크로 서비스가 추가되거나 변경되는 경우 클라이언트 코드도 수정 - 배포할 필요가 있다. 
  2. 클라이언트가 각각의 마이크로서비스의 위치와 통신 방식을 알아야한다.

등의 단점이 존재한다. 이를 해결하기 위해 단일 진입점을 가지고 있는 API Gateway가 필요하다. 백엔드 쪽으로 요청을 보낼 때 중개해주는 일종의 진입로이다. 따라서 API Gateway를 사용하면 서비스 간 통신을 효율적으로 관리하고 보안성을 유지하는 데에 도움이 된다.

 

기능

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

서비스 검색 통합 요청 받은 서비스의 위치를 동적으로 찾아내어 요청을 전달

회로 차단기 : 서비스에 장애 발생시 요청을 일시적으로 차단

Qos : 품질 보증

로드밸런싱 : 클라이언트가 웹 서버, 애플리케이션 서버, 데이터베이스 서버 등으로 요청을 보낼 때 대상 서버로 가는 요청 즉, 부하를 분산시킴

 

Spring에서 API Gateway

Spring Cloud에서 마이크로 서비스간 통신은 보통 두가지 방법으로 이루어진다.

  1. RestTemplate*
  2. Feign Client*

RestTemplate : 스프링 프레임워크에서 지원하는 HTTP 클라이언트 라이브러리. 이를 사용하면 쉽게 애플리케이션에 HTTP 요청을 보낼 수 있다.

RestTemplate restTemplate = new RestTemplate();
restTemplate.getForObject("http://localhost:8080/", User.class, 200);

 

Feign Client : 넷플릭스에서 개발된 HTTP 클라이언트 라이브러리. 인터페이스를 작성하고 어노테이션을 선언하는 것만으로 HTTP 요청을 보낼 수 있다. 서비스 명을 통해 호출이 가능하다.

@FeignClient("stores")
public interface StoreClient {

  @RequestMapping(method = RequestMethod.GET, value = "/stores")
  List<Store> getStores();
}

 

위의 방식을 통해 스프링 클라우드 마이크로 서비스간 호출을 할 수 있다. 이때, 서비스에 요청을 보낼 때 한가지 더 필요한 것이 있다면 로드 밸런싱이다. 위에 API Gateway의 사용 이유에 언급했듯 직접적으로 서비스를 호출하는 방식은 좋지 않기 때문에 단일 진입점 방식으로 서비스의 주소 값을 관리하고 로드 밸런싱을 담당하는 서비스가 필요하다.

 

과거에는 스프링 클라우드의 로드 밸런싱을 위해서 Ribbon과 Zuul이라는 라이브러리를 사용했었다. 비동기 처리에 제한이 있어 현재는 사용되지 않는다. 이미 지원이 종료되었기 때문에 여기에서는 언급하지 않고 넘어가기로 하겠다.

 

그 뒤에 나온 것이 Spring Cloud Gateway이다.

비동기 처리가 가능하도록 Tomcat으로 구동하는게 아니라 Netty 서버로 기동한다.