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로 동작합니다.
'Infra System' 카테고리의 다른 글
Prometheus install - Web UI Dashboard (0) | 2020.10.14 |
---|---|
Authentication Server - Outer Architecture (0) | 2020.10.14 |
Eureka Server(standalone) - Outer Architecture (0) | 2020.10.14 |
MongoDB based Prototype - Inner Architecture (0) | 2020.10.14 |
MariaDB based Prototype - Inner Architecture (0) | 2020.10.14 |
댓글