๐Ÿงถ Spring | Spring Boot/Spring Cloud & MSA

Spring Cloud Netflix Eureka

  • -
๐Ÿ’ก ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ , ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๋ฏธ๋ฆฌ ํ•™์Šตํ•˜๊ณ  ์ฝ์œผ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

 

 

 

Spring Cloud Eureka๋ž€?

  • ๋„ทํ”Œ๋ฆญ์Šค์—์„œ ๋งŒ๋“  ์„œ๋น„์Šค
  • ์„œ๋ฒ„๋“ค์„ ์ค‘์•™ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋“ฑ๋กํ•˜๊ณ  ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ œ์™ธ
  • ์ƒˆ ์ธ์Šคํ„ด์Šค ์‹œ์ž‘์‹œ Eureka ์„œ๋ฒ„์— IP, ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ, ํฌํŠธ ๋ฒˆํ˜ธ ๋“ฑ์„ ์Šค์Šค๋กœ ์ „์†ก.
  • ์šด์˜์ž๋“ค์€ IP ์ •๋ณด๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋จ.
  • ๋‹ค๋ฅธ ์„œ๋น„์Šค ํ˜ธ์ถœ์‹œ Eureka ์„œ๋ฒ„์— ๋“ฑ๋ก๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์กฐํšŒ.
  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉ.

๊ตฌ์„ฑ ์š”์†Œ

Service Discovery

  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ์ž‘์—…
  • Spring Cloud Netflix - Eureka Server ๋ฅผ ์ด์šฉ

Service Registry

  • ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๊ฐ€ ์ž์‹ ์˜ ์œ„์น˜๋ฅผ ํŠน์ • ์„œ๋ฒ„์— ๋“ฑ๋กํ•˜๋Š” ์ž‘์—…
  • Spring Cloud Netflix - Eureka Client ๋ฅผ ์‚ฌ์šฉ

 

ํ๋ฆ„

  1. Service Registry ๊ธฐ๋Šฅ์„ ํ•  Eureka Server ๊ฐ€ ์ตœ์ดˆ์— ๊ธฐ๋™
  2. Service Registry ์„œ๋ฒ„์ธ Eureka Server ์— ๋“ฑ๋ก๋  ์„œ๋น„์Šค๋“ค์ด ๊ธฐ๋™
    • ์—ฌ๊ธฐ์„œ ๋“ฑ๋ก๋œ ์„œ๋น„์Šค๋Š” Eureka Client๋ผ๊ณ  ๋ถ€๋ฆ„
  3. Eureka ์„œ๋ฒ„๋Š” ์ž์‹ ์—๊ฒŒ ๋“ฑ๋ก๋œ Eureka Client ์—๊ฒŒ 30์ดˆ(๊ธฐ๋ณธ๊ฐ’)๋งˆ๋‹ค Ping์„ ๋ณด๋‚ด๋ฉฐ Health Checking์„ ์ˆ˜ํ–‰
  4. ๋งŒ์•ฝ 30์ดˆ๋งˆ๋‹ค ๋ณด๋‚ด๋Š” Heart Heat๊ฐ€ ์ผ์ • ํšŸ์ˆ˜ ์ด์ƒ์œผ๋กœ ๋™์ž‘๋˜์ง€ ์•Š์œผ๋ฉด Eureka Server๋Š” ํ•ด๋‹น Client๋ฅผ ์‚ญ์ œ

Eureka๋Š” ๋‹จ์ง€ ์„œ๋น„์Šค์˜ ์œ„์น˜๋งŒ์„ ํ‘œํ˜„ํ•˜๋Š” ์—ญํ• ๋กœ ๋ณดํ†ต Spring Cloud Gateway๋‚˜ Netflix Zuul ๊ณผ ๊ฐ™์€ Gateway ์„œ๋น„์Šค๋‚˜ Ribbon ๊ณผ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์™€ ํ•จ๊ป˜ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Eureka์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” Zuul, Ribbon

 

Eureka Server ์‚ฌ์šฉ๋ฒ•

build.gradle

ext {
	set('springCloudVersion', "2021.0.4")
}

dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
}

dependencyManagement {
	imports {
		mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
	}
}
  • Spring Boot ๋ฒ„์ „์— ๋งž๊ฒŒ Spring Cloud ๋ฒ„์ „ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • Spring initializr๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„ ์•Œ์•„์„œ ํ•ด๊ฒฐํ•ด์ค๋‹ˆ๋‹ค.

 

