[Spring Cloud] - 5. Zuul Gateway๋ฅผ ์ด์šฉํ•œ Filtering

๋ฐ˜์‘ํ˜•

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Routing์— ์ด์–ด์„œ Zuul Gateway๋ฅผ ์ด์šฉํ•œ Filtering์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Filtering

Spring Boot์—์„œ ํ•„ํ„ฐ๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” PreFilter์™€ ๊ฐ™์€ ์—”๋“œํฌ์ธํŠธ์˜ ๋ณด์•ˆ ๋“ฑ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•„ํ„ฐ๋ง์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Spring Security์—์„œ ์ œ๊ณตํ•˜๋Š” JWT ๋“ฑ์˜ ๋ณด์•ˆ ์ˆ˜๋‹จ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„ ๋ฐ›๊ณ , ์—”๋“œํฌ์ธํŠธ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด์ฃ .

Zuul Gateway์—์„œ๋„ ์—”๋“œํฌ์ธํŠธ์˜ ๋ณด์•ˆ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 

์œ„ ์•„ํ‚คํ…์ฒ˜๋Š” Zuul Gateway์˜ ์ฝ”์–ด๋ฅผ ๊ทธ๋ฆฐ ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค. Zuul Servlet์„ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ Routing ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”. ๊ทธ๋ฆฌ๊ณ , ๊ทธ ๋ฐ‘๋‹จ์—๋Š” ZuulFilter Runner๊ฐ€ ์žˆ์–ด์„œ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ Filtering์„ ์ ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Filtering์€ ํด๋ผ์ด์–ธํŠธ์˜ HTTP ์š”์ฒญ์„ ๋ฐ›๊ณ , ์‘๋‹ตํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ผ์šฐํŒ…ํ•˜๋Š” ๋™์•ˆ์˜ ์ˆ˜ํ–‰ํ•˜๋Š” ์•ก์…˜ ์ค‘์— ํ•˜๋‚˜์ด๋‹ค.

  • Pre-Filter: API ์„œ๋ฒ„๋กœ ๋ผ์šฐํŒ… ๋˜๊ธฐ ์ „์— ์ˆ˜ํ–‰ํ•˜๋Š” ํ•„ํ„ฐ -> ์ธ์ฆ, ๋กœ๊น…, ๋””๋ฒ„๊น… ๋“ฑ์˜ ์ฒ˜๋ฆฌ.
  • Route-Filter: ์š”์ฒญ์— ๋Œ€ํ•œ ๋ผ์šฐํŒ…์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ํ•„ํ„ฐ -> Ribbon์„ ์ด์šฉํ•œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ๋™์  ๋ผ์šฐํŒ…
  • Post-Filter: API ์„œ๋ฒ„๋กœ ๋ผ์šฐํŒ… ๋œ ํ›„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•„ํ„ฐ -> ์‘๋‹ต์— HTTP ํ—ค๋” ์ถ”๊ฐ€ ๋ฐ API ์‘๋‹ต์†๋„, ๋ฉ”ํŠธ๋ฆญ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
  • Error-Filter: ์œ„ 3๋‹จ๊ณ„ ํ•„ํ„ฐ์—์„œ ๋ฐœ์ƒ๋œ ์˜ค๋ฅ˜ ์ˆ˜ํ–‰ ํ•„ํ„ฐ -> Exception

API ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ•„ํ„ฐ๋ง๋“ค์ด ๋ชจ์—ฌ์ ธ ์žˆ์œผ๋ฉฐ, API ์š”์ฒญ/์‘๋‹ต์‹œ์— ๋ณด์—ฌ์ง€๋Š” ๋ผ์ดํ”„ ์‚ฌ์ดํด์ด๋ผ๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

 

How to use

์ด์ œ ๊ทธ๋Ÿผ ์ด Filtering์„ ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜์ฃ . ์—ฌํƒœ๊นŒ์ง€ ํ–ˆ๋˜ ๊ทธ๋Œ€๋กœ ์ง€๋‚œ Routing์—์„œ ํ–ˆ๋˜ Gateway ํ”„๋กœ์ ํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ์ด์šฉํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € Pre-Filter๋ฅผ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค.

/**
 * Created by Neon K.I.D on 1/22/20
 * Blog : https://blog.neonkid.xyz
 * Github : http://github.com/NEONKID
 */
class GatewayPreFilter : ZuulFilter() {
    val logger = LogManager.getLogger()

    override fun run() {
        val ctx = RequestContext.getCurrentContext()
        val req = ctx.request
        logger.info("Using Pre Filter: ${req.method} request to ${req.requestURL}")
    }

    override fun shouldFilter() = true

    override fun filterType() = FilterConstants.PRE_TYPE

    override fun filterOrder() = 0
}

Pre-Filter๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ Gateway๋กœ ๊ฑฐ์น  ๋–„ ๋จผ์ € ์ง€๋‚˜๊ฐ€๋Š” ์ž…๊ตฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. API ์„œ๋ฒ„์— ๋ผ์šฐํŒ… ๋˜๊ธฐ ์ด์ „์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ณณ์ด๋ผ๋Š” ๊ฒƒ์ด์ฃ . 

