Spring Cloud Gateway를 이해하기 위한 글 (시작에서 포기까지)

먼저 게이트웨이가 무엇인지 이해하십시오.

기존의 모놀리식 애플리케이션에서는 모든 요청을 하나의 애플리케이션에서 처리하므로 게이트웨이의 개념이 없습니다. 그러나 마이크로 서비스 아키텍처에서 각 서비스에는 외부 서비스를 제공하기 위한 주소와 포트가 있으며 권한 확인, 로깅, 전류 제한, 회로 차단기, 모니터링 등과 같은 몇 가지 공통 기능이 있습니다. 각 서비스가 독립적으로 인터페이스를 제공할 수 있는 경우. 이러한 인터페이스를 조정하고 관리하는 것은 매우 번거롭고 코드 중복을 유발합니다.

게이트웨이는 마이크로 서비스 아키텍처에서 이러한 문제를 해결하는 데 사용됩니다. 게이트웨이는 외부적으로 통합 인터페이스를 제공하고 내부적으로는 등록 센터와의 상호 작용을 통해 요청을 적절한 서비스로 전달합니다. 게이트웨이는 또한 권한 확인, 로깅, 전류 제한, 회로 차단기, 모니터링 등과 같은 몇 가지 일반적인 기능을 담당합니다.

게이트웨이 개념을 도입한 후 각 마이크로서비스는 자체 비즈니스 로직에만 주의를 기울이면 되고 다른 기능에는 주의를 기울일 필요가 없습니다. 마이크로서비스 운영이 크게 간소화되었습니다.

Spring 클라우드 게이트웨이는 Spring에서 공식적으로 출시한 매우 인기 있는 마이크로서비스 게이트웨이 프레임워크입니다. 다른 게이트웨이 서비스 프레임워크와 비교할 때 Spring 클라우드 게이트웨이는 사용하기 쉽고 강력하며 Spring 클라우드 생태계와 통합하기 쉽습니다.

빠르게 시작하기

스프링 클라우드 게이트웨이를 시작하는 것은 매우 쉽습니다. 이에 대해 알아보기 전에 간단한 예를 살펴보겠습니다.

스프링 부트 프로젝트 생성

spring initializr를 사용하여 스프링 부트 프로젝트를 생성하고 webflux 및 게이트웨이 종속성을 선택합니다.

간단한 경로 작성

application.yml에 다음 구성을 추가합니다.

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://www.baidu.com
          predicates:
            - Path=/get

스타트업 프로젝트

프로젝트를 시작하고 http://localhost:8080/get을 방문하면 페이지가 Baidu 홈페이지와 함께 로드되는 것을 볼 수 있습니다.

스프링 클라우드 게이트웨이 기본 프로세스

Spring Cloud 게이트웨이가 해결해야 할 문제와 기본 프로세스에 익숙해져야만 더 잘 배울 수 있습니다. 스프링 클라우드 게이트웨이의 기본 흐름은 다음 그림과 같습니다.
[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있습니다. )(img.png)]

클라이언트가 Spring Cloud Gateway에 요청을 보내면 Spring Gateway는 요청된 정보 및 라우팅 규칙에 따라 해당 Gateway Web Handler와 일치합니다. 핸들러는 필터 링크를 통해 요청을 처리하고 필터는 요청 에이전트가 데이터를 보내기 전이나 후에 데이터를 처리할 수 있습니다.

Spring Cloud Gateway의 핵심 개념

라우팅

라우팅은 ID, 대상 URI, 일련의 어설션 및 일련의 필터로 구성된 Spring Cloud Gateway의 기본 모듈입니다. 요청이 Spring Cloud Gateway에 들어오면 시스템은 순서대로 모든 경로를 일치시키려고 시도하고 일치가 성공하면 해당 필터 체인이 실행됩니다. 그런 다음 대상 URI로 전달합니다.

사실 Spring Cloud Gateway를 사용할 때 우리의 주요 작업은 라우팅 규칙을 지정하는 것입니다. 즉, 경로의 ID, 대상 URI, 어설션 및 필터를 지정합니다. 라우팅 규칙을 지정하는 방법에는 두 가지가 있는데 하나는 구성 파일에서 지정하는 방법이고 다른 하나는 인코딩으로 지정하는 방법입니다.

구성 파일은 라우팅 규칙을 지정합니다.

application.yml에 다음 구성을 추가합니다.

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://www.baidu.com
          predicates:
            - Path=/get
        - id: host_route
          uri: http://www.baidu.com
          predicates:
            - Host=**.baidu.com

인코딩은 라우팅 규칙을 지정합니다.

Spring Cloud Gateway에서는 보다 유연한 코딩을 통해 라우팅 규칙을 지정할 수 있으며 런타임에 라우팅 규칙을 동적으로 추가 및 삭제할 수 있습니다.

@Configuration
public class GatewayConfig {
    
    

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    
    
