Question

๋ชจ๋“  API ์˜ Response Header ์— Server-Port Key ๋กœ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์„œ๋ฒ„์˜ ํฌํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

ํ—ค๋”์— ์„œ๋ฒ„ ํฌํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ฒ˜์Œ์—๋Š” API๊ฒŒ์ดํŠธ์›จ์ด ํ•  ๋•Œ ํ–ˆ๋˜ ๋ฐฉ๋ฒ•๋Œ€๋กœ ๊ฐ ์„œ๋น„์Šค ์ปจํŠธ๋กค๋Ÿฌ์— @Value๋กœ server.port๋ฅผ ๊ฐ€์ ธ์™€ Response Header์— ๋‹ด์•„ ๋ณด๋ƒˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์— ์ถ”๊ฐ€๋ฅผ ํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์ด๊ฒŒ ๋งž๋‚˜... ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค ๋ฌธ๋“ ์–ด์ฐจํ”ผ ๋ชจ๋“  ์„œ๋น„์Šค๋“ค์€ ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ํ†ต๊ณผํ•˜๋Š”๋ฐ ๊ฒŒ์ดํŠธ์›จ์ด ํ•„ํ„ฐ์—์„œ ํ•ด์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ  ServerWebExchange์˜ Request URL์—์„œ port๋ฒˆํ˜ธ๋ฅผ ์ถ”์ถœํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

private final static String HEADER_SERVER_PORT = "Server-Port";  
  
@Override  
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {  
    return chain.filter(exchange).then(Mono.fromRunnable(() -> addServerPortHeader(exchange)));  
}  
  
private void addServerPortHeader(ServerWebExchange exchange) {  
    URI uri = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);  
    exchange.getResponse().getHeaders().add(HEADER_SERVER_PORT, uri.getPort() + "");  
}

๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ ์ด exchange์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•ด์กŒ๋‹ค.

ServerWebExchange

ServerWebExchange

Spring WebFlux์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ์ „์ฒด ์ƒ์•  ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด

์ฃผ์š” ์—ญํ• 

  1. ์š”์ฒญ ๋ฐ ์‘๋‹ต ๊ด€๋ฆฌ
    • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜จ HTTP ์š”์ฒญ๊ณผ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ˜ํ™˜ํ•  HTTP ์‘๋‹ต์„ ๋ชจ๋‘ ๊ด€๋ฆฌํ•จ
    • ์ด ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ํ—ค๋”์™€ ๋ณธ๋ฌธ์„ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ
  2. ์†์„ฑ ๊ด€๋ฆฌ
    • ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์†์„ฑ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊บผ๋‚ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต
  3. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
    • ๋น„๋™๊ธฐ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ๊ณผ ์‘๋‹ต ์ฒ˜๋ฆฌ
    • Mono์™€ Flux๊ฐ™์€ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰
  4. ์›น ํ•„ํ„ฐ ์ฒด์ธ ๊ด€๋ฆฌ
    • ์›น ํ•„ํ„ฐ ์ฒด์ธ ์‹คํ–‰ ๊ด€๋ฆฌ

ServerWebExchangeUtils

ServerWebExchangeUtils

ServerWebExchange์™€ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ๋„์™€์ฃผ๋Š” ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ์•„๋†“์€ ํด๋ž˜์Šค

์ฃผ์š” ์ƒ์ˆ˜์™€ ๋ฉ”์„œ๋“œ

  • GATEWAY_ROUTE_ATTR: ํ˜„์žฌ ์š”์ฒญ์— ๋Œ€ํ•ด ๋งค์นญ๋œ ๋ผ์šฐํŠธ(Route) ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ
  • GATEWAY_REQUEST_URL_ATTR: ์š”์ฒญ์ด ๋ผ์šฐํŒ…๋  ์ตœ์ข… URL์„ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ
  • GATEWAY_SCHEME_PREFIX_ATTR: ์š”์ฒญ์ด ๋ผ์šฐํŒ…๋  ๋•Œ ์‚ฌ์šฉ๋œ ์Šคํ‚ด(scheme) ์ ‘๋‘์‚ฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ
  • PRESERVE_HOST_HEADER_ATTRIBUTE: ์š”์ฒญ ์‹œ ํ˜ธ์ŠคํŠธ ํ—ค๋”๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