๋ฐ˜์‘ํ˜•
์„œ๋ฒ„๊ฐ„ ํ†ต์‹  ์ค‘ ์ง€์—ฐ ๋ฐœ์ƒ์‹œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

    โ€ฃ ๋„คํŠธ์›Œํฌ ํƒ€์ž„์•„์›ƒ ์„ค์ •
    โ€ฃ ๋Œ€๊ธฐ์ค‘ ์š”์ฒญ์ˆ˜ ์ œํ•œ
    โ€ฃ ์—ฌ๋Ÿฌ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๊ธฐ๋ฒ• ๊ตฌํ˜„
    โ€ฃ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด๊ณผ ํด๋ฐฑ ๊ตฌํ˜„ ์„ค์ •

 

๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฃฐ(rule)

์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ๋„ทํ”Œ๋ฆญ์Šค์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๋ถ€ํ•˜๋ถ„์‚ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ๊ณตํ•ด์ฃผ๋Š”๋ฐ,
๋„ทํ”Œ๋ฆญ์ŠคOSS ์—์„œ๋Š” ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฃฐ์ด๋ผ๊ณ  ํ•จ

์ข…๋ฅ˜

    โ€ฃ RoundrobinRule
        → ๋ผ์šด๋“œ ๋กœ๋นˆ ์‚ฌ์šฉ, ์œ ์ž…๋˜๋Š” ์š”์ฒญ์€ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ์ˆœ์ฐจ์ ์œผ๋กœ ๋ถ„์‚ฐ. ๊ธฐ๋ณธ!

    โ€ฃ AvailabilityFilteringRule
        → ์„ธ๋ฒˆ ์—ฐ๊ฒฐ ์‹คํŒจํ•˜๋ฉด ์„œํ‚ท ์ฐจ๋‹จ๋จ.
        → ์„œํ‚ท ์ฐจ๋‹จ ๋ฐ ๋™์‹œ์—ฐ๊ฒฐ์ด ๋งŽ์€๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ ์„œ๋ฒ„ ์ œ์™ธ.
        → RoundrobinRule ์„ ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ.


    โ€ฃ WeightedReponseTimeRule
        → ์ธ์Šคํ„ด์Šค๋กœ ์ „๋‹ฌ๋˜๋Š” ํŠธ๋ž˜ํ”ฝ์˜ ๊ทœ๋ชจ๋Š” ์ธ์Šคํ„ด์Šค์˜ ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„์— ๋ฐ˜๋น„๋ก€.
        → ์‘๋‹ต์‹œ๊ฐ„ ๊ธธ์ˆ˜๋ก ๋” ์ž‘์€ ๊ฐ€์ค‘์น˜ ๊ฐ€์ง.
        → ๋ถ€ํ•˜๋ถ„์‚ฐํด๋ผ์ด์–ธํŠธ๋Š” ๋ชจ๋“  ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค์˜ ํŠธ๋ž˜ํ”ฝ๊ณผ ์‘๋‹ต์‹œ๊ฐ„ ๊ธฐ๋กํ•จ.


    โ€ฃ BestAvailableRule
        → ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค๊ฐ€ ์ฐจ๋‹จ๋œ ์„œ๋ฒ„๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋™์‹œ ์š”์ฒญ์„ ๊ฐ€์žฅ ์ ๊ฒŒ ๋ฐ›์€ ์„œ๋ฒ„๋ฅผ ์„ ํƒ.

 

 

ํ˜ธ๋ฒ„ํ”Œ๋ผ์ด (Hoverfly)
์„ค๋ช…

HTTP ์„œ๋น„์Šค๋ฅผ ์Šคํ…ํ•˜๊ณ  ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฐ€๋ฒผ์šด ์‹œ๊ฐํ™” ๋„๊ตฌ.
DSL ์ •์˜์—์„œ ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•ด ๋ชจ๋“  ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ค‘์ธ ์„œ๋น„์Šค์˜ ๋ฉ”์„œ๋“œ์— ์ง€์—ฐ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ.
    → maven or gradle ์— hoverfly-java import ํ•„์š”, JUnit์— @ClassRule ์ •์˜ ํ•„์š”. 

 

์‹ค์Šต

โ€ฃโ€ฃโ€ฃ ์‹ค์Šต ์ฝ”๋“œ ๋งํฌ ๐Ÿ™‚

