스프링 클라우드와 Zuul로

서비스 라우팅

Spring Microservices in Action

Chapter 6

2019.06.12

박영준

핵심 내용

  • 마이크로서비스와 함께 서비스 게이트웨이 사용

  • 스프링 클라우드, 넷플릭스 Zuul을 사용한 게이트웨이 구현

  • Zuul로 마이크로서비스 경로 매핑

  • 상관관계 ID와 추적을 위한 필터 생성

  • Zuul을 이용한 동적 라우팅

횡단 관심사

  • 보안(인증, 인가), 로깅, 사용자 추적 

  • 각 서비스에 기능을 일관되게 구현하기 어려움

  • 적절하게 구현하기 어려움(보안 관련 내용을 각 개발팀이 개발하면?)

  • 서비스 간 복잡한 의존성을 만듦

 서비스 게이트웨이가 필요!

서비스 게이트웨이?

  • 클라이언트와 호출될 서비스 사이의 중개 역할

  • 서비스 게이트웨이가 관리하는 하나의 URL을 통해 통신

  • 마이크로서비스 호출로 유입되는 모든 트래픽에 대한 게이트 키퍼 역할

  • 서비스 호출에 대한 중앙 집중식 시행 지점(PEP)

PEP : Policy Enforcement Point

서비스 게이트웨이에서 구현 가능한 횡단 관심사

  • 정적 라우팅 : 단일 서비스 URL과 API 경로

  • 동적 라우팅 : AB 테스트

  • 인증(Authentication), 인가(Authorization) : 최적의 장소

  • 측정 지표 수집(metric collection), 로깅(logging)

인증 : 사용자가 실제 유요한 사용자가 맞는지 확인하는 절차

인가 : 클라이언트가 하려는 작업이 허가된 작업인지를 확인(권한부여)

서비스 게이트웨이는 잠재적 SPOF?

  • 올바르게 구현하지 않으면 SPOF가 될 위험 부담이 있음

  • 여러 서비스 게이트웨이 인스턴스 앞에 로드밸런서를 두자

  • 서비스 게이트웨이를 무상태(stateless)로 유지하자

  • 서비스 게이트웨이 코드를 가볍게 유지하자 

Netflix Zuul

  • 사용하기 매우 쉬운 서비스 게이트웨이

  • 스프링 클라우드 어노테이션으로 설정 가능

  • 애플리케이션의 모든 서비스 경로를 단일 URL로 매핑

  • 게이트웨이로 유입되는 요청을 검사하고 대응하는 필터 작성

Zuul Spring Boot 프로젝트 설정

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-zuul', version: '2.1.1.RELEASE'

Zuul Spring Cloud Annotation

  • @EnableZuulProxy - 해당 애플리케이션을 Zuul 서버로 사용

  • @EnableZuulServer - 자체 라우팅 서비스를 만들고 내장된 zuul 기능도 사용하지 않을 때 선택

  • @EnableZuulProxy는 @EnableZuulServer의 슈퍼셋

  • @EnableZuulProxy는 @EnableZuulServer에 설치된 모든 필터를 포함한다

Eureka와 통신하는 Zuul 구성

  • Zuul은 자동으로 유레카를 사용해 서비스를 찾는다.

  • Zuul은 Ribbon을 사용해 클라이언트측 부하분산을 수행한다.

  • 설정 파일을 수정해 유레카 서버를 가리키도록 한다.

eureka:
  instance:
    preferIpAddress: true
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

Zuul Route Configuration

  • 서비스 디스커버리를 이용한 자동 경로 매핑

  • 서비스 디스커버리를 이용한 수동 경로 매핑

  • 정적 URL을 이용한 수동 경로 매핑

Zuul Route Configuration

  • 서비스 디스커버리를 이용한 자동 경로 매핑

  • 특별한 구성 없이도 서비스 ID를 기반으로 요청을 자동 라우팅

  • http://localhost:5555/{serviceId}/v1/organizations/a

  • 서비스 엔드포인트 경로 첫 부분에 serviceId 명시

Zuul Route Configuration

  • 서비스 디스커버리를 이용한 수동 경로 매핑

zuul:
    ignored-service: 'organizationservice'
    prefix: /api
    routes:
        organizationservice: /organization/**
  • http://localhost:5555/api/organization/v1/~~~

Zuul Route Configuration

  • 정적 URL을 이용한 수동 경로 매핑

zuul:
    routes:
        licensestatic:
            path: /licensestatic/**
            url: http://licenseservice-static:8081
  • http://localhost:5555/licensestatic/v1/~~~

스프링 클라우드와 주울로 서비스 라우팅

By Young Jun Park (박영준)

스프링 클라우드와 주울로 서비스 라우팅

스프링 클라우드와 넷플릭스 주울(zuul)에 대한 설명

  • 169