๋”ฐ๋ผ์„œ ์„œ๋ฒ„์˜ ๋กœ๊ทธ์— ๊ฐ€์žฅ ๋งจ ์•ž ๋ถ€๋ถ„์— ๋‚จ๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋กœ ์–ด๋–ค URI๋ฅผ ๋ถˆ๋ €๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด์ฃผ๋Š” ๊ฒƒ์„ ๋ถˆ๋Ÿฌ๋ดค๊ณ , ์ด ๋–„ ์‚ฌ์šฉํ•œ ๊ฒƒ์€ ๋ฐ”๋กœ RequestContext ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Route-Filter ์ž…๋‹ˆ๋‹ค.

/**
 * Created by Neon K.I.D on 1/22/20
 * Blog : https://blog.neonkid.xyz
 * Github : http://github.com/NEONKID
 */
class GatewayRouteFilter : ZuulFilter() {
    val logger = LogManager.getLogger()

    override fun run() {
        logger.info("Using Route Filter: ")
    }

    override fun shouldFilter(): Boolean {
        return RequestContext.getCurrentContext().routeHost != null
                && RequestContext.getCurrentContext().sendZuulResponse()
    }

    override fun filterType() = FilterConstants.ROUTE_TYPE

    override fun filterOrder() = 0
}

Route-Filter๋Š” ๋ผ์šฐํŒ…์„ ํ•˜๋Š” ์—ญํ• ์ด์ง€๋งŒ, shouldFilter๋ผ๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ํŠน์ • Context์ผ ๋•Œ, ํ•„ํ„ฐ๋ง์„ ์ œ๊ณตํ•˜๋„๋ก ํ•œ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. 

๋งŒ์•ฝ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ์„œ๋น„์Šค ์™ธ์— ๋‹ค๋ฅธ ์„œ๋น„์Šค์—๋„ ํ•ด๋‹น ์š”์ฒญ์„ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์ด ํ•„ํ„ฐ๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ๊ฒ ์ฃ .

/**
 * Created by Neon K.I.D on 1/22/20
 * Blog : https://blog.neonkid.xyz
 * Github : http://github.com/NEONKID
 */
class GatewayPostFilter : ZuulFilter() {
    val logger = LogManager.getLogger()

    override fun run() {
        val req = RequestContext.getCurrentContext()
        val res = req.response
        res.addHeader("X-Sample", UUID.randomUUID().toString())

        logger.info("Using Post Filter: X-Sample - ${res.getHeader("X-Sample")}")
    }

    override fun shouldFilter() = true

    override fun filterType() = FilterConstants.POST_TYPE

    override fun filterOrder() = 0
}

Post-Filter๋Š” API ํ˜ธ์ถœ์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ›„, ๋‹ค์‹œ Gateway์—์„œ API ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์ด ์™”์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ์‘๋‹ต์„ ๋‚˜ํƒ€๋‚ด์ฃผ๋Š” ํ•„ํ„ฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

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

/**
 * Created by Neon K.I.D on 1/22/20
 * Blog : https://blog.neonkid.xyz
 * Github : http://github.com/NEONKID
 */
class GatewayErrorFilter : ZuulFilter() {
    val logger = LogManager.getLogger()

    override fun run() {
        val throwable = RequestContext.getCurrentContext().throwable
        logger.error("Using Error Filter: $throwable")
    }

    override fun shouldFilter(): Boolean {
        val ctx = RequestContext.getCurrentContext()
        return ctx.throwable != null
    }

    override fun filterType() = FilterConstants.ERROR_TYPE

    override fun filterOrder() = 0
}

๋งˆ์ง€๋ง‰์œผ๋กœ Error-Filter๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ๋˜์—ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•„ํ„ฐ๋ง์ž…๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์š”์ฒญ ์ž‘์—…์‹œ ๋ฐœ์ƒํ•œ Exception์ด ์กด์žฌํ•œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋กœ๊น…ํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธํ˜•์ž…๋‹ˆ๋‹ค.

 

What is Zuul Filter ?

์Œ ๊ทธ๋Ÿฐ๋ฐ, ZuulFilter๋ผ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ผ๊นŒ์š”? Pre, Post, Route, Error ์ด๋ ‡๊ฒŒ ์ฃผ์š” 4๊ฐ€์ง€ ํ•„ํ„ฐ๋ง์ด ๋ฌด์Šจ ์—ญํ• ์„ ํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€๋Š” ์•Œ๊ฒ ๋Š”๋ฐ, ๊ฐ ํ•„ํ„ฐ๋ง๋งˆ๋‹ค ๋ถ€๋ชจ ํด๋ž˜์Šค์ธ Zuul Filter๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

