본문 바로가기
Spring

뭐? MSA? 그렇다면 Zuul로 Gateway를 구현해보자. - 01

by zkdlu 2021. 3. 30.

 

Netflix/zuul

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

github.com

 

Eureka, Hystrix등과 같이 Netflix OSS에 포함 된 API 게이트웨이

 

Zuul 1.x은 Servlet의 Blocking API를 사용되어 개발되었기 때문에 기본적으로 Blocking 방식으로 동작을 하고, 이를 보완하기 위해 Thread pool을 사용했지만, 오랫동안 연결이 유지되어야 하는 Websocket과 같은 연결을 지원하지 않았지만, Zuul 2.0부터는 Netty 기반 Non-blocking으로 동작합니다.

 

💡 Spring Cloud Gateway는?

Gateway를 구현하는 또 다른 방법은 Spring Cloud 커뮤니티에서 개발한 Spring Cloud Gateway가 있습니다.
성능 비교 결과 더 좋은 성능을 보인다는 말도 있고, Spring Cloud에서 정식으로 지원하는 라이브러리 이니 추후에 WebFlux를 공부하면서 함께 사용해 볼 생각입니다.

 

Zuul 아키텍처

https://www.slideshare.net/ifkakao/msa-api-gateway

 

실습

먼저 라우팅 할 프로젝트를 생성했다고 가정하겠습니다.

- http://localhost:8081/

 

 

보통 Gateway를 구축하면 여러 서비스를 관리하기 위해 멀티모듈로 사용하는 경우가 많으니 Spring initializer를 이용하지 않고 Gradle에 직접 입력하는 방법으로 하겠습니다.

이건 아닌가? 암튼 저는 그래요 ㅎㅎ

 

사용한 Spring boot 버전 : 2.3.9.RELEASE

 

1.  root 프로젝트의 build.gradle에 아래 설정을 추가합니다.

    ext {
        set('springCloudVersion', "Hoxton.SR10")
    }

    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
        }
    }

2.  Gateway 모듈에 zuul 의존성을 추가 합니다.

    dependencies {
        implementation('org.springframework.cloud:spring-cloud-starter-netflix-zuul')
    }

3. EnableZuulProxy 어노테이션과 라우팅 설정을 추가 해줍니다.

@EnableZuulProxy
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

 

zuul은 L7 로드밸런서로 request path를 기반으로 라우팅을 합니다. 아래 설정은 /target으로  들어오는 request에 대한 라우팅 설정입니다.

# application.yml
zuul:
  routes:
    test:
      path: /target/**
      url: http://localhost:8081

이 후 localhost:8080/target 으로 request를 보내면 localhost:8081/로 라우팅 되는 것을 확인할 수 있습니다.