Spring
Spring Boot
Spring Cloud

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)

장점

  1. 비용 리소스 절약
  2. 단위 테스트 효율
  3. API간 사이드 이펙트 줄임
  4. CI/CD가 빨라짐

MSA에서 공통 모듈의 설계에 관한 고찰