본문 바로가기
Infra System

Api-gateway Server - Outer Architecture

by kellis 2020. 10. 14.

pom.xml

gateway-server로 spring-cloud-start-gateway를 사용할 예정입니다. 그리고 air-gateway도 eureka-server에 등록될 eureka-client이기 때문에 air-eureka-client를 상속받으려 했습니다. 하지만 의존성 관계를 보면, air-eureka-client가 spring-boot-starter-web을 의존하고 있고 spring-cloud-start-gateway는 spring-boot-starter-webflux를 의존하고 있어서 서로 충돌하는 결과가 발생했습니다. 따라서 air-gateway에서는 spring-boot-starter-parent를 직접 상속받아서 필요한 library를 dependency에 추가하였습니다. 

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>kr.sys4u.lab</groupId>
    <artifactId>air-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>air-gateway</name>
    <description>Demo project for Spring Boot</description>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-kotlin</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-reflect</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib-jdk8</artifactId>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib-jdk8</artifactId>
            <version>${kotlin.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-test</artifactId>
            <version>${kotlin.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
  • 16~26라인: spring-cloud library는 spring-boot-starter-parent에 기본적으로 추가되어있지 않으므로 반드시 spring-cloud-dependencies를 dependencyManagement에 추가해야 cloud library를 dependency에 추가할 수 있습니다. spring-cloud의 버전과 springboot의 버전을 잘 매핑시키는 것이 중요한데, 이는 공식 문서를 참고하시기 바랍니다.

application.yml

앞에서 언급했듯, air-gateway도 eureka-client로서 동작합니다. 따라서 eureka-server의 위치를 명시해주어야 합니다.

server:
  port: 8888
spring:
  application:
    name: air-gateway
 
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7979/eureka
  • 3~5라인: eureka-client를 어떤 이름으로 eureka-server에 등록시킬지 결정하는 요소.
  • 7~10라인: eureka-server의 위치를 명시.

routes configuration

[Routes.kt]

@Configuration
class Routes {
    @Bean
    fun myroutes(routeLocatorBuilder: RouteLocatorBuilder): RouteLocator =
            routeLocatorBuilder.routes {
                route{
                    path("/auth/**")
                    uri("lb://air-auth/")
                }
 
                /* prototype */
                route {
                    path("/test/**")
                    uri("lb://air-mariadb-prototype/")
                }
                route{
                    path("/mongo/**")
                    uri("lb://air-mongodb-prototype/")
                }
            }
}

air-gateway로 요청이 들어왔을 때, path에 따라 어떤 서비스로 요청을 라우팅 할지 설정해주어야 합니다. eureka-server에 다른 모든 서비스가 등록되어 있으므로 uri에 "lb://[서비스명]"을 입력합니다. 만약 eureka를 사용하지 않는다면 http://ip:port로 명시해주어야 합니다. 


springboot main 

[AirGatewayApplication.kt]

@EnableDiscoveryClient
@SpringBootApplication
class AirGatewayApplication
 
fun main(args: Array<String>) {
    runApplication<AirGatewayApplication>(*args)
}
  • 1라인: Springboot Main 클래스에 @EnableDiscoveryClient을 추가해주어야 해당 애플리케이션이 api-gateway로 동작합니다.

댓글