본문 바로가기
GD's IT Lectures : 기초부터 시리즈/스프링부트(Spring Boot) 기초부터 ~

[스프링 부트(SpringBoot) : 고급] API 게이트웨이 및 서비스 메쉬 적용

by GDNGY 2023. 5. 6.

7. API 게이트웨이 및 서비스 메쉬 적용

마이크로서비스 아키텍처를 구성하는 중요한 구성 요소인 API 게이트웨이와 서비스 메쉬에 대해 내용으로, API 게이트웨이는 클라이언트 요청을 적절한 마이크로서비스로 라우팅하는 역할을 하며, 서비스 메쉬는 서비스 간 통신을 관리합니다. API 게이트웨이와 서비스 메쉬의 개념과 스프링 부트와 함께 사용하는 방법을 학습합니다.

 

7.1. API 게이트웨이 소개

API 게이트웨이는 마이크로서비스 아키텍처에서 중요한 역할을 하는 컴포넌트로, 클라이언트 요청을 적절한 마이크로서비스로 라우팅합니다. API 게이트웨이의 주요 기능은 다음과 같습니다.

 

  • 요청 라우팅 : 클라이언트 요청을 해당하는 마이크로서비스로 전달합니다.
  • 인증 및 권한 부여 : 사용자 인증 및 권한 검사를 수행합니다.
  • 요청 및 응답 변환 : 클라이언트와 마이크로서비스 간 데이터 형식을 변환합니다.
  • 로드 밸런싱 : 부하 분산을 통해 서비스의 확장성을 향상시킵니다.

 

7.2. 서비스 메쉬 소개

서비스 메쉬는 마이크로서비스 간의 통신을 관리하는 인프라 계층입니다. 서비스 메쉬는 다음과 같은 기능을 제공합니다.

 

  • 서비스 간 통신 제어 : 타임아웃, 재시도, 회로 차단 등의 기능을 제공하여 서비스 간 통신의 안정성을 높입니다.
  • 서비스 검색 : 서비스 인스턴스를 동적으로 찾아 통신을 가능하게 합니다.
  • 보안 : 서비스 간 통신을 암호화하고 인증 및 권한 관리를 수행합니다.
  • 모니터링 및 추적 : 서비스 간 통신에 대한 모니터링과 추적을 수행하여 성능 및 오류 분석을 지원합니다.

 

7.3. 스프링 부트와 함께 사용하는 API 게이트웨이 및 서비스 메쉬

스프링 부트에서는 API 게이트웨이로 Spring Cloud Gateway를 사용할 수 있으며, 서비스 메쉬로는 Istio, Linkerd 등이 있습니다. 이번 섹션에서는 Spring Cloud Gateway와 Istio를 사용하여 스프링 부트 애플리케이션에 API 게이트웨이와 서비스 메쉬를 적용하는 방법을 설명합니다.

 

☞ 예제 코드 : Spring Cloud Gateway를 사용한 API 게이트웨이 구성

 

먼저, 의존성을 추가합니다.

<!-- pom.xml -->
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
</dependencies>

 

그런 다음, 게이트웨이 애플리케이션의 application.yml 파일에서 라우트를 정의합니다.

