Hello, Freakin world!

[Zuul] 스프링 클라우드 Zuul 시작하기 본문

Spring Cloud/Gateway

[Zuul] 스프링 클라우드 Zuul 시작하기

johnna_endure 2021. 3. 11. 15:34

Zuul 이란?

간단하게 말하자면 넷플릭스에서 제공하는 게이트웨이 오픈소스 라이브러리다.


Gateway 란?

게이트웨이란 MSA에서 클라이언트에게 분산된 서비스의 단일 진입점이 되는 프록시(리버스 프록시)서버다. MSA에서 보안, 로깅과 같은 횡단 관심사를 각 서비스에 적용하려면 코드 중복해서 사용해야 된다. 이러면 유지보수하기가 힘들어지는데, 그래서 단일 진입점인 게이트웨이에 보통 구현하게 된다.

클라이언트가 여러 서비스의 물리적 주소를 알 필요 없이 게이트웨이 주소만 알면 되는것도 장점이다.

 


목적

이번 글에서는 간단하게 Zuul을 유레카와 연결하고, 자동 생성된 경로들을 스프링 액츄에이터에서 제공하는 엔드 포인트로 확인하면서 마무리할 것이다.

 

그리고 게이트웨이 아래에 연결되는 서비스들은 서비스 디스커버리를 구현하면서 작성했던 것들을 그대로 사용한다.

깃허브에서 코드를 다운 받아 docker-compose를 사용해 간단하게 서비스들을 시작할 수 있다. (사용법은 README.md 참고)

 

 

johnna-endure/service-registry-study

Contribute to johnna-endure/service-registry-study development by creating an account on GitHub.

github.com


Zuul 서버 생성

 

먼저 스프링 이니셜라이저를 이용해 zuul, actuator, eureka-client 의존성을 추가해 프로젝트를 생성한다.

 

build.gradle

plugins {
    id 'org.springframework.boot' version '2.3.9.RELEASE'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'springboot.cloud'
version = '0.0.1'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

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

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-zuul'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

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

test {
    useJUnitPlatform()
}

스프링 액추에이터는 게이트웨이에 매핑된 경로, 필터들을 확인할 수 있는 엔드 포인트를 제공한다.

기본적으로 이 엔드 포인트들의 접근이 되지 않기 때문에 값을 설정해 접근할 수 있도록 해주자.

 

그리고 유레카에 주울 서버를 등록한다.

 

 

application.yml

eureka:
  instance:
    prefer-ip-address: true
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka

server:
  port: 9000

management:
  endpoint:
    routes:
      enabled: true
    filters:
      enabled: true
  endpoints:
    web:
      exposure:
        include: routes, filters

스프링 부트 시동 클래스에 @EnableZuulProxy 애너테이션을 추가해주자.

@EnableZuulProxy
@SpringBootApplication
public class ZuulExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulExampleApplication.class, args);
    }

}

실행, 확인

 

먼저 서비스들을 띄우고 브라우저에서 http://localhost:9000/actuator를 입력.

 

위에서 설정했던 /routes, /filters가 추가됐다.

액추에이터에서 제공하는 엔트포인트들을 확인할 수 있다.


이제 링크를 이용해 /routes, /filters 로 이동하면서 확인해보자.

 

/routes

게이트웨이에 매핑된 경로들이 보인다.

왼쪽 값은 실제 주소와 매핑될 ant 표현식이다.  오른쪽은 유레카에 등록된 서비스 id이다.

경로 매핑에 대한 더 자세한 사항은 다음 글에서 다룰 예정.


 

/filters

주울에 등록된 필터들이 타입별로 나열되어 있다.

주울의 필터는 4가지 타입(error, post, pre, route)이 존재한다. 

자세한 사항은 일단 접어두고, 이 필터들이 상당히 중요하다는 사실만 알아두자.

 

이들을 이용해 보안, 추적 id 부여, 로깅 등 횡단 관심사들을 처리할 수 있다.

Comments