        return builder.routes()
                .route("path_route", r -> r.path("/get")
                        .uri("http://www.baidu.com"))
                .route("host_route", r -> r.host("*.baidu.com")
                        .uri("http://www.baidu.com"))
                .build();
    }
}

어느 쪽이든 라우팅 구성에서 기본적으로 해야 할 일은 어설션을 지정하고, 필터를 설정하고, 처리를 위한 점프 또는 핸들러를 지정하는 것입니다.
이러한 개념을 하나씩 살펴보겠습니다.

단언

어설션은 부울 표현식이며 그 기능은 요청이 경로의 조건을 충족하는지 여부를 판단하는 것입니다. 어설션이 true이면 경로가 일치하고 그렇지 않으면 일치하지 않습니다. 어설션은 구성 파일에 지정되거나 코딩될 수 있습니다.

어설션을 지정하는 구성 파일

구성 파일에서 어설션을 지정하는 방법에는 두 가지가 있습니다. 하나는 바로 가기 구현이고 다른 하나는 전체 구현입니다.

바로 가기 구현

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

전체 구현

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: https://example.org
          predicates:
            - name: Cookie
              args:
                name: mycookie
                regexp: mycookievalue

위의 두 가지 방법을 통해 short는 쉼표로 구분된 assertion의 이름과 매개 변수를 지정하고 full 방법은 name과 args의 두 가지 속성을 통해 assertion의 이름과 매개 변수를 지정하는 것을 볼 수 있습니다.

지정된 어설션 인코딩

코딩에서 어설션을 지정하기 위해 다음과 같이 PredicateSpec 메서드를 통해 어설션을 지정할 수 있습니다.

@Configuration
public class GatewayConfig {
    
    

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    
    
        return builder.routes()
                .route("path_route", r -> r.path("/get").uri("http://www.baidu.com"))
                .route("host_route", r -> r.host("*.baidu.com").uri("http://www.baidu.com"))
                .build();
    }
}

위의 예에서는 코딩을 통해 두 개의 라우팅 규칙, 즉 path_route와 host_route를 지정했습니다. 프로그래밍 방식으로 어설션, 필터 및 대상 URI를 설정합니다.

어설션 요약

어설션의 의도와 이를 구성하는 방법을 이해하면 어설션 사용이 매우 간단해집니다. 일반적으로 사용되는 일부 내장 어설션 팩토리는 공식 웹 사이트를 통해 사용 방법을 배울 수 있습니다.
공식 홈페이지 주소

필터

필터는 Spring Cloud Gateway의 핵심 구성 요소이며 그 역할은 라우팅 전후에 요청을 수정하는 것입니다. Spring Cloud Gateway의 필터는 GatewayFilter와 GlobalFilter의 두 가지 유형으로 나뉩니다.

  • GlobalFilter: 라우팅 전후에 요청을 수정하는 전역 필터입니다.
  • GatewayFilter: 단일 경로에서 작동하고 라우팅 전후에 요청을 수정할 수 있는 로컬 필터입니다.

글로벌 필터

전역 필터는 모든 경로에 적용되는 필터이며 라우팅 전후에 요청을 수정할 수 있습니다. Spring Gateway에는 몇 가지 전역 필터가 내장되어 있습니다. 내장된 공통 전역 필터 외에도 전역 필터를 사용자 정의할 수도 있습니다. 내장 글로벌 필터에 대해 공식 웹 사이트로 이동하여 하나씩 알아보거나 글로벌 필터가 필요할 때 공식 웹 사이트로 이동하여 찾을 수 있습니다. 적합한 필터가 없으면 사용자 정의 필터를 고려하십시오.
공식 홈페이지 주소

구성 파일은 전역 필터를 지정합니다.

spring:
  cloud:
    gateway:
      globalfilters:
        - name: AddRequestHeader
          args:
            name: X-Request-Global-Foo
            value: Global-Bar

인코딩은 전역 필터를 지정합니다.

@Configuration
public class GatewayConfig {
    
    
    @Bean
    public GlobalFilter customGlobalFilter() {
    
    
        return (exchange, chain) -> {
    
    
            ServerHttpRequest request = exchange.getRequest().mutate().header("X-Request-Global-Foo", "Global-Bar").build();
            return chain.filter(exchange.mutate().request(request).build());
        };
    }
}

사용자 지정 글로벌 필터

사용자 지정 필터는 다음과 같이 GatewayFilter 인터페이스를 구현해야 합니다.

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
    
    

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
    
        System.out.println("global filter");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
    
    
        return 0;
    }
}

실제 사용 시 비즈니스 필요에 따라 적절한 필터를 사용하거나 결합할 수 있습니다.

로컬 필터

로컬 필터는 단일 경로에서 작동하는 필터이며 라우팅 전후에 요청을 수정할 수 있습니다. Spring Gateway에는 일부 로컬 필터가 내장되어 있습니다. 내장된 공통 로컬 필터 외에도 로컬 필터를 사용자 정의할 수 있습니다.
내장 글로벌 필터에 대해 공식 웹 사이트로 이동하여 하나씩 알아보거나 글로벌 필터가 필요할 때 공식 웹 사이트로 이동하여 찾을 수 있습니다. 적합한 필터가 없으면 사용자 정의 필터를 고려하십시오. 로컬 필터 공식 웹 사이트 주소

구성 파일에서 로컬 필터 구성

구성 파일에서 정의된 라우터에서 필터를 통해 필터를 지정합니다. 필터에서 여러 필터를 지정할 수 있으며 필터의 실행 순서는 필터의 순서에 따라 실행됩니다. 각 필터에서 Name 및 Args별로 필터의 이름과 매개변수를 지정합니다. 또는 Name = Args로 필터를 설정할 수 있습니다.

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://www.baidu.com
          predicates:
            - Path=/get
          filters:
            - AddRequestHeader=X-Request-Foo, Bar
            - AddResponseHeader=X-Response-Foo, Bar
            - DedupeResponseHeader=Foo
            - Hystrix=fooCommand
            - PrefixPath=/httpbin
            - PreserveHostHeader
            - RemoveRequestHeader=Foo
            - RemoveResponseHeader=Foo
            - RewritePath=/foo/(?<segment>.*), /$\{
    
    segment}
            - RewriteResponseHeader=Location, http://newlocation.org
            - RequestRateLimiter=5, 1, SECONDS
            - Retry=3
            - SaveSession
            - SecureHeaders
            - SetPath=/foo/{
    
    segment}
            - SetRequestHeader=X-Request-Foo, Bar
            - SetResponseHeader=X-Response-Foo, Bar
            - SetStatus=401
            - StripPrefix=1
            - StripRequestHeader=Foo
            - StripResponseHeader=Foo
            - Weight=foo, 5

로컬 필터를 사용한 인코딩

코딩에서 필터를 통해 필터를 지정할 수 있습니다. 필터에서 여러 필터를 지정할 수 있으며 필터의 실행 순서는 필터의 순서에 따라 실행됩니다.

@Configuration
public class GatewayConfig {
    
    

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    
    
        return builder.routes()
                .route("path_route", r -> r.path("/get")
                        .filters(f -> f.addRequestHeader("X-Request-Foo", "Bar")
                                .addResponseHeader("X-Response-Foo", "Bar"))
                        .uri("http://www.baidu.com"))
                .build();
    }
}

사용자 지정 로컬 필터

사용자 지정 필터는 다음과 같이 GatewayFilter 인터페이스를 구현해야 합니다.

@Component
public class MyGatewayFilter implements GatewayFilter, Ordered {
    
    

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
    
        System.out.println("gateway filter");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
    
    
        return 0;
    }
}

핸들러 기능

어설션 및 필터를 구성하여 Spring Cloud Gateway는 요청을 지정된 서비스로 라우팅할 수 있습니다. 그러나 지정된 서비스로 요청을 라우팅하는 대신 Spring Cloud Gateway에서 직접 요청을 처리하려면 Handler Function을 사용해야 합니다.

Handler Function은 WebFlux의 개념으로 ServerRequest 객체를 받아 Mono 객체를 반환하는 함수입니다. Spring Cloud Gateway에서는 지정된 서비스로 요청을 라우팅하는 대신 Handler Function을 통해 요청을 처리할 수 있습니다.

핸들러 함수 사용자 지정

핸들러 함수를 사용자 지정하려면 다음과 같이 HandlerFunction 인터페이스를 구현해야 합니다.

@Component
public class MyHandlerFunction implements HandlerFunction<ServerResponse> {
    
    

    @Override
    public Mono<ServerResponse> handle(ServerRequest request) {
    
    
        return ServerResponse.ok().body(BodyInserters.fromObject("hello world"));
    }
}

사용Handler Function

import org.springframework.beans.factory.annotation.Autowired;

@Configuration
public class GatewayConfig {
    
    
    @Autowired
    private MyHandlerFunction myHandlerFunction;
    @Bean
    public RouterFunction<ServerResponse> htmlRouterFunction() {
    
    
        return RouterFunctions.route(RequestPredicates.path("/fallback"), myHandlerFunction));
    }
}

요약하다

Spring Cloud Gateway는 마이크로 서비스에서 사용하기에 매우 간단하고 편리합니다. 대부분의 경우 레지스트리에 연결하도록 Spring Cloud Gateway를 구성한 다음 라우팅 규칙을 구성하기만 하면 됩니다. 대부분의 경우에도 라우팅 구성을 설계할 필요가 없으며 기본적으로 레지스트리의 서비스와 요청을 매칭하고 일치하면 자동으로 해당 서비스로 라우팅됩니다.

Supongo que te gusta

Origin blog.csdn.net/aofengdaxia/article/details/128924106
Recomendado
Clasificación