Eureka and Zuul - TheOpenCloudEngine/uEngine-cloud GitHub Wiki

Eureka and Zuul ์„ค๋ช…

์ด๋ฒˆ ์‹œ๊ฐ„์€ Registry Service์™€ Proxy Service๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ๊ธฐ์ˆ ํ•˜๊ณ ์ž ํ•œ๋‹ค.

์ฐธ๊ณ 

Registry -> ๋งŽ์€ ์ˆ˜์˜ ์„œ๋น„์Šค๋“ค๊ฐ„์˜ ์•ค๋“œํฌ์ธํŠธ๋ฅผ ์ฐพ๊ณ , ์„œ๋น„์Šค์˜ ์ƒํƒœ๋ฅผ ์–ด๋”˜๊ฐ€์— ๋“ฑ๋กํ•˜๋Š” ๊ธฐ๋Šฅ.
Proxy -> ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์‹ ์„ ํ†ตํ•ด์„œ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค์— ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ.
Eureka -> netflix OSS์—์„œ ๊ฐœ๋ฐœํ•œ Registry Service libary.
Zuul -> netflix OSS์—์„œ ๊ฐœ๋ฐœํ•œ Proxy Service libary.
์œ„์˜ libary๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†์‰ฝ๊ฒŒ Registry server์™€ Proxy server๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

spring cloud ๋Š” spring boot + library ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœ์ ํŠธ๋“ค์˜ ๋ชจ์Œ
์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋Š” ์•„๋ž˜์˜ github ์—์„œ ๋‹ค์šด๋กœ๋“œ ๊ฐ€๋Šฅํ•˜๋‹ค.
https://github.com/uengine-oss/msa-tutorial-class-management-msa

Eureka

๋จผ์ € ๋‹ค์šด๋กœ๋“œ๋œ ์†Œ์Šค์ฝ”๋“œ์˜ registry-service ๋ฅผ ์‚ดํŽด๋ณด์ž.

https://github.com/uengine-oss/msa-tutorial-class-management-msa/tree/master/registry-service
ํŒŒ์ผ์˜ ๊ตฌ์กฐ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค.
RegistryServiceApplication ๊ณผ application.yml ๋‘๊ฐœ์ด๋‹ค.

RegistryServiceApplication.java

@SpringBootApplication
@EnableEurekaServer
public class RegistryServiceApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder(RegistryServiceApplication.class).web(true).run(args);
    }
}
  • @SpringBootApplication : ์ผ๋ฐ˜์ ์ธ ์Šคํ”„๋ง ๋ถ€ํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฐ™๋‹ค.
  • @EnableEurekaServer : ์ด ์„œ๋น„์Šค๊ฐ€ Registry server ๋ผ๊ณ  ์„ค์ •ํ•ด์ฃผ๋Š” Annotation ์ด๋‹ค.
    ์ด๋ ‡๊ฒŒ ์„ค์ •์„ ํ•œ ๊ฒฝ์šฐ ์ถ”ํ›„ Registry server์— ํŠน์ •ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ํ•˜๊ณ  ์‹ถ์„๋•Œ,
    source code level์—์„œ ์ปจํŠธ๋กค์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ spring-boot Application ์˜ ์ปค์Šคํ„ฐ ๋งˆ์ด์ง• ๋ ˆ๋ฒจ์€ ์ฒซ๋ฒˆ์งธ๋กœ properties ํŒŒ์ผ์ด๋‹ค.
