[Spring Cloud] - 4. Zuul Gateway๋ฅผ ์ด์ฉํ Routing
์ง๋ MSA ํฌ์คํธ์ ์ด์ด, ์ด๋ฒ ํฌ์คํธ์์๋ Spring Cloud์์ API Gateway๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
ํน์ ์ง๋ ๊ธ์ ์ฝ์ด๋ณด์์ง ๋ชปํ๋ค๋ฉด, ์ ๋งํฌ๋ฅผ ํตํด์ API Gateway๊ฐ MSA์์ ์ ํ์ํ์ง, ์์๋ณด์๊ณ ๊ฐ์ ๋ค๋ฉด, ์ด ํฌ์คํธ๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Gateway for Spring Cloud
Spring Cloud์์ Gateway๋ ํ์ฌ ์๋์ 5๊ฐ์ ํญ๋ชฉ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ค๋ฃฐ ๊ฒ์ Zuul์ธ๋ฐ์. Zuul ์ธ์๋ ์ฌ๋ฌ ๊ฒ์ดํธ์จ์ด๊ฐ ์์ง๋ง, ๋ํ์ ์ผ๋ก Spring ํ๋ก์ ํธ ์์ฑ์ ๋ํ๋๋ ์ ํ์ง๋ ์์ 5๊ฐ์ง ์ ๋๋ค. ๊ทธ ์ธ์๋ Linkerd, nginx (legacy) ๋ฑ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ฃ .
Zuul Gateway
Zuul Gateway๋ Netflix์์ ๊ฐ๋ฐํ ์คํ ์์ค ๊ฒ์ดํธ์จ์ด ์ค ํ๋๋ก, ์ค์ ๋ก Zuul์ Netflix์์ ์๋์ ๊ฐ์ด ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
Zuul is the front door for all requests from devices and web sites to the backend of the Netflix streaming application. As an edge service application, Zuul is built to enable dynamic routing, monitoring, resiliency and security. It also has the ability to route requests to multiple Amazon Auto Scaling Groups as appropriate.
Zuul์ Netflix ์คํธ๋ฆฌ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฑ์๋ ์น ์ฌ์ดํธ์ ๋๋ฐ์ด์ค ๊ฐ์ ์ด๋ฅด๋ ๋ชจ๋ ์์ฒญ์ ์๋จ์ผ๋ก, Edge Service Application์ผ๋ก์จ ๋์ ๋ผ์ฐํ , ๋ชจ๋ํฐ๋ง, ๋ณต์๋ ฅ๊ณผ ๋ณด์์ ์ํด ๊ตฌ์ถ๋์์ต๋๋ค. ๋ํ Amazon Auto Scaling ๊ทธ๋ฃน์ ์๋ ์ปจํ ์ด๋๋ค์ ์์ฒญ์ ๋ผ์ฐํ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ด ๋ฌธ๊ตฌ๋ Zuul์ Github Wiki์ ์ฒซ ๋ฌธ๊ตฌ๋ก ๊ธฐ๋ก๋์ด ์๋ Zuul์ ์ญํ ์ ๊ฐ๋จํ ๊ธฐ์ฌํ ๊ฒ์ ๋๋ค. ์ค์ ๋ก ๋ฐฑ์๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ ๋ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ๋ก ๊ณ ๋ คํด์ผ ํ๋ ์ฌํญ์ ๋ฌด์๋นํ ํธ๋ํฝ์ผ ๊ฒ์ ๋๋ค.
์๋น์ค๋ฅผ ํ ๋ฒ ์คํํ๊ณ , ์๋นํ ์ฌ์ฉ์๋ค์ด ์ ์ํ๊ฒ ๋๋ ๊ฒ์ ์ด์ ๊ณ ๊ธ์ด ์๋ ํ์๊ฐ ๋์์ต๋๋ค. PC ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ฐ์ผ ๋๋ฐ์ด์ค์์๋ ์ด์ ์๋ฒ์ ์ ์ํ ์ ์๋ ์๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ค์ํ ํด๋ผ์ด์ธํธ๋ค์ด ์ ์ํ๊ณ , ๋ฉํฐ๋ฏธ๋์ด ์๋น์ค์ ๊ฒฝ์ฐ ํ ์คํธ ์๋น์ค์ ๋นํด ํธ๋ํฝ๋์ด ์ ์ญ๋ฐฐ ์ด์์ด ๋ฌํ๋๋ฐ, ์ด๋ฅผ ์ฒ๋ฆฌํ๋ค๋ณด๋ฉด, ์ด์์ ์ด์๊ฐ ๋ฐ์ํ๊ณ , ์ด๋ฅผ ์ ์ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๊ฒจ๋ ๊ฒ์ด ๋ฐ๋ก Zuul Gateway ์ ๋๋ค.
Routing
์ด ํฌ์คํธ์์๋ Routing์ ๋ํด์ ์ด์ผ๊ธฐํ๊ณ ์ ํฉ๋๋ค. API๋ฅผ ๊ฐ๋ฐํ ๋ค์, ๋ผ์ฐํ ์ ์ธ์ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ ๊น์?
์ง๋ ํฌ์คํธ๋ฅผ ๋ณต์ตํ๋ ๊ฒธ, MSA์ ๊ฒฝ์ฐ, ๊ฐ ์๋น์ค๋ณ๋ก ์ด๋ ๊ฒ API ์๋ฒ๊ฐ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ํ์ง๋ง ๊ฐ ํฌํธ๋ฒํธ๊ฐ ๋ค๋ฅด๊ณ , IP ์ฃผ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ค API๊ฐ ์ด๋ URI๋ก ๋์ด ์๋์ง ์ฐพ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
๊ธฐ์กด์ ๋ชจ๋๋ฆฌํฑ ์ํคํ ์ฒ๋ ๊ฐ์ IP ์ฃผ์์ ํฌํธ์ฃผ์๋ฅผ ์ฌ์ฉํด EndPoint๋ง ๊ฐ์ง๊ณ ์ฝ๊ฒ ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ๋ฉด ๋์์ง๋ง, MSA๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์๋ก ๋ค๋ฅธ IP์ ํฌํธ ์ฃผ์๋ฅผ ์ฌ์ฉํ๋ ํ์ ํผ๋์ด ์ฌ ์๊ฐ ์์ฃ .
์ด๋ด ๋ ๋ผ์ฐํ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์, ํน์ ์ฃผ์๋ฅผ ์ ํด๋๊ณ , ๋ผ์ฐํ ํ๋๋ก ํ๋ฉด ์๋ํฌ์ธํธ๋ง ์๊ณ ์์ด๋ ์ฝ๊ฒ ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ทผํ ์ ์์ต๋๋ค.
Create Zuul Gateway
๊ทธ๋ผ ์ด์ Spring Cloud์ Zuul Gateway๋ฅผ ์ง์ ํ ๋ฒ ๋ถ์ฌ๋ณด๋๋ก ํ์ฃ . ์ด ํฌ์คํธ์์๋ Kotlin๊ณผ Gradle์ ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค.
repositories {
mavenCentral()
maven { url = uri("https://repo.spring.io/snapshot") }
maven { url = uri("https://repo.spring.io/milestone") }
}
extra["springCloudVersion"] = "Hoxton.BUILD-SNAPSHOT"
dependencies {
implementation("org.springframework.boot:spring-boot-starter")
implementation("org.springframework.cloud:spring-cloud-starter-netflix-zuul")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
testImplementation("org.springframework.boot:spring-boot-starter-test") {
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
}
}
dependencyManagement {
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}")
}
}
build.gradle.kts ํ์ผ์ ์์ ๊ฐ์ด Zuul dependency๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
# application.yml
spring:
application:
name: nk-gateway
server:
port: 9100
zuul:
routes:
member:
stripPrefix: false
path: /v1/member/**
url: http://localhost:8080
note:
stripPrefix: false
path: /v1/note/**
url: http://localhost:8081
else:
stripPrefix: false
path: /v1/**
url: http://localhost:8081
Zuul Gateway์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฆ๊ณผ ์ฌ์ฉํ ํฌํธ ์ฃผ์๋ฅผ ์ ๋ ฅํด์ค๋๋ค.
๊ทธ ๋ค์์ ๊ฐ API๋ฅผ ํธ์ถํ์์ ๋, ๋ผ์ฐํ ํ ์๋ URL ์ฃผ์๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋์ผ๋ง Gateway ์ฃผ์์ ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ์์ ๋ ํด๋น API URI ์ฃผ์๋ฅผ ํธ์ถํ๋๋ก ํ๋ ๊ฒ์ด์ฃ .
@EnableZuulProxy
@SpringBootApplication
class GatewayexampleApplication
fun main(args: Array<String>) {
runApplication<GatewayexampleApplication>(*args)
}
๋ง์ง๋ง์ผ๋ก @EnableZuulProxy ์ด๋ ธํ ์ด์ ์ ์ ๋ ฅํ์ฌ Zuul Gateway๋ฅผ ๊ตฌ์ถํ์๋ฉด ๋์ ๋๋ค.
Test
๊ฒ์ดํธ์จ์ด๋ฅผ ๋ง๋ค์์ผ๋, ๋ด๊ฐ ๋ง๋ API๊ฐ ์ ๋๋ก ๋ผ์ฐํ ๋์ด์ง๋์ง ํ์ธํด๋ณด๋๋ก ํ์ฃ .
๊ทธ๋ฌ๋ฉด Zuul Gateway๊ฐ ์คํ ์ค์ธ 9100๋ฒ ์ฃผ์์์ Member API ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํง ๊ฒฝ์ฐ, ์๋์ผ๋ก Member ์๋ฒ๋ก ๋ผ์ฐํ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง Zuul Gateway๋ฅผ ์ฌ์ฉํด์ API๋ฅผ ๋ผ์ฐํ ํ๋ ์์ฃผ ๊ฐ๋จํ ๋ด์ฉ์ ๋ค๋ค๋ดค์ต๋๋ค. Zuul Gateway์์ ๋ผ์ฐํ ์ ๊ฐ ์๋น์ค ์๋จ์ ๊ตฌ์ถ๋์ด ์์ด, ํด๋ผ์ด์ธํธ๊ฐ ์ํ๋ API๋ฅผ ์ฐพ๋ ๋ฐ ์ด์ ํ ์ญํ ์ ํ๋ ์กด์ฌ์ ๋๋ค.
๋ค์ ํํธ์์๋ Zuul Gateway๋ฅผ ์ด์ฉํ Filtering์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Ref: Zuul wiki(https://github.com/Netflix/zuul/wiki)
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Cloud] - 6. Eureka๋ฅผ ์ด์ฉํ ์๋น์ค ๊ฒ์ (0) | 2020.02.08 |
---|---|
[Spring Cloud] - 5. Zuul Gateway๋ฅผ ์ด์ฉํ Filtering (0) | 2020.01.22 |
[Spring Cloud] - 3. API ์๋ฒ๋ก ์ค์ ๊ฐ ๋ถ๋ฌ์ค๊ธฐ (0) | 2019.12.29 |
[Spring Cloud] - 2. Github and Configuration Server (0) | 2019.12.26 |
[Spring Cloud] - 1. Configuration Server ๊ตฌ์ฑ (0) | 2019.12.22 |