-
API 게이트 웨이에 대해 파헤치기프로그래밍 언어/Spring 2024. 8. 6. 23:00
이 글은 API 게이트웨이에 대한 공부를 제가 이해할 수 있는 내용으로 정리한 글입니다. 부정확한 서술이나 기술에 대한 정보가 틀릴 가능성이 있습니다.
API 게이트웨이 개요
API 게이트웨이는 MSA를 구현하는데 필요한 Spring Cloud에서 지원하는 확장 기능 중 하나이다.
API 게이트웨이가 하는 일을 간략적으로 보자면
- 클라이언트의 요청을 받아 백엔드 서비스로 라우팅하고, 다양한 부가기능을 제공하는 중간 서버의 역할을 한다.
- 클라이언트와 서비스간의 단일 진입점 역할을 한다.
위의 역할을 수행하기 위해 API 게이트웨이는 아래와 같은 핵심 기능들을 가지고 있다.
- 라우팅 정책 : 클라이언트 요청을 적절한 서비스로 전달 (예: 라우팅, 속도 제한, 요청/응답 조작 등등)
- 보안 정책 : 인증, 권한 부여, 엑세스 제어 및 암호화
- 로드밸런싱 : 여러 서비스 인스턴스간의 부하 분산
- 모니터링 및 로깅 : 요청 및 응답을 로깅하고 모니터링
Spring Cloud Gateway를 사용하여 구성요소들을 관리하려면 다음과 같은 절차가 필요하다.
- Gateway로 사용할 새로운 프로젝트를 구성하고 아래와 같은 의존성을 포함시킨다.
더보기build.gradle 의존성
// build.gradle dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.cloud:spring-cloud-starter-gateway' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' }
- application.yml 파일에서 라우팅을 설정해 준다. (아래의 코드는 예시이므로 자기가 만든 서비스에 맞춰 설정해야할 것이다.)
-
더보기
spring: cloud: gateway: discovery: locator: enabled: true # 서비스 디스커버리를 통해 동적으로 라우트를 생성하도록 설정 routes: - id: users-service # 라우트 식별자 uri: lb://users-service # 'users-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅 predicates: - Path=/users/** # /users/** 경로로 들어오는 요청을 이 라우트로 처리 - id: orders-service # 라우트 식별자 uri: lb://orders-service # 'orders-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅 predicates: - Path=/orders/** #/orders/** 경로로 들어오는 요청을 이 라우트로 처리 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
스프링에서 제공하는 API Gateway 기술인 Spring Cloud Gateway는 다음과 같은 필터 종류를 제공한다.- Global Filter : 모든 요청에 대해 작동하는 필터
- Gateway Filter : 특정 라우트에만 적용되는 필터
위 필터 적용을 위해서는 GlobalFilter 또는 GatewayFilter 인터페이스를 구현하고, Filter메서드를 오버라이드 해야한다.
필터를 입맛대로 설정하기 위해 꼭 알아둬야하는 객체가 3가지가 있다.
- Mono : 리액티브 프로그래밍에서 0 또는 1개의 데이터를 비동기적으로 처리한다. Mono<Void>는 아무 데이터도 반환하지 않는다.
- ServerWebExchange : Http 요청과 응답을 캡슐화한 객체이다. getRequest()로 Http요청을, getResponse()로 Http 응답을 가져온다.
- GatewayFilterChain : 여러 필터를 체인처럼 연결한다. chain.filter(exchange)로 다음 필터로 요청을 전달한다.
필터의 동작 순서에 의해 2가지 종류(Pre 필터, Post 필터)로 나눠진다.
- Pre 필터 : Pre 필터는 요청이 처리되기전에 실행된다. 추가적인 비동기 작업을 수행할 필요가 없으므로 then 메서드를 사용하지 않는다.
- Post 필터 : Post 필터는 요청이 처리된후, 응답이 반환되기 전에 실행된다. 따라서, chain.filter(exchange)를 호출하여 다음 필터를 실행한 후, then 메서드를 사용하여 응답이 완료된후에 실행할 작업을 정의한다.
2024.08.06일자 작성
'프로그래밍 언어 > Spring' 카테고리의 다른 글
인메모리 저장소와 Redis에 대해 파헤치기 (0) 2024.08.08 분산 추적에 대해 파헤치기 (0) 2024.08.07 정규 표현식 정리 (0) 2023.11.29 1대N, N대1, N대M 관계에 대해 알아보자 (1) 2023.11.20 Spring MVC 간단 정리 (1) 2023.11.20