Spring Cloud Alibaba 학습 노트 (20) - Spring Cloud Gateway 에 내 장 된 전역 필터

참고:https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/single/spring-cloud.html#_global_filters
전역 필터
역할.
Combined Global Filter and GatewayFilter Ordering
필터 실행 순서 정렬
Forward Routing Filter
로 컬 forward 에 사용 되 는 것 은 게 이 트 웨 이 서비스 에서 하류 서비스 로 전송 하 는 것 이 아니 라 리 트 윗 을 요청 하 는 것 입 니 다.
LoadBalancerClient Filter
리본 을 통합 하여 부하 균형 을 실현 하 다.
Netty Routing Filter
Netty 의 HttpClient 를 사용 하여 http, https 요청 을 전송 합 니 다.
Netty Write Response Filter
프 록 시 응답 을 게 이 트 웨 이 클 라 이언 트 측 에 다시 쓰기
RouteToRequestUrl Filter
request 에서 가 져 온 원본 url 을 Gateway 로 변환 하여 전송 을 요청 할 때 사용 하 는 url
Websocket Routing Filter
Spring Web Socket 을 사용 하여 Websocket 요청 을 전송 합 니 다.
Gateway Metrics Filter
모니터링 관련 통합, 모니터링 지표 제공
Marking An Exchange As Routed
중복 되 는 경로 전송 방지
Combined Global Filter and GatewayFilter Ordering
Gateway 가 요청 을 받 았 을 때 Filtering Web Handler 프로 세 서 는 모든 GlobalFilter 인 스 턴 스 와 모든 경로 에 설 치 된 Gateway Filter 인 스 턴 스 를 필터 체인 에 추가 합 니 다.이 필터 체인 의 모든 필 터 는 org. springframework. core. Ordered 주석 이 지정 한 숫자 크기 에 따라 정렬 됩 니 다.Spring Cloud Gateway 는 필터 가 논리 적 으로 실행 되 는 'pre' 와 'post' 단 계 를 구분 하기 때문에 우선 순위 가 높 은 필 터 는 'pre' 단계 에서 가장 먼저 실행 되 고, 우선 순위 가 가장 낮은 필 터 는 'post' 단계 에서 마지막 으로 실 행 됩 니 다.
  • 숫자 가 작 을 수록 앞으로 집행
  • 예제 코드:
    @Bean
    @Order(-1)
    public GlobalFilter a() {
        return (exchange, chain) -> {
            log.info("first pre filter");
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("third post filter");
            }));
        };
    }
    
    @Bean
    @Order(0)
    public GlobalFilter b() {
        return (exchange, chain) -> {
            log.info("second pre filter");
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("second post filter");
            }));
        };
    }
    
    @Bean
    @Order(1)
    public GlobalFilter c() {
        return (exchange, chain) -> {
            log.info("third pre filter");
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("first post filter");
            }));
        };
    }

    결과 되 돌리 기:
    first pre filter
    second pre filter
    third pre filter
    first post filter
    second post filter
    third post filter

    Forward Routing Filter
    들 어 오 라 고 요청 하면 Forward Routing Filter 에서 URL 을 볼 수 있 습 니 다. 이 URL 은 exchange 속성 ServerWebExchange Utils. GATEWAY 입 니 다.REQUEST_URL_ATTR 의 값 입 니 다. 이 url 의 scheme 이 forward 라면 (예 를 들 어:forward://localendpoint), 이 Filter 는 Spirngd 의 Dispatcher Handler 를 사용 하여 이 요청 을 처리 합 니 다.이 요청 한 URL 경로 부분 은 forward URL 의 경로 로 덮어 씁 니 다.수정 되 지 않 은 원본 URL 은 ServerWebExchange Utils. GATEWAY 에 추 가 됩 니 다.ORIGINAL_REQUEST_URL_ATTR 속성 중.
    PS: url scheme 이란 쉽게 말 하면 url 의 프로 토 콜 부분 입 니 다. 예 를 들 어 http, https, ws 등 입 니 다.사용자 정의 scheme 은 보통 이 url 의 행동 을 표시 하 는 데 사 용 됩 니 다. 예 를 들 어 app 개발 에 서 는 url scheme 을 사용 하여 페이지 를 뛰 어 넘 습 니 다.
    LoadBalancerClient Filter
    이 Filter 는 Ribbon 을 통합 하 는 데 사 용 됩 니 다. 그 핵심 은 scheme 을 lb 로 하 는 url 을 분석 하여 마이크로 서비스의 이름 을 얻 은 다음 Ribbon 을 통 해 실제 호출 주 소 를 가 져 오 는 것 입 니 다.
    들 어 오 라 고 요청 할 때 LoadBalancerClient Filter 는 exchange 의 속성 인 ServerWebExchange Utils. GATEWAY URL 을 봅 니 다.REQUEST_URL_ATTR 의 값, 이 url 의 scheme 이 lb 라면 (예: lb: / my service), 이 Filter 는 Spring Cloud 의 LoadBalancer Client 를 사용 하여 my 서 비 스 를 실제 host 와 port 로 해석 하고 원래 ServerWebExchange Utils. GATEWAY 를 교체 합 니 다.REQUEST_URL_ATTR 속성의 값 입 니 다.원본 url 은 ServerWebExchange Utils. GATEWAY 에 추 가 됩 니 다.ORIGINAL_REQUEST_URL_ATTR 속성 중.이 필 터 는 ServerWebExchange Utils. GATEWAY 도 볼 수 있 습 니 다.SCHEME_PREFIX_ATTR 속성 은 해당 속성의 값 이 lb 인 것 을 발견 하면 같은 논 리 를 수행 하기 도 한다.
    예제 설정:
    spring:
      cloud:
        gateway:
          routes:
          - id: myRoute
            uri: lb://service
            predicates:
            - Path=/service/**

    기본 적 인 상황 에서 LoadBalancer 를 통 해 지정 한 서비스의 인 스 턴 스 를 찾 을 수 없다 면 503 을 되 돌려 줍 니 다 (예 를 들 어 LoadBalancer 가 service 라 는 인 스 턴 스 를 찾 지 못 하면 503 을 되 돌려 줍 니 다).설정 사용 가능: spring. cloud. gateway. loadbancer. use 404 = true, 404 로 되 돌려 줍 니 다.LoadBalancer 가 돌아 온 ServiceInstance 의 isSecure 값 은 요청 한 scheme 을 덮어 씁 니 다.예 를 들 어 게 이 트 웨 이에 요청 한 것 이 HTTPS 이지 만 ServiceInstance 의 isSecure 가 false 라면 하류 마이크로 서비스 가 받 은 것 은 HTTP 요청 이 고 반대로 도 마찬가지 입 니 다.또한 이 경로 가 GATEWAY 를 지정 하면SCHEME_PREFIX_ATTR 속성 은 접두사 가 벗 겨 지고 URL 의 scheme 에서 ServiceInstance 설정 을 덮어 씁 니 다.
    Netty Routing Filter
    들 어 오 라 고 요청 하면 Netty Routing Filter 에서 URL 을 확인 합 니 다. 이 URL 은 exchange 의 속성 입 니 다. ServerWebExchange Utils. GATEWAYREQUEST_URL_ATTR 의 값 입 니 다. 이 url 의 scheme 이 http 또는 https 라면 이 Filter 는 Netty 의 HttpClient 를 사용 하여 하위 서비스 에 프 록 시 요청 을 보 냅 니 다.받 은 응답 은 exchange 의 ServerWebExchange Utils. CLIENT 에 놓 입 니 다.RESPONSE_ATTR 속성 중 뒤쪽 Filter 에서 사용 할 수 있 습 니 다.(실험 적 인 필터 가 있 습 니 다: WebClient HttpRouting Filter 는 같은 기능 을 수행 할 수 있 지만 Netty 는 필요 없습니다)
    Netty Write Response Filter
    Netty Write ResponseFilter 는 프 록 시 응답 을 게 이 트 웨 이 클 라 이언 트 측 에 다시 쓰 는 데 사용 되 기 때문에 이 필 터 는 모든 다른 필터 가 실 행 된 후에 실 행 됩 니 다. 또한 실행 조건 은 exchange 에서 ServerWebExchange Utils. CLIENT 입 니 다.RESPONSE_CONN_ATTR 속성의 값 은 비어 있 지 않 으 며, 이 값 은 Netty 의 Connection 인 스 턴 스 입 니 다.(실험 적 인 필터 가 있 습 니 다: WebClient Write ResponseFilter 는 같은 기능 을 수행 할 수 있 지만 Netty 는 필요 없습니다)
    RouteToRequestUrl Filter
    이 필 터 는 request 에서 가 져 온 원본 url 을 Gateway 로 변환 하여 전송 을 요청 할 때 사용 하 는 url 입 니 다.요청 이 들 어 오 면 RouteToRequestUrl Filter 는 exchange 에서 ServerWebExchange Utils. GATEWAY 를 가 져 옵 니 다.ROUTE_ATTR 속성의 값, 이 값 은 Route 대상 입 니 다.대상 이 비어 있 지 않 으 면 RouteToRequestUrlFilter 는 요청 URL 및 Route 대상 의 URL 을 기반 으로 새 URL 을 만 듭 니 다.새 URL 은 exchange 의 ServerWebExchange Utils. GATEWAYREQUEST_URL_ATTR 속성 중.만약 URL 에 scheme 접두사 가 있다 면, 예 를 들 어 lb: ws: / 서비스 id, 이 lb scheme 는 URL 에서 분리 되 어 ServerWebExchange Utils. GATEWAYSCHEME_PREFIX_ATTR 에 서 는 뒤의 필 터 를 사용 하기에 편리 합 니 다.
    Websocket Routing Filter
    이 필 터 는 Netty Routing Filter 와 유사 합 니 다.들 어 오 라 고 요청 하면 WebsocketRouting Filter 에서 URL 을 볼 수 있 습 니 다. 이 URL 은 exchange 의 ServerWebExchange Utils. GATEWAY 입 니 다.REQUEST_URL_ATTR 속성의 값 입 니 다. 이 url 의 scheme 이 ws 나 ws 라면 이 Filter 는 Spring Web Socket 을 사용 하여 Websocket 을 하류 로 전송 할 것 입 니 다.또한, Websocket 이 부하 균형 을 요청 하면 URL 에 lb 접 두 사 를 추가 하여 부하 균형 을 이 룰 수 있 습 니 다. 예 를 들 어 lb: ws: / serviceid.
    예제 설정:
    spring:
      cloud:
        gateway:
          routes:
          # SockJS route
          - id: websocket_sockjs_route
            uri: http://localhost:3001
            predicates:
            - Path=/websocket/info/**
          # Normwal Websocket route
          - id: websocket_route
            uri: ws://localhost:3001
            predicates:
            - Path=/websocket/**

    Gateway Metrics Filter
    Gateway Metrics Filter 를 사용 하려 면 프로젝트 에 spring - boot - starter - actuator 의존 도 를 추가 한 다음 설정 파일 에 spring. cloud. gateway. metrics. enabled 값 을 true 로 설정 해 야 합 니 다.이 필 터 는 gateway. requests 라 는 순서 도량 (timer metric) 을 추가 합 니 다. 다음 표 시 를 포함 합 니 다.
  • routeId: 경로 ID
  • routeUri: API 가 경로 가 도착 하 는 URI
  • outcome: HttpStatus. Series 분류
  • status: 클 라 이언 트 에 게 돌아 온 Http Status
  • httpStatusCode: 클 라 이언 트 에 게 요청 한 Http Status
  • 를 되 돌려 줍 니 다.
  • httpMethod: 사용 할 Http 방법 을 요청 합 니 다. 이 지 표 는 / actuator / metrics / gateway. requests 터미널 에 노출 되 고 Prometheus 와 쉽게 통합 되 어 Grafana dashboard 를 만 들 수 있 습 니 다.

  • PS: Prometheus 는 모니터링 도구 이 고 Grafana 는 모니터링 시각 화 도구 입 니 다.Spring Boot Actuator 는 이 두 가지 도구 와 통합 할 수 있 습 니 다.
    Marking An Exchange As Routed
    전체 필터 체인 을 요청 한 후 하위 로 전송 요청 을 담당 하 는 필 터 는 exchange 에 gateway Already Routed 속성 을 추가 하여 exchange 를 routed (경로 가 있 음) 로 표시 합 니 다.요청 이 routed 로 표시 되면 다른 경로 필 터 는 이 요청 을 다시 건 너 뛰 지 않 고 건 너 뜁 니 다.상기 모든 내 장 된 전역 필 터 를 알 게 된 후, 우 리 는 서로 다른 프로 토 콜 의 요청 이 서로 다른 필터 에서 하류 로 전 송 될 것 이라는 것 을 알 게 되 었 다.따라서 이 gateway Already Routed 속성 을 추가 하 는 필 터 는 최종 적 으로 퍼 가기 요청 을 담당 하 는 필터 입 니 다.
  • http, https 요청 은 NettyRouting Filter 또는 WebClient HttpRouting Filter 에서 이 속성 을 추가 합 니 다
  • forward 요청 은 Forward Routing Filter 에서 이 속성 을 추가 합 니 다
  • 웹 소켓 요청 은 웹 소켓 Routing Filter 에서 이 속성 을 추가 합 니 다. 이 필 터 는 다음 과 같은 방법 으로 exchange 를 routed 로 표시 하거나 exchange 가 routed 인지 확인 합 니 다.
  • ServerWebExchange Utils. isAlreadyRouted: exchange 가 routed 상태 인지 확인
  • ServerWebExchange Utils. setAlready Routed: exchange 를 routed 상태 로 설정 합 니 다. 쉽게 말 하면 Gateway 는 gateway Already Routed 속성 을 통 해 이 요청 이 전송 되 었 음 을 표시 합 니 다. 다른 필터 가 반복 되 지 않 아 도 되 며 중복 되 는 경로 가 전송 되 는 것 을 방지 합 니 다.

  • 이 전역 필 터 는 모두 대응 하 는 설정 클래스 가 있 습 니 다. 관심 이 있 으 면 관련 소스 코드 를 볼 수 있 습 니 다.
  • org.springframework.cloud.gateway.config.GatewayAutoConfiguration
  • org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration
  • org.springframework.cloud.gateway.config.GatewayLoadBalancerClientAutoConfiguration
  • 좋은 웹페이지 즐겨찾기