API Gateway?
API Gateway는 API서버 앞단에서 모든 API 서버들의 엔드포인트를 단일화하여 묶어주고 API에 대한 인증과 인가 기능에서 부터 메세지에 따라서 여러 서버로 라우팅 하는 고급기능 까지 많은 기능을 담당한다.
API Gateway의 주요 기능
- 인증/인가에 관련된 기능
- 인증은 API를 호출하는 클라이언트에 대한 identity(신분)를 확인 해주는 기능
- 인가는 클라이언트가 API를 호출할 수 있는 권한이 있는지를 확인해주는 기능
- API 토큰 발급
- 인증 인가를 거칠떄 마다 매번 사용자의 인가/인증 절차를 거치기는 불편하다.
- 사용자 인가가 끝나면, 사용자가 API를 호출 할 수 있는 토큰을 발급해준다.
- API 서버는 이 토큰으로 사용자의 identity와 권한을 확인한 후, API 호출을 허가
- 엔드포인트별 API 호출 인증
- Apitoken이 발급되었으면, 클라이언트는 apitoken을 이용하여 API호출
- API Gateway에서 apitoken 검증 후 API 호출 승인 여부 결정
- 엔드포인트별 API 요청 인가
- 요청이 API를 호출할 수 있는 권한이 있는 것을 확인 해준다.
- 토큰에 제한적으로 역할을 부여한다.
- 역할별로 권한을 연결하여 인가를 내린다.
- API 라우팅
- 같은 API라도 사용하는 서비스나 클라이언트에 따라서 다른 엔드포인트를 이용해서 서비스를 제공한다
- 백엔드 API 서버로의 로드 밸런싱
- API Gateway 뒷단에 다수의 API 서버가 있다고 할떄, 여러개의 API 서버로 부하를 분산
- 서비스 및 클라이언트 별 엔드포인트 제공
- 같은 API를 여러개의 엔드포인트를 통해 제공할 수 있다 이때 하나의 시스템이 다양한 서비스나, 다양한 클라이언트등으로 서비스를 제공할 떄, 각각 다른 서비스별 또는 클라이언트 별로 다른 엔드포인트를 제공할 수 있다.
- 메시지 또는 헤더기반 라우팅
- 메세지 내용을 기반으로 라우팅한다. 예를 들어 HTTP 헤더에 country code가 있다면 그에 따라 유럽, 미국 등의 API 호출을 다르게 하도록 Routing 할 수 있다.
- 공통 로직 처리
- API Gateway는 모든 API가 공통적으로 처리해야 하는 기능이 필요할 경우 이러한 기능을 API GateWay에서 실행하도록 하여 API 서버에서 이러한 기능을 개발할 필요가 없다.
- 메디에이션
- API서버에서 제공되는 API가 클라이언트가 원하는 API 형태와 다를 때, API Gateway가 이를 변경해주는 기능
- 메세지 포맷 변환
- JSON요청(Request) 메세지가 들어왔을 때, 이를 API 서버로 보낼 떄 변환해서 보내거나, API 서버에서 생성된 응답을 클라이언트에 리턴할때 변경해서 보내는 기능
- 프로토콜 변환
- 다양한 서비스나 클라이언트 지원 시, 각 서비스가 다른 통신 프로토콜을 사용할 경우 API Gateway에서 프로토콜 변환을 통해, 같은 API를 다른 프로토콜로 서비스 할 수 있도록 할 수 있다.
- 메세지 호출 패턴 변환
- 동기, 비동기 호출과 같은 API를 호출하는 메세지 패턴을 변경한다. 즉 Async API호출을 Sync 호출로 바꾸거나, 하나의 API 호출을 여러 데이터 센터로 복제 해준다거나 하는 형태의 메세지 패턴을 변화 시킬 수 있다.
- 어그레게이션
- 여러개의 API를 묶어서 하나의 API로 만드는 작업을 이야기 한다. 예를 들어 계좌 이체를 구현한다고 하였을 때, 이를 API Gateway에서 구현할 수 있다. 단 API Gateway에 부하가 많아지므로 설계할 때 고려를 잘 해야 한다.
- 로깅 및 미터링
- API 호출 로깅
- API 호출시 API Gateway는 공통적으로 호출되는 부분인 만큼 모든 로그를 중간에서 수집하기 좋다.
- API 호출 패턴을 분석해 사용자의 사용 패턴도 분석가능
- API 미터링 & 차징
- API 미터링은 과금을 위한 API 호출 횟수, 클라이언트IP, API 종류, IN/OUT 용량등을 축정 기록
- 차징은 미터링이 된 자료를 기반으로 하여, API 서비스 사용 금액을 금액 정책에 따라서 계산 해내는 서비스이다.
- QoS조정 (Quality of Service)
- API 서비스를 클라이언트 대상에 따라서 서비스 레벨 조절
- 유료 서비스가 있다면 무료는 1일 1000건으로 호출 제한을 걸거나 하는 경우를 의미
Spring Cloud에서의 MSA간 통신
1. RestTempate
RestTemplate restTemplate = new RestTemplate();
restTemplate.getForObject("http://localhost:8080/", User.class, 200); // GET method
2. Feign Client
@FeignCliend("stores)
public interface StoreClient {
@RequestMapping(method = RequestMethod.GET, value = "/stores")
List<Store> getStores();
}