각각의 MSA 서비스를 다른 포트 번호로 접속해야한다면 모든 서비스의 포트 번호를 기억해야 한다. Spring Cloud Gateway를 사용하면 Gateway의 포트 번호를 통해 다른 MSA 서비스들에 접근할 수 있다. 즉 Spring Cloud Gateway는 각 서비스들의 요청을 적절한 MSA 서비스에 라우팅해주는 역할을 한다.
처음엔 Spring Cloud Netflix Zuul을 사용했으나 Spring Boot 2.4.X 버전부터는 지원하지 않으므로 현재는 Spring Cloud Gateway 사용을 권장하고 있다.
Route
응답을 보낼 목적지 URI, Predicate, Filter로 구성된다. Client로 부터 어떤 요청이 왔는지 확인하고 서버에 Mapping하는 작업을 수행한다.
Predicate
Handler Mapping시에 필요한 URI나, Path를 확인한다.
Filter
Handler Mapping이 된 후 들어온 요청에 대한 필터 작업을 수행한다.
Spring Boot 프로젝트를 생성해준다. 이 때 Dependency로 Eureka Discovery Client와 Gateway를 추가해준다.
server:
port: 8130
eureka:
instance:
prefer-ip-address: true #서비스의 ip 주소를 Eureka Server에 등록
client:
service-url:
defaultZone: http://localhost:8761/eureka #Eureka Server
spring:
application:
name: gateway-service #Eureka Server에 등록할 Application 이름 지정
cloud:
gateway:
routes: #라우팅 정보 등록
- id: catalog
uri: http://localhost:8031/
predicates:
- Path=/catalogs/**
- id: customer
uri: http://localhost:8032/
predicates:
- Path=/customers/**
spring.cloud.gateway.routes에 등록할 서비스들의 정보를 입력해준다. 서비스의 predicate와 filter를 지정해줄 수 있다.
(해당 서비스들은 Eureka Server에 등록되어 있어야 한다.)
Gateway port 번호인 8130으로 customer 서비스를 호출했을 때와 customer 서비스의 port 번호인 8032로 호출했을 때 같은 결과를 확인할 수 있다.
서비스별 uri를 lb://{SpringBoot Application 이름}
으로 변경해주면 로드밸런싱이 적용된다.
spring:
application:
name: gateway-service #Eureka Server에 등록할 Application 이름 지정
cloud:
gateway:
routes: #라우팅 정보 등록
- id: catalog
uri: lb://catalog
predicates:
- Path=/catalogs/**
- id: customer
uri: lb://customer
predicates:
- Path=/customers/**
https://velog.io/@ililil9482/Spring-Cloud-Gateway
https://wonit.tistory.com/497
https://spring.io/projects/spring-cloud-gateway