Gateway 는 사용자가 설정한 라우팅 설정에 따라서 각각 엔드포인트로 클라이언트를 대신해서 요청하고
응답을 받으면 다시 클라이언트에게 전달해주는 Proxy 역할을 하는 서비스 입니다.
직접적으로 마이크로 서비스를 호출하지 않고 API Gateway 서비스하고만 통신하도록 하는 형태로
시스템의 내부 구조는 숨기고 외부의 요청에 대해서 적절한 형태로 가공해서 응답할 수 있다는 장점을 가지고 있습니다.
1. API Gateway server 구축
1.1 의존성 추가
Spring Cloud Gateway를 사용하기 위해 라이브러리 의존성을 추가해줍니다.
spring cloud starte gateway의 경우 Netty 기반의 비동기 통신을 지원하는 형태로 실행이 되기 때문에 web이 아닌 webflux 라이브러리를 함께 사용해 줍니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}
1.2 라우팅 정보 등록
라우팅 정보를 application.yml 파일에 설정 가능합니다.
구성은 크게 Route, Predicate, Filter 3가지로 되어 있습니다.
spring:
main:
web-application-type: reactive
application:
name: gateway-service
cloud:
gateway:
default-filters:
- GlobalFilter
routes:
- id: auth-service
uri: lb://auth-service
predicates:
- Path=/auth-servie/**
filters:
- RewritePath=/auth-service/(?<segment>.*), /$\{segment}
- Spring Cloud Gateway는 Reactive로 동작하므로 web-application-type을 reactive로 설정해줍니다.
- Cloud Gateway 설정: Spring Cloud Gateway의 설정을 시작합니다.
- Default Filters 설정: 게이트웨이에 적용할 기본 필터를 지정합니다.
GlobalFilter를 사용하여 글로벌 필터를 적용하도록 설정되어 있습니다. - Route 설정: 게이트웨이의 라우팅을 정의합니다.
여러 개의 라우트가 있을 수 있으며, 각 라우트는 고유한 id로 식별됩니다.- ID 설정: 이 라우트의 고유한 식별자를 나타냅니다. 여기서는 auth-service로 지정되었습니다.
- URI 설정: 요청이 전달될 서비스의 URI를 지정합니다.
여기서는 lb://auth-service로 지정되었습니다. lb://는 Load Balancer의 약어로, 이를 통해 Eureka 서버를 통해 등록된 서비스의 인스턴스에 로드 밸런싱을 수행할 수 있습니다.
마이크로 서비스 각각의 IP:PORT 형태로 호출할 수도 있지만 언제든 변경될 수 있기 때문에 각각의 service명을 사용하는 것이 좋습니다. - Predicates 설정: 라우팅이 적용될 조건을 정의합니다.
URI의 경로가 /auth-service/**로 시작하는 요청에 대해서만 이 라우트가 적용되도록 설정되어 있습니다. - Filters 설정: 라우팅된 요청을 변경하거나 재작성하는 필터를 정의합니다.
/auth-service/ 부분을 제거하여 요청을 다시 작성하고 있습니다.
예를 들어, /auth-service/some/path라는 요청이 들어오면, 실제 서비스로 전달되는 요청은 /some/path로 변경됩니다.
- Spring Cloud Gateway의 공식문서입니다.
Route Predicate Factories :: Spring Cloud Gateway
The XForwarded Remote Addr route predicate factory takes a list (min size 1) of sources, which are CIDR-notation (IPv4 or IPv6) strings, such as 192.168.0.1/16 (where 192.168.0.1 is an IP address and 16 is a subnet mask). This route predicate allows reques
docs.spring.io
'Spring > Spring Cloud' 카테고리의 다른 글
[Spring Cloud] Eureka (0) | 2024.03.06 |
---|