spring:
  cloud:
    gateway:
      routes:
      - id: user-service
        uri: http://localhost:8081
        predicates:
        - Path=/users/**
      - id: order-service
        uri: http://localhost:8082
        predicates:
        - Path=/orders/**

 

이 설정에 따라 /users로 시작하는 요청은 user-service로, /orders로 시작하는 요청은 order-service로 라우팅됩니다.

 

 

☞ 예제 코드 : Istio를 사용한 서비스 메쉬 구성

 

먼저, Kubernetes 클러스터에 Istio를 설치합니다.

# Istio 설치
curl -L https://istio.io/downloadIstio | sh -

# Istio 배포
cd istio-1.x.x
export PATH=$PWD/bin:$PATH
istioctl install --set profile=demo

# Istio를 사용할 namespace에 istio-injection 레이블 추가
kubectl label namespace your-namespace istio-injection=enabled

 

그런 다음, 스프링 부트 애플리케이션을 Kubernetes에 배포하고, Istio의 VirtualService와 DestinationRule 리소스를 사용하여 서비스 메쉬를 구성합니다.

# k8s-istio.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: user-service
spec:
  hosts:
  - user-service
  http:
  - route:
    - destination:
        host: user-service
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: user-service
spec:
  host: user-service
  subsets:
  - name: v1
    labels:
      version: v1

 

이 예제에서는 Spring Cloud Gateway를 사용하여 API 게이트웨이를 구성하고, Istio를 사용하여 서비스 메쉬를 구성했습니다. 이를 통해 마이크로서비스 간의 통신 및 관리를 효율적으로 수행할 수 있습니다.

 

7.4. 스프링 부트 애플리케이션과 서비스 메쉬 관리

서비스 메쉬의 일부 기능을 사용하여 스프링 부트 애플리케이션을 관리하는 방법을 살펴보겠습니다.

 

☞ 예제 코드 : Istio를 사용한 서킷 브레이커 구성

 

먼저, DestinationRule 리소스에 서킷 브레이커 설정을 추가합니다.

# k8s-istio-circuit-breaker.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: user-service
spec:
  host: user-service
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
    outlierDetection:
      consecutiveErrors: 1
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 100
  subsets:
  - name: v1
    labels:
      version: v1

 

이 설정에 따라 연결 풀의 크기와 오류 발생 시 제거 정책을 제어하여 서킷 브레이커를 구성합니다.

 

 

☞ 예제 코드 : Istio를 사용한 트래픽 미러링 구성

 

먼저, 스프링 부트 애플리케이션의 새로운 버전을 배포합니다.

# k8s-deploy-v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service-v2
spec:
  template:
    metadata:
      labels:
        app: user-service
        version: v2
    spec:
      containers:
      - name: user-service
        image: user-service:2.0.0
        ports:
        - containerPort: 8080

 

그런 다음, VirtualService 리소스를 업데이트하여 트래픽 미러링을 구성합니다.

# k8s-istio-traffic-mirroring.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: user-service
spec:
  hosts:
  - user-service
  http:
  - route:
    - destination:
        host: user-service
        subset: v1
      weight: 100
    mirror:
      host: user-service
      subset: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: user-service
spec:
  host: user-service
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

 

 

이 설정에 따라 모든 요청이 user-service의 v1 버전으로 전송되며 동시에 v2 버전으로 복제됩니다. 이렇게 트래픽 미러링을 사용하면 새로운 버전의 서비스를 안전하게 롤아웃하고 테스트할 수 있습니다.

 

 

☞ 예제 코드 : Istio를 사용한 카나리아 릴리스 구성

 

먼저, VirtualService 리소스를 업데이트하여 카나리아 릴리스를 구성합니다.

# k8s-istio-canary.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: user-service
spec:
  hosts:
  - user-service
  http:
  - route:
    - destination:
        host: user-service
        subset: v1
      weight: 90
    - destination:
        host: user-service
        subset: v2
      weight: 10
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: user-service
spec:
  host: user-service
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

 

이 설정에 따라 전체 트래픽의 90%가 user-service의 v1 버전으로, 10%가 v2 버전으로 전송됩니다. 이렇게 카나리아 릴리스를 사용하면 서비스의 새 버전을 점진적으로 배포하고 검증할 수 있습니다.

 

스프링 부트 애플리케이션에서 API 게이트웨이와 서비스 메쉬를 적용하는 방법으로. 이를 통해 마이크로서비스 아키텍처를 효과적으로 구성하고 관리할 수 있습니다.

 

 

 

2023.05.06 - [프로그래밍/스프링부트(Spring Boot) 기초부터 ~] - [스프링 부트(SpringBoot) : 고급] 이벤트 소싱 및 CQRS 패턴 적용

 

[스프링 부트(SpringBoot) : 고급] 이벤트 소싱 및 CQRS 패턴 적용

6. 이벤트 소싱 및 CQRS 패턴 적용 이벤트 소싱은 애플리케이션의 상태 변경을 순차적으로 저장하는 방식이고, CQRS는 명령과 쿼리를 분리하여 시스템의 응답 속도와 확장성을 향상하는 패턴입니

gdngy.tistory.com

 

반응형

댓글