[SCG] 1. Spring Cloud Gateway 설정(1) - Routing


Spring Cloud Gateway 구축하기 위한 포스팅 중에 Routing 설정하는 포스팅 초안이다.



springboot-scg-main-logo



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. 프로젝트 생성


springboot-scg-s1

springboot-scg-s2

springboot-scg-s3

springboot-scg-s4



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 확인을 해보면 위에서 설정한 라우터들을 확인할 수 있다.


springboot-scg-s5


◼︎ 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로 정상적으로 요청 후에 응답한 것을 아래와 같이 볼 수 있다.

springboot-scg-s8




[참고]

  • https://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html