junit test class ์ผ๋ถ€

• junit test ์‹คํ–‰์‹œ hoverflyRule ์„ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ  ๊ฐ ํ…Œ์ŠคํŠธ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. (ex. test() ์‹คํ–‰)
• test() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์— ์žˆ๋‹ค. ↓ ↓ ↓ ↓ ↓

junit test ํ˜ธ์ถœ ์ถœ๋ ฅ ๊ฒฐ๊ณผ, ๋ถ€ํ•˜๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
application.yml ์„ค์ •์ •๋ณด. (ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์˜ ์„ค์ •ํŒŒ์ผ์— ์ •์˜)

โ€ป https://www.baeldung.com/hoverfly ์—๋„ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค. (์‚ฌ์‹ค ํ•ด๋‹น๊ธฐ๋Šฅ์„ ๋งŽ์ด ์“ฐ๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค;)

 

 

๋ฆฌ๋ณธ(Ribbon)
์„ค๋ช…

- Client LoadBalancer ์ด๋‹ค.
- ๊ฐœ๋ฐœ์ž๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค. (L4 ์‚ฌ์šฉ์—†์ด)
- ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ•œ๋‹ค! 
- ์œ ๋ ˆ์นด๋ž‘ ์‚ฌ์šฉ์‹œ ๊ฐ•๋ ฅํฌํ•˜๋‹ค ๐Ÿ‘
- ๋”์ด์ƒ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•˜์ง€ ์•Š์Œ.

ribbon



โ€ป ๋ณดํ†ต์€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ L4 switch ์„ ์ด์šฉํ•˜์—ฌ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ฒ˜๋ฆฌ๋ฅผ ํ• ๊ฒƒ์ด๋‹ค.
์ด๋ฅผ ์ด์šฉ์‹œ ์ถ”๊ฐ€ ์„œ๋ฒ„๋น„์šฉ ๋“ฑ์ด ๋ฐœ์ƒํ• ๊ฒƒ์ด๋‹ค.
์ด์—๋”ฐ๋ฅธ ์ ˆ์ฐจ๋„ ํ•„์š”ํ• ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. 

L4 switch

 

์‹ค์Šต 

โ€ฃโ€ฃโ€ฃ ์‹ค์Šต ์ฝ”๋“œ ๋งํฌ ๐Ÿ™‚

๐Ÿ”† ์„œ๋ฒ„๊ฐ„ ํ†ต์‹ ํ•˜์—ฌ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ฒ˜๋ฆฌ ํ™•์ธ: Ribbon ์ ์šฉ ์„œ๋ฒ„์—์„œ Demo1 ์„œ๋ฒ„ ํ˜ธ์ถœ (ํฌํŠธ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ์ •์˜ํ•˜์—ฌ ์„œ๋ฒ„๋„์šฐ๊ธฐ)

• Ribbon ์ ์šฉ ์„œ๋ฒ„

# .. gradle ํŒŒ์ผ ๋‚ด ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•จ 

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-ribbon:2.1.4.RELEASE'

~Application.java

 

application.yml

 

controller

→ ๋นจ๊ฐ„๋ฐ•์Šค๋ฅผ ๋ณด๋ฉด, demo1 ์œผ๋กœ ๋„๋ฉ”์ธ์„ ์ •์˜ํ•ด๋†“์•˜๋‹ค.
์ด๋Š” application.yml ์˜ demo1: ribbon: listOfServers ์ •๋ณด๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•œ ๊ฒƒ์ด๋‹ค. (๋‚ด๋ถ€์ ์œผ๋กœ ์ธํ„ฐ์…‰ํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค๊ณ ํ•จ)


• Ribbon ์ ์šฉ ์„œ๋ฒ„์—์„œ ํ˜ธ์ถœํ•  ์„œ๋ฒ„ ์‹คํ–‰๊ตฌ์„ฑ 

์ธํ…”๋ฆฌ์ œ์ด์˜ ์‹คํ–‰/๋””๋ฒ„๊ทธ ๊ตฌ์„ฑ์—์„œ Spring Boot ์‹คํ–‰์ •๋ณด๋ฅผ ์…‹ํŒ…ํ•œ๋‹ค. (VM ์˜ต์…˜: -Dserver.port=์ •์˜ํฌํŠธ) ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰! x N


...๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ! (API ํ˜ธ์ถœ)

๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ฒ˜๋ฆฌ๊ฐ€ ๋จ! ์™”๋‹ค๊ฐ”๋‹ค,, ์„œ๋ฒ„๋ณ„ API ํ˜ธ์ถœ ๊ฒฐ๊ณผ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ํžˆ์ŠคํŠธ๋ฆญ์Šค (Hystrix)
์„ค๋ช…

- ๋ถ„์‚ฐ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์„œ๋น„์Šค ๊ฐ„์˜ ์•ก์„ธ์Šค ์ง€์ ์„ ๊ฒฉ๋ฆฌํ•˜๊ณ , ์„œ๋น„์Šค ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ณ„๋‹จ์‹ ์˜ค๋ฅ˜๋ฅผ ์ค‘์ง€ํ•˜๊ณ , ํด๋ฐฑ ์˜ต์…˜์„ ์ œ๊ณตํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰
- RxJava ์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง
- Failure as a First class citizen
   → ๋ถ„์‚ฐ์‹œ์Šคํ…œ์—์„œ๋Š” ์‹คํŒจ๋ฅผ 1๊ธ‰ ์‹œ๋ฏผ์œผ๋กœ ๊ฐ„์ฃผ.
- ๋”์ด์ƒ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•˜์ง€ ์•Š์Œ. 

 

์‹ค์Šต

โ€ฃโ€ฃโ€ฃ ์‹ค์Šต ์ฝ”๋“œ ๋งํฌ ๐Ÿ™‚

๐Ÿ’ฅ ์„œ๋ฒ„(PirServer → Demo1Server ํ˜ธ์ถœ)๊ฐ„ ํ†ต์‹  ์ค‘, ์—๋Ÿฌ๋ฐœ์ƒ ์œ ๋„

1๏ธโƒฃ Hystrix ๋ฏธ์ ์šฉ: ์—๋Ÿฌ ๋…ธ์ถœ ํ™•์ธ

fallback ์ ์šฉ์ด ์•ˆ๋œ ๋ชจ์Šต



2๏ธโƒฃ Hystrix ์ ์šฉ: @HystrixCommand ๋ฐ fallback ์ ์šฉ

RestTemplate ์œผ๋กœ ํ˜ธ์ถœ ๋ฐ fallback ์ ์šฉ๋œ ๋ชจ์Šต

@HystrixCommand
- ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์‹œ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์„ฑ๊ณต/์‹คํŒจ ๊ฒฐ๊ณผ๋ฅผ ํ†ต๊ณ„๋ƒ„
- ํ†ต๊ณ„์— ๋”ฐ๋ผ ์„œํ‚ท ์˜คํ”ˆ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ์กฐ์น˜ํ•จ.

โ€ป ์„œํ‚ท ์˜คํ”ˆ
์ฃผ์–ด์ง„ ์‹œ๊ฐ„๋™์•ˆ ํ˜ธ์ถœ์ œํ•œ / ์—๋Ÿฌ๋ฐ˜ํ™˜ ํ•จ
์กฐ๊ธฐ์ฐจ๋‹จํ•˜์—ฌ ๋ณธ์ธ์„ ๋ณดํ˜ธํ•จ

- ์ •์˜ํ•ด๋†“์€ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋Š” ์ •ํ•ด์ง„ ์‘๋‹ต์‹œ๊ฐ„ ๋‚ด์— ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•จ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Exception ๋ฐœ์ƒ & fallback ์ •์˜ ์ˆ˜ํ–‰

 

โญ๏ธ Hystrix ๋ณด๋‹จ Resilience4j ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹์Œ.
- Resilience4j ๊ฐ€ Java8 ์ง€์› ๋ฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•ด์ค€๋‹ค๊ณ  ํ•จ.

 

 

 


์ฐธ๊ณ 

์ฑ…: ๋งˆ์Šคํ„ฐ๋ง ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ
๋งํฌ: https://www.youtube.com/watch?v=K4laj5cDYLg&list=PL9mhQYIlKEhdtYdxxZ6hZeb0va2Gm17A5&index=5 

๋ฐ˜์‘ํ˜•

+ Recent posts