Spring Cloud
https://spring.io/projects/spring-cloud-gateway (opens in a new tab)
Spring Cloud Gateway
설정
yaml 파일에 다음과 같이 port를 설정하고
server:
port: 9090
Filter 클래스 등록
각 라우터별로 사용할 필터를 등록해준다.
@Component
class ServiceApiPrivateFilter: AbstractGatewayFilterFactory<ServiceApiPrivateFilter.config>(config::class.java) {
companion object: Log
class config
override fun apply(config: config): GatewayFilter {
return GatewayFilter { exchange, chain ->
var uri = exchange.request.uri
log.info("ServiceApiFilter uri: $uri")
val mono = chain.filter(exchange)
mono
}
}
}
Route 설정
아래코드에서 나오는 "/service-api(?<segment>/?.*)", "\${segment}"
부분은 공식 홈페이지에서 나와있는 코드를 약간 수정한 코드로,
예를 들자면 /service-api/api/user/me
와 같은 주소가 들어온다면 service-api
부분을 지우고 /api/user/me
만 남겨서 필터를 통과시킨다.
그렇게 필터가 통과되면 .uri() 부분에 있는 주소뒤에 맵핑 시켜서 라우팅해준다.
@Configuration
class RouteConfig(
private val serviceApiPrivateFilter: ServiceApiPrivateFilter,
) {
@Bean
fun gatewayRoutes(builder: RouteLocatorBuilder): RouteLocator {
return builder
.routes()
.route { spec ->
// 우선순위
spec.order(-1)
spec
.path("/service-api/api/**") // 매칭할 주소
.filters { filterSpec ->
filterSpec.filter(serviceApiPrivateFilter.apply(ServiceApiPrivateFilter.config())) // 필터 지정
filterSpec.rewritePath("/service-api(?<segment>/?.*)", "\${segment}")
}
.uri(
"http://localhost:8080" // 라우팅할 주소
)
}
.build()
}
}
MSA(Micro Service Architecture)
장점
- 비용 리소스 절약
- 단위 테스트 효율
- API간 사이드 이펙트 줄임
- CI/CD가 빨라짐