ZuulFilter ํด๋ž˜์Šค๋Š” Zuul Gateway์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” Filter ์ถ”์ƒ ํด๋ž˜์Šค ์ค‘์— ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ฆ‰, Zuul Gateway์—์„œ Filter๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ๋งŒ์„ ๋‚˜ํƒ€๋‚ธ ํด๋ž˜์Šค์ด์ง€์š”. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•„ํ„ฐ๊ฐ€ ์žˆ์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ„๋‹จํ•œ Filter๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” Zuul Filter๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

/**
 * Created by Neon K.I.D on 1/22/20
 * Blog : https://blog.neonkid.xyz
 * Github : http://github.com/NEONKID
 */
class GatewayCustomFilter : ZuulFilter() {
    override fun run(): Any {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun shouldFilter(): Boolean {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun filterType(): String {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun filterOrder(): Int {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}

๊ฐ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋“ค์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์–˜๊ธฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ZuulFilter ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” ์•„๋ž˜ 4๊ฐœ์ž…๋‹ˆ๋‹ค.

  • run: ํ•ด๋‹น ํ•„ํ„ฐ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
  • shouldFilter: ์ด ํ•„ํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์กฐ๊ฑด ๋ฉ”์†Œ๋“œ
  • filterType: ์ด ํ•„ํ„ฐ๋Š” ๋ฌด์Šจ ํ•„ํ„ฐ์ธ์ง€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
  • filterOrder: ํ•„ํ„ฐ์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ๊ตฌํ˜„ํ–ˆ๋˜ shouldFilter ๋ฉ”์†Œ๋“œ์— true๋ฅผ ์ฃผ์–ด์ค€๋‹ค๋ฉด, ๋ชจ๋“  ํ•„ํ„ฐ๋ง์ด ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Error Filter์˜ ๊ฒฝ์šฐ true๋กœ ๋ฐ˜ํ™˜๊ฐ’์„ ์ค€๋‹ค๋ฉด, ํ•ญ์ƒ Error-Filter๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ .

 

Test

๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์—ญ์‹œ ์ง€๋‚œ ํฌ์ŠคํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ curl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2020-01-22 17:47:03.399  INFO 12861 --- [nio-9100-exec-1] x.n.g.filters.GatewayPreFilter           : Using Pre Filter: GET request to http://localhost:9100/v1/member
2020-01-22 17:47:03.400  INFO 12861 --- [nio-9100-exec-1] x.n.g.filters.GatewayRouteFilter         : Using Route Filter: 
2020-01-22 17:47:03.412 ERROR 12861 --- [nio-9100-exec-1] x.n.g.filters.GatewayErrorFilter         : Using Error Filter: com.netflix.zuul.exception.ZuulException: Filter threw Exception
2020-01-22 17:47:03.414  WARN 12861 --- [nio-9100-exec-1] o.s.c.n.z.filters.post.SendErrorFilter   : Error during filtering

com.netflix.zuul.exception.ZuulException: Forwarding error
	at org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter.handleException(SimpleHostRoutingFilter.java:261) ~[spring-cloud-netflix-zuul-2.2.2.BUILD-SNAPSHOT.jar:2.2.2.BUILD-SNAPSHOT]
	at org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter.run(SimpleHostRoutingFilter.java:241) ~[spring-cloud-netflix-zuul-2.2.2.BUILD-SNAPSHOT.jar:2.2.2.BUILD-SNAPSHOT]

...

2020-01-22 17:47:03.432  INFO 12861 --- [nio-9100-exec-1] x.n.g.filters.GatewayPostFilter          : Using Post Filter: X-Sample - null

์ €๋Š” Gateway๋งŒ ์‹คํ–‰ํ•œ ์ƒํƒœ๋กœ Member API๋ฅผ ํ˜ธ์ถœํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๋‹น์—ฐํ•œ ์–˜๊ธฐ๊ฒ ์ง€๋งŒ, API ์„œ๋ฒ„๊ฐ€ ๋™์ž‘ํ•˜๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” 500 Internal Server Error ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๊ณ , ์„œ๋ฒ„์—์„œ๋Š” ์–ด๋–ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€, ์–ด๋–ค API๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ˜ธ์ถœํ–ˆ๋Š”์ง€ ๋“ฑ ์šฐ๋ฆฌ๊ฐ€ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ–ˆ๋˜ ๋กœ์ง๋“ค์ด ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋งˆ์น˜๋ฉฐ...

Zuul Gateway์˜ Filtering ๋ถ€๋ถ„์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค. Spring boot์—์„œ ์ด์šฉํ–ˆ๋˜ ๊ฒƒ ๊ทธ๋Œ€๋กœ Filter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”๋“œํฌ์ธํŠธ์˜ ๋ณด์•ˆ ๋“ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์ธ์ฆ์„ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด์˜ Spring boot๋ฅผ ์ด์šฉํ•œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์‰ฝ๊ฒŒ Zuul Gateway์˜ ํ•„ํ„ฐ๋ง์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” Service Discovery์— ๋Œ€ํ•œ ์ฃผ์ œ๋กœ ์ด์–ด๊ฐ€๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Ref: Zuul-core (https://medium.com/netflix-techblog/announcing-zuul-edge-service-in-the-cloud-ab3af5be08ee)

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments