๐Ÿ“Œ Spring Cloud Eureka + OpenFeign ์‚ฌ์šฉ ์ •๋ฆฌ

ghgh2505380ยท2026๋…„ 3์›” 17์ผ

MSA(Microservice Architecture)

๋ชฉ๋ก ๋ณด๊ธฐ
4/13

๐Ÿ“– ๊ฐœ์š”

  • Eureka

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค์˜ ๋“ฑ๋ก ๋ฐ ์œ„์น˜ ์กฐํšŒ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ์„œ๋ฒ„

  • OpenFeign

๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ HTTP๋กœ ํ˜ธ์ถœํ•  ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„ ์–ธํ˜• REST Client

  • ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋Š”
ํ•˜๋‚˜์˜ ์„œ๋น„์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Œ

์ด ๊ฒฝ์šฐ

  • ์„œ๋น„์Šค ํ™•์žฅ ์‹œ IP / Port ๊ด€๋ฆฌ ์–ด๋ ค์›€
  • ์žฅ์•  ๋ฐœ์ƒ ์‹œ ํŠน์ • ์„œ๋ฒ„๋กœ ์š”์ฒญ ์ง‘์ค‘ ๊ฐ€๋Šฅ
  • ์„œ๋น„์Šค ์œ„์น˜ ๋ณ€๊ฒฝ ์‹œ ํ˜ธ์ถœ ์‹คํŒจ ๊ฐ€๋Šฅ

Eureka๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด

  • ์„œ๋น„์Šค ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์„œ๋ฒ„์— ๋“ฑ๋ก
  • ๋‹ค๋ฅธ ์„œ๋น„์Šค๋Š” ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ์œ„์น˜ ์กฐํšŒ ๊ฐ€๋Šฅ

FeignClient๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด

  • RestTemplate ์—†์ด
  • ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ ์„œ๋น„์Šค ํ˜ธ์ถœ ๊ฐ€๋Šฅ

์ฆ‰
์„œ๋น„์Šค ์œ„์น˜ ๊ด€๋ฆฌ + ์„œ๋น„์Šค ๊ฐ„ ํ˜ธ์ถœ์„ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Œ

  • ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ

  • ์„œ๋น„์Šค ์œ„์น˜ ๊ด€๋ฆฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

  • ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค ํ™•์žฅ ๋Œ€์‘

  • ์„œ๋น„์Šค ๊ฐ„ HTTP ํ˜ธ์ถœ ์ฝ”๋“œ ๋‹จ์ˆœํ™”

  • ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ง€์›

โš™๏ธ ํ•ต์‹ฌ ๊ฐœ๋…

1๏ธโƒฃ Eureka Server

์„œ๋น„์Šค ๋“ฑ๋ก ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ค‘์•™ ์„œ๋ฒ„ ์—ญํ•  ์ˆ˜ํ–‰

์˜ˆ์‹œ ๊ตฌ์„ฑ

  • Eureka Server 1๊ฐœ
  • Order Service ์ธ์Šคํ„ด์Šค 1๊ฐœ
  • Product Service ์ธ์Šคํ„ด์Šค 3๊ฐœ

Product Service๋ฅผ 3๊ฐœ ์‹คํ–‰ํ•˜๋ฉด
Eureka์—๋Š” ๋™์ผ ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ 3๊ฐœ์˜ ์ธ์Šคํ„ด์Šค ๋“ฑ๋ก ์ฒ˜๋ฆฌ


2๏ธโƒฃ Eureka Client

๊ฐ ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰๋  ๋•Œ
Eureka Server์— ์ž์‹ ์˜ ์œ„์น˜ ๋“ฑ๋ก

์˜ˆ์‹œ

  • order-service
  • product-service

๊ฐ ์„œ๋น„์Šค๋Š” ์‹คํ–‰ ์‹œ Eureka์— ๋“ฑ๋ก๋˜๊ณ 
๋‹ค๋ฅธ ์„œ๋น„์Šค๋Š” Eureka๋ฅผ ํ†ตํ•ด ์œ„์น˜ ์กฐํšŒ ๊ฐ€๋Šฅ


3๏ธโƒฃ OpenFeign

๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ
์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ๋งŒ์œผ๋กœ REST ํ˜ธ์ถœ ์ฒ˜๋ฆฌ

์ง์ ‘ URL์„ ์กฐํ•ฉํ•˜์ง€ ์•Š๊ณ 
์„œ๋น„์Šค ์ด๋ฆ„ ๊ธฐ๋ฐ˜ ํ˜ธ์ถœ ์ฒ˜๋ฆฌ

FeignClient๋Š” Eureka์™€ ์—ฐ๋™ํ•˜์—ฌ
๋“ฑ๋ก๋œ ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๊ณ  ํ˜ธ์ถœ ์ˆ˜ํ–‰


4๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ

FeignClient๋Š” ์„œ๋น„์Šค ํ˜ธ์ถœ ์‹œ
์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ์š”์ฒญ ์ „๋‹ฌ

์ฆ‰

Order Service โ†’ Eureka ์กฐํšŒ โ†’ Product Service ์ธ์Šคํ„ด์Šค ์„ ํƒ โ†’ ํ˜ธ์ถœ

์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ
๊ธฐ๋ณธ์ ์œผ๋กœ Round Robin ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ ๋ถ„๋ฐฐ

Round Robin

  • ์š”์ฒญ์„ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ ์„œ๋ฒ„์— ๋ถ„๋ฐฐํ•˜๋Š” ๋ฐฉ์‹
  • ํŠน์ • ์„œ๋ฒ„์— ํŠธ๋ž˜ํ”ฝ์ด ์ง‘์ค‘๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€

5๏ธโƒฃ ์„œ๋น„์Šค ์‹คํ–‰ ์ˆœ์„œ

Product Service๊ฐ€ Order Service๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•ˆ์ •์ 

์ด์œ 

  • Order Service์—์„œ Product Service ํ˜ธ์ถœ ์‹œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ๋Œ€์ƒ ์„œ๋น„์Šค๊ฐ€ ์•„์ง ๋“ฑ๋ก๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Œ
  • Eureka ๋“ฑ๋ก ์ „ ํ˜ธ์ถœ ์‹œ ์—ฐ๊ฒฐ ์‹คํŒจ ๊ฐ€๋Šฅ

๋”ฐ๋ผ์„œ

Product Service ์‹คํ–‰ โ†’ Order Service ์‹คํ–‰ ์ˆœ์„œ ๊ถŒ์žฅ

๐Ÿ” ๋™์ž‘ ์›๋ฆฌ

์ „์ฒด ํ๋ฆ„

Client โ†’ Order Service โ†’ FeignClient โ†’ Eureka ์กฐํšŒ โ†’ Product Service

์„ธ๋ถ€ ํ๋ฆ„

  1. Product Service ์‹คํ–‰
  2. Product Service๊ฐ€ Eureka Server์— ๋“ฑ๋ก
  3. Product Service ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์‹คํ–‰ํ•˜๋ฉด ๊ฐ๊ฐ ๋“ฑ๋ก
  4. Order Service ์‹คํ–‰
  5. Order Service๋„ Eureka Server์— ๋“ฑ๋ก
  6. Order Service ๋‚ด๋ถ€์—์„œ FeignClient๋กœ product-service ํ˜ธ์ถœ
  7. Eureka๊ฐ€ ๋“ฑ๋ก๋œ Product ์ธ์Šคํ„ด์Šค ๋ชฉ๋ก ๋ฐ˜ํ™˜
  8. LoadBalancer๊ฐ€ ํ˜ธ์ถœ ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค ์„ ํƒ
  9. Product Service ์‘๋‹ต ๋ฐ˜ํ™˜
  10. Order Service๊ฐ€ ์ตœ์ข… ์‘๋‹ต ๋ฐ˜ํ™˜

์•„ํ‚คํ…์ฒ˜ ํ๋ฆ„

Client
โ†’ Order Service
โ†’ Eureka Server
โ†’ Product Service

Product Service ์ธ์Šคํ„ด์Šค

  • Product Service #1
  • Product Service #2
  • Product Service #3

๐Ÿš€ ์‹ค์Šต ๊ตฌ์„ฑ

์„œ๋น„์Šค ๊ตฌ์„ฑ

  • Eureka Server : 1๊ฐœ
  • Order Service : 1๊ฐœ
  • Product Service : 3๊ฐœ

Product Service๋Š” ๋™์ผํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„
๋‹ค๋ฅธ ํฌํŠธ๋กœ ์‹คํ–‰ํ•˜์—ฌ 3๊ฐœ์˜ ์ธ์Šคํ„ด์Šค ๊ตฌ์„ฑ

์˜ˆ์‹œ ํฌํŠธ

  • 19092
  • 19093
  • 19094

Order Service ํ˜ธ์ถœ

http://localhost:19091/order/1

์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด
์‘๋‹ต ํฌํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ๊ฐ€๋Šฅ

์ด๋ฅผ ํ†ตํ•ด Round Robin ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๋™์ž‘ ํ™•์ธ

๐Ÿ’ป ์ฝ”๋“œ ์˜ˆ์‹œ

1๏ธโƒฃ Eureka Server

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

2๏ธโƒฃ Product Service

@SpringBootApplication
@EnableDiscoveryClient
public class ProductApplication {

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

3๏ธโƒฃ Order Service

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {

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

4๏ธโƒฃ Product Controller

@RestController
@RequestMapping("/products")
public class ProductController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/{id}")
    public String getProduct(@PathVariable Long id) {
        return "Product " + id + " info!!!! From port : " + serverPort;
    }
}

๊ฐ Product ์ธ์Šคํ„ด์Šค๋Š”
์ž์‹ ์ด ์‹คํ–‰๋œ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜

์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ธ์Šคํ„ด์Šค๊ฐ€ ์‘๋‹ตํ–ˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ


5๏ธโƒฃ FeignClient ์ธํ„ฐํŽ˜์ด์Šค

@FeignClient(name = "product-service")
public interface ProductFeignClient {

    @GetMapping("/products/{id}")
    String getProduct(@PathVariable("id") Long id);
}

6๏ธโƒฃ Order Controller

@RestController
@RequestMapping("/orders")
@RequiredArgsConstructor
public class OrderController {

    private final ProductFeignClient productFeignClient;

    @GetMapping("/{id}")
    public String getOrder(@PathVariable Long id) {
        return productFeignClient.getProduct(id);
    }
}

โš™๏ธ yml ์„ค์ •

1๏ธโƒฃ Eureka Server

server:
  port: 8761

spring:
  application:
    name: eureka-server

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false

2๏ธโƒฃ Product Service

spring:
  application:
    name: product-service

server:
  port: 19092

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

Product Service๋Š”
๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ํฌํŠธ๋กœ ์‹คํ–‰ํ•˜์—ฌ
์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

์˜ˆ์‹œ

  • 19092
  • 19093
  • 19094

3๏ธโƒฃ Order Service

spring:
  application:
    name: order-service

server:
  port: 19091

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

โš™๏ธ application.yml ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

1๏ธโƒฃ ๊ณ„์ธต ๊ตฌ์กฐ ํ‘œํ˜„

yml์€ ๋“ค์—ฌ์“ฐ๊ธฐ ๊ธฐ๋ฐ˜์œผ๋กœ
์„ค์ •์˜ ๊ณ„์ธต ๊ตฌ์กฐ ํ‘œํ˜„ ๊ฐ€๋Šฅ

์˜ˆ์‹œ

spring:
  application:
    name: product-service

properties๋ผ๋ฉด

spring.application.name=product-service

2๏ธโƒฃ ์„ค์ • ๊ฐ€๋…์„ฑ

์„ค์ •์ด ๋งŽ์•„์งˆ์ˆ˜๋ก
yml์ด ๊ตฌ์กฐ ํŒŒ์•…์ด ์‰ฌ์›€

ํŠนํžˆ ๋‹ค์Œ ์„ค์ •์ด ๋งŽ์„ ๋•Œ ์œ ๋ฆฌ

  • Eureka
  • Security
  • DB
  • Cloud
  • Management

3๏ธโƒฃ properties๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Spring Boot๋Š”

  • application.yml
  • application.properties

๋‘˜ ๋‹ค ์ง€์›

์ฆ‰ properties๋ฅผ ๋ชป ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
์„ค์ • ๊ด€๋ฆฌ ํŽธ์˜์„ฑ ๋•Œ๋ฌธ์— yml์„ ๋” ๋งŽ์ด ์‚ฌ์šฉ


4๏ธโƒฃ yml ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

yml์€ ๊ณต๋ฐฑ ๊ธฐ๋ฐ˜ ๋ฌธ๋ฒ•

๋ณดํ†ต 2์นธ ๋“ค์—ฌ์“ฐ๊ธฐ ์‚ฌ์šฉ

์˜ˆ์‹œ

spring:
  application:
    name: order-service

ํƒญ ๋Œ€์‹  ๊ณต๋ฐฑ ์‚ฌ์šฉ ๊ถŒ์žฅ

๐Ÿง  TIL (Today I Learned)

  • Eureka๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋น„์Šค ์ฃผ์†Œ(IP / Port)๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋จ
  • FeignClient๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ ์„œ๋น„์Šค ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ๋™์ผ ์„œ๋น„์Šค ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค ์‹คํ–‰ ์‹œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • ์‘๋‹ต ํฌํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์–ด๋–ค ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฒ˜๋ฆฌํ–ˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ
  • Round Robin ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์ด ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค์— ๋ถ„์‚ฐ๋จ
  • application.yml์€ ์„ค์ • ๊ตฌ์กฐ ํ‘œํ˜„์— ์œ ๋ฆฌ
profile

0๊ฐœ์˜ ๋Œ“๊ธ€