
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/
/users/** 경로로 들어오는 요청을 users-service라는 이름으로 로드 밸런싱된 서비스로 라우팅 처리한다./orders/** 경로로 요청이 들어오면 orders-service라는 이름으로 로드 밸런싱된 서비스로 라우팅 처리한다.필터를 구현하려면 GlobalFilter 또는 GatewayFilter 인터페이스를 구현하고 filter 메서드를 오버라이드해야 한다.
Mono<Void> 는 아무 데이터도 반환하지 않음을 의미한다.Pre 필터는 요청이 처리되기 전에 실행된다. 따라서 Pre 필터에서는 요청을 가로채고 필요한 작업을 수행한 다음, 체인의 다음 필터로 요청을 전달한다. 이때, 추가적인 비동기 작업을 수행할 필요가 없기 때문에 then 메서드를 사용할 필요가 없다.
Post 필터는 요청이 처리된 후, 응답이 반환되기 전에 실행된다. Post 필터에서는 체인의 다음 필터가 완료된 후에 실행되어야 하는 추가적인 작업을 수행해야 한다. 따라서 chain.filter(exchange)를 호출하여 다음 필터를 실행한 후, then 메서드를 사용하여 응답이 완료된 후에 실행할 작업을 정의한다.

① 단일 진입점 (Single Entry Point)
클라이언트는 개별 서비스의 주소(19092, 19093 등)를 몰라도 된다. 오직 Gateway(19091) 주소로만 요청을 보낸다.
② 동적 라우팅 (Dynamic Routing)
Gateway는 Eureka Server와 통신하여 각 서비스가 현재 어디에 떠 있는지(IP, Port) 실시간으로 파악한다.
클라이언트가 /order로 요청하면, Gateway는 주소록을 찾아 Order 서비스(19092)로 요청을 라우팅한다.
③ 로드 밸런싱 (Load Balancing)
똑같은 기능을 하는 서비스가 여러 대 떠 있을 때 Gateway는 부하를 적절히 분산한다.
Product 서비스는 현재 19093과 19094 두 대가 가동 중이다.
클라이언트가 계속해서 /product로 요청을 보내면 Gateway는 19093번과 19094번을 번갈아 호출하며 한쪽 서버에 과부하가 걸리지 않도록 조절한다.