Spring Cloud Zuul - redutan/redutan.github.io GitHub Wiki

Zuul

Zuul is a gateway service that provides dynamic routing, monitoring, resiliency, security, and more.

Zull์„ ์„ ํƒํ•œ ์ด์œ ?

  • ๋„ทํ”Œ๋ฆญ์Šค์—์„œ ๋งŒ๋“ฌ
  • java๋กœ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— proxy ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ ViewTemplate(ex:FreeMarker)๋ฅผ ์ด์šฉํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ์ง์ ‘ ์„œ๋น„์Šคํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • spring-boot starter์ด ๊ธฐ๋ณธ ์ œ๊ณต๋˜์–ด์„œ application.yml์— ์„ค์ •์„ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Zuul in Netflixโ€™s Cloud Architecture

Zuul in Netflixโ€™s Cloud Architecture

Zuul Filters

Zuul Filters Lifecycle

Dependencies

build.gradle

compile('org.springframework.cloud:spring-cloud-starter-zuul') {
    exclude group: 'com.google.code.findbugs', module: 'annotations'
    exclude group: 'com.google.code.findbugs', module: 'jsr305'
}

Configuration

ZuulConfiguration.java

/**
 * Zuul api-gw ์„ค์ •
 * ์ž…๋ง›์— ๋งž๊ฒŒ ํ•„ํ„ฐ๋“ค์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.
 * @author myeongju.jung
 */
@Configuration("zuulCustomConfiguration")   // Bean๋ช…์นญ ์ถฉ๋Œ๋ฐฉ์ง€
@EnableZuulProxy
public class ZuulConfiguration {
 
    @Bean
    Servlet30WrapperFilter servlet30WrapperFilter() {
        return new Servlet30WrapperFilter();
    }
 
    @Bean
    DebugFilter debugFilter() {
        return new DebugFilter();
    }
 
    @Bean
    ApiFirstPreFilter apiFirstPreFilter() {
        return new ApiFirstPreFilter();
    }
}

application.yml

# zuul api-gw
# zuul api-gw
zuul:
  routes:
    post:
      path: /api/post/**
      url: http://www.post.com/api

Test

PostApiRootGwTest.java

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class PostApiRootGwTest {
    @Autowired
    TestRestTemplate restTemplate;
 
    @Ignore("ํ•ด๋‹น ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” post-api ์„œ๋ฒ„๊ฐ€ ๊ธฐ๋™๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
    @Test
    public void samples() throws Exception {
        // given
        // when
        ResponseEntity<Collection<Sample>> responseEntity =
            restTemplate.exchange("/api/post/samples", HttpMethod.GET, HttpEntity.EMPTY,
                new ParameterizedTypeReference<Collection<Sample>>() {
                });
        Collection<Sample> samples = responseEntity.getBody();
        // then
        assertThat(samples.isEmpty(), is(false));
        samples.forEach(this::assertSample);
    }
 
    private void assertSample(Sample sample) {
        System.out.println(sample);
        assertThat(sample.getSeq(), is(greaterThan(0L)));
        assertThat(sample.getTitle(), is(notNullValue()));
        assertThat(sample.getContent(), is(notNullValue()));
        assertThat(sample.getHit(), is(greaterThanOrEqualTo(0)));
        assertThat(sample.getCreatedAt(), is(lessThan(ZonedDateTime.now())));
    }
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