Java Spring Boot 009-3 | Spring Cloud Gateway

Yunny.Log ·2022년 4월 5일
0

Spring Boot

목록 보기
40/80
post-thumbnail

Spring Cloud Gateway

- Spring Cloud Gateway 기능

  • 기존 서비스에서 다른 기능 작동 여부 기준으로 서비스 나누기
  • 그럼 api gateway가 알아서 처리해준다
  • 클라이언트는 뒤쪽 구조 몰라도 됨

  • aop는 횡단 관점에서 처리해줄 것

  • api gateway는 필터를 통해서 각 서비스에 존재하는 횡단 관심사들을 한번에 구현해줄 수 있도록

- 기본적인 Gateway Routing 사용법

두 프로젝트를 사용
1) community :
각 서비스들이 모여있음
2) gateway :
분산된 서비스들을 한번에 처리될 수 있게 도와줌

  • yml로 각 서비스가 다른 포트에서 돌아갈 수 있게 설정

  • configuration도 다르게 실행될 수 있도록 설정

  • 해당 링크가 들어온다면 해당 url로 처리를 하여라라고 라우트를 해준다

- Gateway를 활용한 Backend 서비스

  • 게이트 웨이 필터 활용방식 :
    추가 설명 : https://happycloud-lee.tistory.com/218

  • API Gateway가 필요한 이유

    안전한 API유통과 Client 요청별로 유연하게 대처하기 위해

  • SCG는 Predicates(수행을 위한 사전 요구조건)와 Filter를 조합하여 동작

    세가지 용어

1) Route

  • 목적지의 URI와 Predicates라는 조건들의 목록 그리고 필터들을 이용하여 어떤 곳으로 Routing 할 것인지를 명시하는 역할
  • 어떤 요청이 왔는지 확인하고 Mapping 하는 작업

2) Predicate

  • Handler Mapping 시에 필요한 Uri 정보나, Path 정보를 확인하는 주체
  • 라우팅이 동작하는 조건을 지정
  • 지정할 수 있는 조건 : DateTime(Before, After, Between), Cookie, Http Header, Host, Http Method, Query
    (+) Proxying되는 비율(Weight)을 줄 수도 있음

3) Filter

  • Handler Mapping이 된 후 들어온 요청에 대한 필터 작업
  • 들어오는 요청과 응답, Request, Response을 특정 필터를 타게 함
  • 우리가 원하는 방식으로 요청을 보내거나 헤더를 조작 가능
  • 해당 필터를 이용해 로그 파일 작성

=> yml 설정 파일에도 정의할 수 있고 java code 에서 정의 가능

spring:
  cloud:
    gateway:
      routes:
        - id: community-shop
          uri: http://localhost:8081 # 포워딩할 주소
          # http://localhost:8000으로 들어오면 http://localhost:8081 로 포워딩
          predicates:
            - Path=/api/shop/**
            # 해당 gateway 서버의 /api/shop/**로 들어오는 놈은 community-shop service로 인식하겠다는 조건
            
          filters:
            - RewritePath=/api/(?<path>.*), /$\{path}
            - name: LogExecution
              args:
                simpleUid: true
                inSeconds: true
        - id: community-user
          uri: http://localhost:8082
          predicates:
            - Path=/api/user/**
          filters:
            - name: RewritePath
              args:
                regexp: /api/(?<path>.*)
                replacement: /$\{path}
            - LogExecution=true, true
        - id: community-area
          uri: http://localhost:8083
          predicates:
            - Path=/api/area/**
          filters:
            - RewritePath=/api/(?<path>.*), /$\{path}

  1. Client 는 Spring Cloud Gateway 에 요청을 보낸다.
  2. Gateway Handler Mapping 에서 해당 요청에 대한 Route와 Predicates가 일치한다고 판단하면 해당 요청은 Gateway Web handler로 보내진다.
  3. handler 에서 Filter Chain 을 이용해서 사전 필터 혹은 사후 필터로 나누어 동작
  4. 필터링이 된 후 실제 마이크로서비스에게 전달

1) 기존 디스커버리 패턴

  • 각각의 마이크로 서비스들의 포트는 8812, 51728, 9271 은 Eureka Server에 Registration 되어있는 상태로 각각의 서비스들의 포트가 바뀌어도 Eureka Dashboard에서 확인할 수 있는 구조
  • User-Service(8812 포트) 에서 login 을 수행하고 Order-Service(51728 포트) 에서 상품을 주문 한 뒤, Delivery-Service(9271) 포트에서 배달 주문을 수행
  • 주문과 배달을 위해서 각각의 마이크로서비스들은 다른 서비들의 포트를 모두 알고있어야 한다. 만약 포트가 바뀐다면 포트가 바뀐 서버를 제외한 모든 서버는 바뀐 포트의 번호를 수정하고 다시 발드 -> 배포

마이크로서비스를 호출할 때 포트를 신경쓰지 않아도 된다면? => Spring Gateway

1.User 서버는 Order 서버에 보내야할 요청을 Gateway로 전달
2. Gateway는 Eureka Server로 Order 서버의 정보 discovery
3. Gateway가 Order Server로 연결

장점 :

  • 각각의 마이크로서비스들은 서로의 포트 번호를 몰라도 된다.
  • Front 에서는 요청을 Gateway로만 보내면 되기 때문에 Gateway 포트만 알면 모든 요청을 수행할 수 있다.
  • 모든 요청은 Gateway 를 거치기 때문에 로그를 쉽게 다룰 수 있다.
    Gateway 가 요청의 진입점이므로 통합 인증을 수행

0개의 댓글