์—ฌ๊ธฐ ์˜ˆ์ œ์—์„œ๋Š” application.yml ํŒŒ์ผ์„ ์ผ๋Š”๋ฐ, properties ์™€ yml ํŒŒ์ผ ๋ชจ๋‘ ์šฐ์„ ์œผ๋กœ ์ฝ์–ด๋“ค์ธ๋‹ค.
์ตœ๊ทผ cloud computing ์ชฝ์€ yml ํŒŒ์ผ์„ ๋งŽ์ด ์‚ฌ์šฉ์ค‘์ด๋‹ค.
yml ํŒŒ์ผ์€ ์‚ฌ๋žŒ์ด ์ฝ๊ณ  ์“ฐ๊ธฐ ์ข‹์€ ํ˜•์‹์œผ๋กœ (json์ฒ˜๋Ÿผ) key and value ๋ฐฉ์‹์œผ๋กœ depth๋ฅผ ์ฃผ์–ด์„œ property๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ํŽธํ•˜๋‹ค.

application.yml

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enableSelfPreservation: false

์œ„์˜ server, port ๋ถ€๋ถ„์„ properties ํŒŒ์ผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด
server.port=8761 ์ด๋Ÿฐ์‹์œผ๋กœ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋Š” Registry ๊ฐ€ ํ•ญ์ƒ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Registry๋ฅผ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ Registry ์ฃผ์†Œ๋Š” ๊ฐ ์„œ๋น„์Šค์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
์•„๋ž˜๋Š” ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์—์„œ Registry ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•œ ์˜ˆ์ œ์ด๋‹ค.

eureka:
  client:
    enabled: true
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true

์„ค์ •์˜ ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์žˆ์ง€๋งŒ ์ตœ์†Œํ•œ์˜ ์˜ต์…˜๋งŒ ์„ค์ • ํ•˜์˜€๊ณ , ๊ฐ ์„ค์ •๊ฐ’์„ ์„ค๋ช…ํ•˜์ž๋ฉด
eureka.client.enabled : true / false -> ์œ ๋ ˆ์นด ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋“ฑ๋ก/ํ•ด์ œ ํ•˜๊ฒ ๋‹ค.
eureka.client.defaultZone : ์œ ๋ ˆ์นด ์„œ๋ฒ„ ์ฃผ์†Œ
eureka.client.healthcheck.enabled : ์œ ๋ ˆ์นด ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๊ณ„์† ์‚ดํŽด๋ณด๊ฒ ๋‹ค.

์ฐธ๊ณ 
https://cloud.spring.io/spring-cloud-netflix/multi/multi__service_discovery_eureka_clients.html

Registry Server๋ฅผ ์„ค์ •ํ• ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ cluster ๋กœ ๊ตฌ์„ฑ์„ ํ•ด์•ผํ•œ๋‹ค.

๊ทธ ์ด์œ ๋Š” Registry Server๊ฐ€ ์ฃฝ์œผ๋ฉด ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๊ฐ€ ์—ฐ๊ฒฐ์ด ์•„์˜ˆ ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
eureka ๋กœ cluster ๋ฅผ ํ•˜๊ธฐ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ eureka server๋ฅผ ์—ฌ๋Ÿฌ๋Œ€ ๋„์šด ํ›„,
๊ฐ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์˜ eureka ์„ค์ •์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฃผ์†Œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋‚˜์—ดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/

Zuul

๋‹ค์šด๋กœ๋“œ๋œ ์†Œ์Šค์ฝ”๋“œ์˜ proxy-service ๋ฅผ ์‚ดํŽด๋ณด์ž.

https://github.com/uengine-oss/msa-tutorial-class-management-msa/tree/master/proxy-service
eureka์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒŒ์ผ์˜ ๊ตฌ์กฐ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค.
GatewayApplication ๊ณผ application.yml ๋‘๊ฐœ์ด๋‹ค.

GatewayApplication.java

@EnableZuulProxy
@EnableDiscoveryClient
@EnableEurekaClient
@SpringBootApplication
public class GatewayApplication {
  public static void main(String[] args) {
    SpringApplication.run(GatewayApplication.class, args);
  }
}
  • @SpringBootApplication : ์ผ๋ฐ˜์ ์ธ ์Šคํ”„๋ง ๋ถ€ํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฐ™๋‹ค.
  • @EnableZuulProxy : ์ด ์„œ๋น„์Šค๋Š” Proxy server ๋ผ๊ณ  ์„ค์ •ํ•ด์ฃผ๋Š” Annotation ์ด๋‹ค.
  • @EnableEurekaClient : ์ด ์„œ๋น„์Šค๋Š” Registry client ๋ผ๊ณ  ์„ค์ •ํ•ด์ฃผ๋Š” Annotation ์ด๋‹ค.

@EnableDiscoveryClient ๋Š” @EnableEurekaClient๊ฐ€ ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
@EnableDiscoveryClient ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Eureka์— client๋กœ ๋“ฑ๋กํ•œ ๊ฒƒ์ด @EnableEurekaClient๋‹ค.

application.yml

zuul:
  ignored-headers: Access-Control-Allow-Credentials, Access-Control-Allow-Origin
  addProxyHeaders: true

  routes:
    courses:
      path: /courses/**
      serviceId: course
      stripPrefix: false

์„ค์ • ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๋ฉด zuul.routes ์„ ํ•˜๊ธฐ์œ„ํ•˜์—ฌ courses ๋ผ๊ณ  ํ•˜๋Š” path๋กœ ๋“ค์–ด์˜ฌ์ ์—
eureka์— ๋“ฑ๋ก๋˜์–ด์žˆ๋Š” course ๋ผ๋Š” ์„œ๋น„์Šค๋ฅผ ์ฐพ์•„์„œ redirect ํ•ด๋‹ฌ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.
stripPrefix ๋Š” routing ํ•˜๊ธฐ ์ „์— ๊ฒฝ๋กœ์—์„œ ์ ‘๋‘์–ด๋ฅผ ์ œ๊ฑฐํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”Œ๋ž˜๊ทธ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ zuul์€ ์ด์™€๊ฐ™์€ routes ์„ค์ •์ด ์—†์–ด๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ routing์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
url์˜ ์ฒซ๋ฒˆ์งธ path๋Š” serviceId๋กœ ์ธ์‹์„ ํ•˜๋Š”๊ฒƒ์ด zuul์˜ ๊ธฐ๋ณธ ์„ค์ •์ด๋‹ค.
zuul.routes ์„ค์ •์„ ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‘๋ฒŒ์˜ path๊ฐ€ ๋งŒ๋“ค์–ด ์ง€๋Š” ๊ฒƒ์ด๋‹ค.

http localhost:8080/course/courses  
http localhost:8080/courses 

๊ทธ๋Ÿฌ๋‚˜ zuul์€ front-end ์—์„œ ์ ‘๊ทผ์„ ํ•˜๋Š” ์„œ๋น„์Šค ์ด๊ธฐ๋•Œ๋ฌธ์—, zuul.routes๋ฅผ ์„ค์ • ์•ˆํ•˜๊ณ ,
localhost:8080/course/courses ์ด์™€ ๊ฐ™์ด ์“ด๋‹ค๋ฉด ๊ธฐ์กด์˜ monolith ์—์„œ ์‚ฌ์šฉํ•˜๋˜
path์™€ ์™„์ „์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ผ์ผ์ด ์จ์ฃผ๋Š”๊ฒŒ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

http://cloud.spring.io/spring-cloud-netflix/multi/multi__router_and_filter_zuul.html
์œ„์˜ url๋กœ ์ ‘๊ทผํ•˜๋ฉด netflix์—์„œ zuul์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋‚˜์˜จ๋‹ค.
์ธ์ฆ, Stress Testing, Canary Testing(A/B test ์ฒ˜๋Ÿผ ๊ธฐ์กด๋ฒ„์ „๊ณผ ์ƒˆ๋ฒ„์ „์˜ ํ˜ธ์ถœํ•˜๋Š” api๊ฐ€ ๋˜‘๊ฐ™์ด ๋ฐ˜์‘ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ) ๋“ฑ์ด ์žˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