[SCG] 1. Spring Cloud Gateway 설정(1) - Routing
in Gitlog on springboot-scg
Spring Cloud Gateway 구축하기 위한 포스팅 중에 Routing 설정하는 포스팅 초안이다.
1. Spring Cloud Gateway - Routing
해당 포스팅과 위에 도식화는 Spring Cloud Config 포스팅 시리즈
에 이어서 작성 된 것이다.
Spring Cloud Gateway 를 사용하기 앞서 API Gateway를 사용하는 이유는 여러 서비스들의 통로 역할로 라우팅, 로드밸런스, 인증, 로그 등 있다. 자세한 내용은 추후에 블로그 정리 시에 작성예정이다.
우선은 Routing 만 확인
하기 위한 포스팅이다. 2개의 서비스를 board-service, user-service 라는 서버를 각각 구동하고 요청 시에 api-gateway를 통해서 라우팅 되는 것을 보자.
우선 아래는 Spring Cloud Gateway에서 주요 기능 설정에 대한 내용이다.
라우트(Route)
- 라우트는 목적지 URI, 조건자 목록과 필터의 목록을 식별하기 위한 고유 ID로 구성된다. 라우트는 모든 조건자가 충족됐을 때만 매칭된다조건자(Predicates)
- 각 요청을 처리하기 전에 실행되는 로직, 헤더와 입력돤값 등 다양한 HTTP 요청이 정의된 기준에 맞는지를 찾는다.필터(Filters)
- HTTP 요청 또는 나가는 HTTP 응답을 수정할 수 있게한다. 다운스트림 요청을 보내기전이나 후에 수정할 수 있다. 라우트 필터는 특정 라우트에 한정된다.
2. 프로젝트 생성
3. 프로젝트 설정
3-1. 주요 dependencies
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
build.gradle
plugins {
id 'org.springframework.boot' version '2.6.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.springcloud'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2021.0.0")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
tasks.named('test') {
useJUnitPlatform()
}
3-2. yml 파일 설정
application.yml
server:
port: 8000
management:
endpoints:
web:
exposure:
include:
- 'gateway'
endpoint:
gateway:
enabled: true
spring:
application:
name: api-gateway-service
cloud:
gateway:
routes:
- id: neo-board-service
uri: http://localhost:8080
predicates:
- Path=/board/**
filters:
- RewritePath=/board/(?<path>.*),/$\{path}
- id: neo-user-service
uri: http://localhost:8081
predicates:
- Path=/user/**
filters:
- RewritePath=/user/?(?<segment>.*), /$\{segment}
- id: neo-config-server
uri: http://localhost:8888
predicates:
- Path=/application/**
filters:
- RewritePath=/application/(?<path>.*),/$\{path}
3-3. API-Service Controller
board-service API
@RestController
@RequestMapping("/v2/demo-board")
public class DemoBoardController {
@GetMapping
public ResponseEntity<Board> demoUser(HttpServletRequest request) throws Exception {
var board = new Board().builder()
.boardIdx(111)
.title("게시판 제목")
.contents("게시판 내용")
.build();
return ResponseEntity.ok().body(board);
}
}
user-service API
@RestController
@RequestMapping("/v2/demo-user")
public class DemoUserController {
@GetMapping
public ResponseEntity<User> demoUser(HttpServletRequest request) throws Exception {
var user = new User().builder()
.userIdx(111)
.id("testID")
.name("홍길동")
.build();
return ResponseEntity.ok().body(user);
}
}
4. Spring Cloud Gateway 주요기능
◼︎ Routes
Spring Cloud Gateway에서 라우팅 설정을 하며, actuator/gateway/routes
확인을 해보면 위에서 설정한 라우터들을 확인할 수 있다.
◼︎ Predicates
Predicates는 해당 라우터에 라우팅 될 조건을 설정하며, if문 같은 구문없이 간단하게 설정할 수 있는 게 장점.
Path=/board/**
, Path=/user/**
로 해당 path로 들어오는 경우 해당 라우터로 각각 board-service 서버와 user-service에 라우팅 된다.
◼︎ Filters
스프링 기능에 Filter 개념과 동일하다. HTTP Request, Reponse에 대해 전처리, 후처리 가능
RewritePath
정규표현식을 이용해서 치환하는 개념으로 예를 들어, /board/v2/demo-board 으로 uri 요청 시에 board-service 서버에 /v2/demo-board 로 요청하는 개념이다.
POST-MAN 으로 localhost:8000(spring cloud gateway API-server)에 /board/v2/demo-board, /user/v2/demo-board
로 uri 요청 시에
api-gateway에서 통해서 다시 각 서비스 서버에 mapping 된 uri로 /v2/demo-board, /v2/demo-board
로 정상적으로 요청 후에 응답한 것을 아래와 같이 볼 수 있다.
[참고]
- https://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html