application.yml

server:
  port: 8761  // Eureka ์„œ๋ฒ„์˜ ํฌํŠธ ์ง€์ •, ๋ณดํ†ต 8761 ์‚ฌ์šฉ

spring:
  application:
    name: discovery-service  // application ์ด๋ฆ„ ์ง€์ •, ์„œ๋น„์Šค๋ฅผ ์‹๋ณ„ํ•  ๋•Œ ์‚ฌ์šฉ
    
eureka:
  client:
    register-with-eureka: false   // ํ•ด๋‹น ์„œ๋ฒ„๋ฅผ Client๋กœ ๋™์ž‘์‹œํ‚ฌ์ง€๋ฅผ ์ง€์ •, ๊ธฐ๋ณธ๊ฐ’์ด true์ด๋ฏ€๋กœ false ์ฒ˜๋ฆฌ
    fetch-registry: false         // ์œ„์™€ ๋™์ผ, ์ง€์ •์•ˆํ•ด์ฃผ๋ฉด ์ž๊ธฐ์ž์‹ ์„ ๋“ฑ๋กํ•˜๊ฒŒ๋œ๋‹ค.

 

@EnableEurekaServer ์ถ”๊ฐ€

@EnableEurekaServer
@SpringBootApplication
public class DiscoveryServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(DiscoveryServerApplication.class, args);
	}

}

 

Eureka Client ์‚ฌ์šฉ๋ฒ•

build.gradle

ext {
	set('springCloudVersion', "2021.0.4")
}

dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
	...
}

dependencyManagement {
	imports {
		mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
	}
}

 

application.yml

  • ๊ธฐ๋ณธ์„ค์ •
server:
  port: 8081   // ์„œ๋ฒ„ ํฌํŠธ ์„ค์ •

spring:
  application:
    name: item-service   // app ์ด๋ฆ„ ์„ค์ •

eureka:
  client:
    register-with-eureka: true   // ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์ธ์‹
    fetch-registry: true         // ์œ„์™€ ๋™์ผ
    service-url:
      defaultZone: http://localhost:8761/eureka   // Eureka ์„œ๋ฒ„๊ฐ€ ์œ„์น˜ํ•œ ๊ธฐ๋ณธ ์ฃผ์†Œ ์ž…๋ ฅ

 

  • ๋žœ๋คํฌํŠธ ์‚ฌ์šฉ ์‹œ ์„ค์ •
    • ์ธ์Šคํ„ด์Šค๊ฐ€ ๋“ฑ๋ก๋  ๋•Œ port ์„ค์ •์ด 0์œผ๋กœ ์žกํ˜€์žˆ์–ด ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ํ‚ค๋”๋ผ๋„ ํ•˜๋‚˜๋งŒ ๋ณด์—ฌ์ง€๋Š” ํ˜„์ƒ์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— Instance ID๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
server:
  port: 0

spring:
  application:
    name: user-service

eureka:
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} // ์ธ์Šคํ„ด์Šค id ์ถ”๊ฐ€

  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka

 

@EnableEurekaClient ์ถ”๊ฐ€

@EnableEurekaClient
@SpringBootApplication
public class ItemServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(ItemServiceApplication.class, args);
	}

}

 

์ ์šฉ ๋ชจ์Šต

 

์ถ”๊ฐ€์ ์ธ ํŒ

  • ์‹ค์Šต์„ ํ•˜๋‹ค๋ณด๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋„์›Œ์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๋•Œ๋งˆ๋‹ค Port ๋ฒˆํ˜ธ๋ฅผ ๋ฐ”๊ฟ”์ค˜์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋žœ๋ค ํฌํŠธ๋กœ ์ง€์ •ํ•ด์ฃผ๋ฉด ํŽธํ•˜๊ฒŒ ์‹ค์Šต์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๊ณณ์—์„œ ๋žœ๋คํฌํŠธ ์ ์šฉํ•˜๋Š” ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฐธ๊ณ ์ž๋ฃŒ

'๐Ÿงถ Spring | Spring Boot > Spring Cloud & MSA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Cloud Native Application  (0) 2022.10.26
Cloud Native Architecture  (0) 2022.10.26
On-Premise์™€ Cloud  (0) 2022.10.26
Service Discovery Pattern  (0) 2022.10.24
Monolithic vs MSA  (0) 2022.10.21
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.