본 내용은 인프런에 Dowon Lee 님의 강의내용 간략하게 정리한 내용입니다.
API Gateway 란?
- Spring Cloud 에서 사용되는 로드벨런서 역할을 하는 API
- Netflix 에서 사용되었던 Zuul Service의 확장된 서비스이다.
- Zuul 서비스의 신규개발은 더이상 진행되지 않는다 함.
Spring Cloud gateway 의 역할.
- 로드밸런서의 역할
- 사용자가 Spring Cloud gateway 의 호스트/포트 정보로 데이터를 요청하게 됨.
- gateway 에 다른 마이크로서비스(이하MS)의 url을 등록하여 사용함.
- 요청 url에 따라 gateway는 등록된 MS의 host 정보를 찾고 해당 서비스로 데이터를 요청.
1. Eureka를 사용하지 않고 구성해보기.
먼저 gateway의 사용법을 익히기 위해 Eureka 서버에 등록하지 않은 상태로 구성해 보고자 한다.
Spring Cloud gateway 서비스
원래 Netflix에서는 Zuul 서비스라 불렸지만 Netflix 에서 Spring 재단에 오픈소스로 재공하게 된 후부터
재단에서는 Zuul서비스를 확장시킨 Spring Cloud gateway 서비스로 새로운 패키지로 구성함.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
gateway가 로드벨런서로 역할하기 위해 설정하는 방법으로는
application.yml 에 서비스 정보를 등록하는 방법(1)과 해당정보를 @Bean 어노테이션을 이용해 만드는 방법(2) 2가지가 존재한다.
1) application.yml 에 등록하기
spring:
application:
name: api-gateway-service
cloud:
gateway:
routes:
- id: first-service
uri: http://localhost:8081
predicates:
- Path=/first-service/**
filters:
- CustomFilter
- id: second-service
uri: http://localhost:9091
predicates:
- Path=/second-service/**
filters:
- name: CustomFilter
yml 로 등록할 때 위와 같이 spring.cloud.gateway.routes 에 라우팅될 서비스들의 정보를 입력하면 된다.
입력값으로는 MS 의 id 정보, uri를 등록할 수 있고, predicates 항목으로 해당 MS로 요청될 uri뒤에 올 Path 정보를 입력해준다.
filters 를 통해 해당 서비스를 이용할 때 사용될 필터도 등록할 수 있다.
AddRequestXXX, AddResponseXXX 를 통해 직접 다룰수도 있고, 위 처럼 필터 컴포넌트를 하나 정의하여 컴포넌트 클래스 이름을 등록해 주면 등록된 MS 요청시 필터로 사용될 수 있다.
2. Bean으로 등록하기.
@Configuration
public class FilterConfig {
// yml 설정에서 할수 있는 것을 Java로 설정
@Bean
public RouteLocator gatewayRouter(RouteLocatorBuilder builder){
return builder.routes()
.route(r -> r.path("/first-service/**")
.filters(f -> f.filter(customFilter.apply(customFilter.newConfig())))
.uri("http://localhost:8081"))
.route(r -> r.path("/second-service/**")
.filters(f -> f.addRequestHeader("second-request","second-request-header")
.addResponseHeader("second-response","second-response-header"))
.uri("http://localhost:8082"))
.build();
}
}
@Configuration 어노테이션 안에서 RouteLocator 클래스의 Bean을 생성해준다. 생성파라미터로 RouteLocatorBuilder 를 받는다.
라우트 정보는 builder.routes().route(라우팅정보).build() 로 객체를 생성해 준다.
route 메서드 안에서는 람다식으로 Functional 인터페이스를 정의해 준다.
여기서 r 은 PredicateSpec 인터페이스의 메서드를 체인닝 메서드 방식을 이용하여 정의해준다.
정의되는 정보로는 path(요청패스정보), filters(필터정보), uri(uri정보) 등이다.
위처럼 작성시 application.yml 에 작성된 내용과 동일한 방식으로 동작하게 된다.
게이트웨이를 Eureka 와 연동
게이트웨이를 Eureka에 등록하여 사용하려면 로드벨런싱 되는 서비스의 uri 를 아래와 같이 변경해야한다.
spring:
cloud:
routes:
- id: first-service
uri: lb://MY-FIRST-SERVICE # Eureka 에 등록할떄는 URL을 lb://{Eureka에 등록된 Name} 으로 설정해준다.
predicates:
- Path=/first-service/**
filters:
- CustomFilter
- id: second-service
uri: lb://MY-SECOND-SERVICE
predicates:
- Path=/second-service/**
filters:
- name: CustomFilter
- name: LoggingFilter
args:
baseMessage: Spring Cloud Gateway Logging Filter
preLogger: true
postLogger: true
각 서비스가 돌고있는 호스트정보를 바로 넣지 않고, Eureka에 등록된 Application 네임을 이용하여 uri 접근을 한다.
lb://{Eureka에 등록된 Name} 형식으로 작성하면 된다.
'Web > Spring' 카테고리의 다른 글
[Spring] 스프링 레퍼런스/소스 구석구석까지 탈탈 털기 - 1 (2) | 2024.10.08 |
---|---|
[SCDF] 우당탕탕 Spring Cloud Data Flow 시작기.. (0) | 2023.02.23 |
[Spring Cloud] Eureka 서버 기동하기 (0) | 2022.08.18 |
[Spring] 트랜잭션 전파(Transactional Propagation) (0) | 2022.07.13 |
[Query dsl] maven QueryDsl 설정 (0) | 2022.07.11 |
댓글