Skip to content

yougahee/api-gateway

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

40 Commits
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿพ API GATEWAY


๐Ÿ“Œ API Gateway๋ž€?

Microservice Architecture์—์„œ ์‚ฌ์šฉํ•˜๋ฉฐ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์˜ End Point๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ์„œ๋ฒ„์ด๋‹ค.

API Gateway์—์„œ๋Š” Authentication, Monitoring, load balancing, security ๋“ฑ์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์˜ ์ž…์žฅ์—์„œ๋Š” ํฌํŠธ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ผ์€ ์ฐธ์œผ๋กœ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ์ด๋ฅผ ํ•˜๋‚˜๋กœ ์—ฎ์–ด์„œ API Gateway์—์„œ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. ( ์„œ๋น„์Šค์˜ ์—”๋“œํฌ์ธํŠธ ๋Œ€์‹  API Gateway๋กœ ์š”์ฒญํ•œ๋‹ค. )



๐Ÿ“Œ API Gateway ์˜คํ”ˆ์†Œ์Šค ์ข…๋ฅ˜

  1. Netflix์˜ Zuul
  2. AWS์˜ API gateway
  3. Kong
  4. API Umbrella
  5. tyk.io



๐Ÿ“Œ ์„ ํƒํ•œ ์˜คํ”ˆ์†Œ์Šค

  • Netfilx์˜ zuul


๐Ÿ“Œ ์„ ํƒํ•œ ์ด์œ 

  1. JAVA ์–ธ์–ด๋กœ ๋˜์–ด์žˆ๋‹ค.
  2. API Gateway์—์„œ ๊ถŒํ•œ ์—ฌ๋ถ€์™€ ์„œ๋น„์Šค ์„œ๋ฒ„๋กœ์˜ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ๋งŒ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ œ์™€ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งŽ์€ ๊ฒƒ์„ ์„ ํƒํ–ˆ๋‹ค.
  3. Netflix์‚ฌ์˜ ๊น”๋”ํ•œ Blog ์ •๋ฆฌ ๋ฐ GitHub ๊พธ์ค€ํ•œ Update
  4. ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋Š”์ง€ ์ฐพ์•„๋ดค์„ ๋•Œ ์ดํ•ดํ•˜๊ธฐ๋„ ์‰ฌ์› ๊ณ  PreFilter๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค.


๐Ÿ“Œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

  1. Zuul Filter์˜ Pre Filter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ header์— token์ด ์กด์žฌํ•˜๋ฉด ๋งŒ๋ฃŒ, ๋ณ€์กฐ ์—ฌ๋ถ€ ํŒŒ์•…ํ•œ๋‹ค.

  2. token์— ๋‹ด๊ฒจ์žˆ๋Š” user์˜ email, nickname, userIdx๋ฅผ decodeํ•œ ํ›„, header์— ํฌํ•จํ•˜์—ฌ ๋ณด๋‚ธ๋‹ค.

    • ์ด์œ 
      ๊ฑฐ์˜ ๋ชจ๋“  ์„œ๋น„์Šค ์„œ๋ฒ„์—์„œ ์œ ์ €์˜ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด token์ด ํ•„์š”ํ•˜๋‹ค. ๊ฐ ์„œ๋น„์Šค ์„œ๋ฒ„๋งˆ๋‹ค token์˜ ๊ฐ’์„ decodeํ•œ ํ›„ ์œ ์ €์˜ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. API Gateway์—์„œ token์„ decodeํ•ด์„œ header์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • header์— ๋‹ด์•„์„œ ๊ฐ€๋ฉด ์œ ์ €์˜ ๊ฐœ์ธ์ •๋ณด์— ๋Œ€ํ•œ ๋ณด์•ˆ ์ด์Šˆ๋Š” ์—†๋‚˜?
      • ๋ชจ๋“  ์„œ๋น„์Šค๋Š” API Gateway๋ฅผ ๊ฑฐ์ณ์„œ ๋“ค์–ด์™€์•ผํ•˜๊ณ , ๊ทธ ๋’ค์— ์žˆ๋Š” ์„œ๋ฒ„๋“ค์€ ํ•˜๋‚˜์˜ ํด๋ผ์šฐ๋“œ ์ƒ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€๋ง ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์ด์Šˆ๋Š” ์—†์„ ๊ฒƒ์ด๋ผ ํŒ๋‹จ๋œ๋‹ค.
      • token์— ๋ณด์•ˆ ์ด์Šˆ๊ฐ€ ์ผ์–ด๋‚ ๋งŒํ•œ ์ •๋ณด๋ฅผ ๋„ฃ๋Š” ๊ฒƒ ์ž์ฒด๋„ ๋ง์ด ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ( ์–ธ์ œ๋“  ํƒˆ์ทจ๋‹นํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— )
  3. Zuul์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ๋ฐ์ดํ„ฐ ํ†ต๊ณ„ ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์€ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜๋‹ค.




