[Spring Cloud] - 6. Eureka๋ฅผ ์ด์ฉํ ์๋น์ค ๊ฒ์
MSA๋ก ์ค๊ณ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ทธ ์ธ์คํด์ค๊ฐ ์๋น์ค๋ณ๋ก ๋๋์ด์ ธ ์๊ณ , ๋ง์ฝ ์ด๋ฅผ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ด์ฉํด ์ฌ๋ฌ ์๋น์ค๋ฅผ ๋ถ์ฐ ์ฒ๋ฆฌํ๊ฒ ๋๋ค๋ฉด, ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค๊ฐ ์ฌ๋ฌ ๊ฐ ์๊ธฐ๊ฒ ๋๋ฉฐ, ๊ทธ๋ ๊ฒ ๋๋ฉด API ์์ฒญ๋ง๋ค ์ ์ ํ ์ธ์คํด์ค์ Endpoint๋ฅผ ๋งค๊ฒจ์ค์ผ ํฉ๋๋ค.
Service Discovery๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์, Server-Client ๋ฐฉ์๊ณผ ์ ์ฌํ Self-Registration Pattern์ ์ด์ฉํด ์์ ์ ์๋น์ค๋ฅผ ์ค์์ Registry์ ๋ฑ๋กํ๊ณ , ์ด๋ฅผ ์์ฒญํ ๋๋ง๋ค ์๋ง๋ Endpoint๋ฅผ ๋งค์นญํด์ค๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
Eureka
Spring Cloud ์คํ์์ ์ด๋ฌํ ์ญํ ์ ํ๋ ๋ํ์ ์ธ ๋ชจ๋๋ก Eureka๊ฐ ์์ต๋๋ค. Eureka๋ Netflix OSS ์ค ํ๋๋ก Spring Boot์ ํธํ๋์ด ๋์ํฉ๋๋ค.
Eureka๋ ๊ธฐ๋ณธ์ ์ผ๋ก REST ๊ธฐ๋ฐ์ ์๋น์ค์ ๋๋ค. ๋ฐ๋ผ์ ์๋น์ค ์ธ์คํด์ค๋ค์ ์ ํด์ง Eureka Server์ Endpoint๋ฅผ ์ด์ฉํ์ฌ ์์ ์ ๋ฑ๋กํ๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ์ํ๋ ์๋น์ค API์ ๋ง๊ฒ ์๋ฒ์์ ์ธ์คํด์ค๋ฅผ ๋งค์นญ์์ผ์ฃผ๊ฒ ๋ฉ๋๋ค.
์ด ์ธ์๋ Apache Zookeeper, Consul ๋ฑ ๋ค์ํ Service Discovery๋ฅผ ์ง์ํ๋ ๋ชจ๋์ด ์์ต๋๋ค.
Create Eureka Server
๊ทธ๋ผ ์ด์ ๊ฐ๋จํ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ Eureka ์๋ฒ๋ฅผ ํ๋ ๋ง๋ค์ด๋ณด๋๋ก ํ์ฃ .
...
extra["springCloudVersion"] = "Hoxton.SR1"
dependencies {
...
implementation("org.springframework.cloud:spring-cloud-starter-netflix-eureka-server")
...
}
dependencyManagement {
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}")
}
}
...
Gradle์ ์์ ๊ฐ์ด eureka-server dependency๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
# bootstrap.yml
server:
port: 8761
spring:
application:
name: nk-eureka
# profiles:
# active: local
eureka:
client:
register-with-eureka: true
fetch-registry: false
๊ทธ๋ฐ ๋ค์, resources/bootstrap.yml ํ์ผ์ ํ๋ ์์ฑํ์ฌ ์์ ๋ด์ฉ์ ์ ๋ ฅํด์ค๋๋ค. ์ฐ๋ฆฌ๋ 8761๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๊ณ , ์์ ์ ์๋น์ค๋ฅผ Eureka ์๋ฒ๋ก ๋ฑ๋กํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ , Profiles์ active๋ฅผ ์ ์ด๋ฃ์ ์ฝ๋๋ฅผ ์ฃผ์ ์ฒ๋ฆฌ๋ง ํ์๋๋ฐ, ์ด๋ Eureka Server์ ์ค์ ์ Configuration Server์ ๋๊ธฐํ ํ์ ๋ ์ฌ์ฉํ๋ ์ต์ ์ด์ง๋ง, ํ์ฌ๋ ์ฌ์ฉํ์ง ์์ ๊ฒ์ด๊ณ , ๊ฐ๋ฅํ๋ฉด ์ด๋ฅผ ๊ถ์ฅํ๋ ๋ฐ์ ๋๋ค.
์๋ํ๋ฉด, Eureka ์๋ฒ์ Configuration Server์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๊ณ , ์ฐจํ์๋ Configuration Server์ Eureka Client๊ฐ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ์ค ์ด๋ ํ ์ชฝ์ ์๋ฒ๊ฐ ๋จผ์ ์คํ๋์ผ๋ฉด ์คํ๋์์์ง ์ฐ์ , ๋ ์๋ฒ๊ฐ ๋์์ ์คํ๋๋ ๊ฒฝ์ฐ๋ ์ ๋ ์กด์ฌํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด๋ ๊ฒ ๋๋ฉด ๋ ์๋ฒ๊ฐ ์๋ก ๋ด ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ์๋ฒ๋ฅผ ์ฐพ์ง ๋ชปํด ์คํํ์ง ๋ชปํ๋ ์ํฉ์ด ๋ฉ๋๋ค.
@EnableEurekaServer
@SpringBootApplication
...
๋ง์ง๋ง์ผ๋ก EnableEurekaServer๋ผ๋ ์ด๋ ธํ ์ด์ ๋ง ๋ถ์ฌ์ฃผ๋ฉด Eureka ์๋ฒ์ ๊ธฐ๋ณธ ํ์ด ์์ฑ๋ฉ๋๋ค.
๊ทธ๋ผ ํ ๋ฒ ์คํํด๋ณด๋๋ก ํ์ฃ .
์๋ฒ๋ฅผ ์คํํ ๋ค, http://localhost:8761์ ์ ์ํ๋ฉด, ์์ ๊ฐ์ด Eureka์ ๋ฉ์ธ ํ๋ฉด์ด ๋ํ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , Eureka ์๋ฒ์ ๋ฑ๋ก๋ ํด๋ผ์ด์ธํธ๋ค์ Instances currently registered with Eureka์ ํ์๋์ง๋ง, ํ์ฌ๋ ์์ง Client์์ ์๋ฒ์ ๋ฑ๋กํ ์๋น์ค ์ธ์คํด์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ๋๋ ๋์ค๊ณ ์์ง ์๋ ๋ชจ์ต์ ๋๋ค.
Register Instance
๊ทธ๋ผ ์ด์ ์๋ฒ๊ฐ ๋ง๋ค์ด์ก์ผ๋, ์ธ์คํด์ค๋ฅผ ๋ฑ๋กํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋จผ์ ๊ธฐ์กด ํฌ์คํธ์์ ์์ฑํ Member Service๋ฅผ ์ด์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
implementation("org.springframework.cloud:spring-cloud-starter-netflix-eureka-client")
Gradle ํ์ผ์ ์ด๊ณ , ๋ํ๋์์ ์์ Eureka Client๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
eureka:
client:
service-url:
defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}
instance:
prefer-ip-address: true
๊ทธ๋ฐ ํ, Bootstrap.yml ํ์ผ์ ์ด๊ณ , ์์ ๊ฐ์ด Eureka ์๋ฒ์ URI ์ฃผ์๋ฅผ ๋ฃ์ด์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ , ๊ฐ๋ฅํ prefer-ip-address ์ต์ ์ true๋ก ์ค์ ํ์ฌ, ํด๋ผ์ด์ธํธ๊ฐ ๋๋ฉ์ธ ์ฃผ์๊ฐ ์๋ ๊ฐ๊ธ์ IP ์ฃผ์๋ก ํต์ ํ ์ ์๋๋ก ํด์ฃผ๋ ๊ฑธ ๊ถ์ฅํฉ๋๋ค.
@EnableDiscoveryClient
@SpringBootApplication
...
๊ทธ๋ฆฌ๊ณ , EnableDiscoveryClient ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํ๊ณ , ์๋ฒ๋ฅผ ์คํํ๋ฉด, Eureka ์๋ฒ์ member service๊ฐ ๋ฑ๋ก๋ฉ๋๋ค.
ํ์ธํ๊ธฐ ์ ์ ์ฐ๋ฆฌ๊ฐ ํ ๊ฐ์ง ๋ ์๋ฒ์ ๋ฑ๋กํด์ผ ํ ๊ฒ์ด ์์ต๋๋ค. ๋ฐ๋ก API Gateway์ธ๋ฐ์. ์ API Gateway๋ Eureka ์๋ฒ์ ๋ฑ๋กํด์ผ ํ ๊น์?
API Gateway์ ์ญํ ์ ์๋ค์ํผ ํน์ ์๋น์ค๊ฐ ์๋ ์๋ํฌ์ธํธ๋ฅผ ์๋น์ค๋ณ๋ก ํธ์ถํด์ฃผ๋ ํ๋ก์ ์ญํ ์ ๋๋ค. ๋ฐ๋ผ์ ์ํ๋ API ์๋ํฌ์ธํธ๋ฅผ ๋ถ๋ฅด๊ฒ ๋๋ฉด, ๊ฒ์ดํธ์จ์ด๋ Eureka ์๋ฒ๋ฅผ ํตํด ํด๋น ์๋ํฌ์ธํธ๊ฐ ์ด๋ ์ฃผ์์ ์๋์ง๋ฅผ ์์ฒญํ๊ฒ ๋๊ณ , Eurka ์๋ฒ๊ฐ ์ด๋ฅผ ์ ๊ณตํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Zuul Gateway์์ ์ด๋ฅผ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ Zuul Gateway ํ๋ก์ ํธ๋ฅผ ์ด์ด์, ์์ ๊ฐ์ด ๋ํ๋์๋ฅผ ์ถ๊ฐํ๊ณ , Eureka ์๋ฒ๋ฅผ ์ถ๊ฐํ๋ ์์ ์ ๋์ผํ๊ฒ ์งํํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ Eureka ๋ฉ์ธ ํ์ด์ง์ ์ ์ํ๋ฉด, ์ ์ด๋ฏธ์ง์ฒ๋ผ ๊ฒ์ดํธ์จ์ด์ Member Service๊ฐ Eureka ์๋ฒ์ ๋ฑ๋ก๋ฉ๋๋ค.
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง Eureka๋ฅผ ์ด์ฉํ Service Discovery์ ๋ํด ์์๋ดค์ต๋๋ค. ๊ฐ๋จํ ์ธ์คํด์ค๋ง์ ๋ค๋ฃจ๋ฉฐ ํ ์คํธ๋ง ํด๋ณด๋ ๊ฒ์ ๋ค๋ค๋ดค์ต๋๋ค๋ง ์ค์ ๋ก ์ํฅ ์๋ ํ ์คํธ๋ฅผ ์งํํ๋ ค๋ฉด, Docker ๋ฑ์ ์ด์ฉํด์ ์ฌ๋ฌ ๊ฐ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , Eureka์ ์ง์ ์ถ๊ฐํ๊ณ , ๋ถํ ํ ์คํธ๋ฅผ ์งํํ๋ ๊ฒ์ด ๊ฐ์ฅ ๋ฐ๋์งํ ๊ฒ์ด๋ผ๊ณ ๋ด ๋๋ค.
๊ธฐํ๊ฐ ๋๋ค๋ฉด, ๋ถํ ํ ์คํธ ํด์ ์ด์ฉํ์ฌ ์ง์ ์ฐ๊ณ ์๋น์ค๋ฅผ ํ ๋ฒ ํฌ์คํ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring boot] IntelliJ IDEA๋ฅผ ์ด์ฉํ Spring boot ํ๋ก์ ํธ ์์ (0) | 2020.04.21 |
---|---|
[Spring Cloud] - 7. Hystrix๋ฅผ ์ด์ฉํ Circuit Breaker (๊ธฐ๋ณธํธ) (0) | 2020.03.28 |
[Spring Cloud] - 5. Zuul Gateway๋ฅผ ์ด์ฉํ Filtering (0) | 2020.01.22 |
[Spring Cloud] - 4. Zuul Gateway๋ฅผ ์ด์ฉํ Routing (0) | 2020.01.17 |
[Spring Cloud] - 3. API ์๋ฒ๋ก ์ค์ ๊ฐ ๋ถ๋ฌ์ค๊ธฐ (0) | 2019.12.29 |