๐Ÿ“Œ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๊ฒช์€ ์ผ

  1. token์— ๋‹ด๊ฒจ์žˆ๋Š” ์ •๋ณด๋“ค์„ ํ—ค๋”์— ์ถ”๊ฐ€ํ•˜๋ฉด์„œ "x-forward-userIdx"๋ผ๊ณ  ๋ช…๋ช…ํ•ด๋†“์€ ์•„์ด์— null๊ฐ’์ด ๋“ค์–ด๊ฐ”๋‹ค.
    • Request header ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณด์•˜๋Š”๋ฐ "x-forward-useridx"๋ผ๊ณ  ์ ํ˜€์žˆ๋‹ค.
    • ์–ด๋ผ? ๋‚œ ๋ถ„๋ช… userIdx๋ผ๊ณ  ์ ์—ˆ๋Š”๋ฐ ์™œ useridx๋ผ๊ณ  ์ ํ˜€์žˆ์ง€?ํ•ด์„œ ์ฐพ์•„๋ณด์•˜๋”๋‹ˆ HTTP ํ—ค๋”๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค.
      ๊ทธ๋ž˜์„œ userIdx -> useridx๋ผ๊ณ  ์ ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์•˜๋‹ค. ํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ null๊ฐ’!!
    • ์‚ฌ์‹ค ๋ฌธ์ œ๋Š” header์— ์žˆ์ง€ ์•Š์•˜๋‹ค.
      • token์— useridx๊ฐ’์„ long์œผ๋กœ ์ง‘์–ด๋„ฃ์—ˆ๋Š”๋ฐ decodeํ•  ๋•Œ๋Š” string์œผ๋กœ ๋นผ๋‚ด๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ! long์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋‹ˆ ๋ฐ”๋กœ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.
    • ++ userIdx, useridx ๋ผ๊ณ  ์ ์–ด๋„ ๊ฐ’์€ ์ •์ƒ์ ์œผ๋กœ ์ž˜ ๋“ค์–ด๊ฐ€๊ณ  ๋นผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

  1. API Gateway์—์„œ ZuulException ์ด ๋–ด๋‹ค.
    • ์ƒํ™ฉ : Auth์˜ ํšŒ์›๊ฐ€์ž… ์‹œ, ์ด๋ฉ”์ผ ์ธ์ฆ์ฝ”๋“œ ํ™•์ธ๊นŒ์ง€ ์™„๋ฃŒํ•œ ํ›„, ๋˜ ์š”์ฒญ์„ ํ–ˆ์„ ๊ฒฝ์šฐ "์ด๋ฏธ ์ธ์ฆํ–ˆ๋˜ ์ด๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค" ์ด๋Ÿฐ ์‹์— ๋ฉ”์„ธ์ง€๊ฐ€ ๊ฐ€๋„๋ก ์ฒ˜๋ฆฌํ•ด๋†“์•˜๋‹ค.
      ์ด ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ธ ๊ฒƒ์€ ์˜ค๋ฅ˜? ๋А๋‚Œ์€ ์•„๋‹ˆ์—ˆ๊ณ  ๊ตณ์ด ๊ท€์ฐฎ์€ ์ผ์„ 2๋ฒˆ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๋ฉ”์„ธ์ง€๋กœ ๋ณด๋‚ด๊ธฐ ์œ„ํ•จ์ด์—ˆ๋‹ค.
      ๊ทธ๋ž˜์„œ StatusCode๋ฅผ 100๋ฒˆ HTTP.Continue๋กœ ์คฌ๋‹ค. Auth์—์„œ๋Š” ์ž˜ ๋„˜์–ด๊ฐ€๋Š”๋ฐ, API Gateway์—์„œ Error Filter๋กœ ๋„˜์–ด๊ฐ€์„œ ์—๋Ÿฌ๋ฅผ ๋‚ด๋ฑ‰์—ˆ๋‹ค.
    • ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ??

  1. HTTP header์— ๋‹‰๋„ค์ž„์„ ๋„ฃ๊ณ  ์‹ถ๋‹ค!
    • HTTP header ํ‘œ์ค€์—๋Š” ISO-8859-1 character๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ charset์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • (HTTP) messages cannot carry characters outside the ISO-8859-1 character set.
    • HTTP header์— ISO-8859-1 character๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ฌธ์ž๋ฅผ ๋„ฃ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผํ•œ๋‹ค.



๐Ÿ“Œ Zuul Core Architecture




๐Ÿ“Œ Netflix - zuul

  1. Pre Filter

    • ์‹ค์ œ ์„œ๋น„์Šค ์„œ๋ฒ„๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— token์˜ ๋งŒ๋ฃŒ, ๋ณ€์กฐ ์—ฌ๋ถ€ ๋“ฑ์„ ํ™•์ธํ•˜๋Š” Filter
  2. Routing Filter

    • Http๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ํ•ด๋‹น ์„œ๋น„์Šค ์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ด์ค€๋‹ค.
  3. POST Filter

    • ์„œ๋น„์Šค ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ๋ฐ›์•„์˜จ ํ›„ Response์— ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๋Š” ๊ณณ
  4. Error Filter

    • ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” Filter




๐Ÿ“Œ sonarqube

๐Ÿ“Œ dependencies

dependencies {
	implementation 'org.springframework boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-devtools'

	//zuul
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-zuul'

	//lombok
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'

	//jwt
	implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.7.0'
	implementation 'com.auth0:java-jwt:3.4.0'

	//gson
	compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
}


๐Ÿ“Œ ์ฐธ๊ณ ๋ฌธ์„œ/์ถœ์ฒ˜

  1. https://netflixtechblog.com/announcing-zuul-edge-service-in-the-cloud-ab3af5be08ee
  2. https://github.com/Netflix/zuul

About

API-Gateway(with. zuul)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages