봄 클라우드 알리바바 연구 노트 (20) - 봄 클라우드 게이트웨이에 내장 된 글로벌 필터

참조 : HTTPS : //cloud.spring.io/spring-cloud-static/Greenwich.SR2/single/spring-cloud.html#_global_filters

글로벌 필터 효과
결합 된 글로벌 필터 GatewayFilter 주문 실행 순서 필터를 정렬하려면
앞으로 라우팅 필터 전달을위한 지역, 즉 요청이 하류 서비스 대신 포워딩 게이트웨이 서비스 내 전달
LoadBalancerClient 필터 통합 리본로드 밸런싱
의 Netty 라우팅 필터 HttpClient를의의 Netty 사용은 HTTP, HTTPS 요청을 전달
의 Netty 쓰기 응답 필터 다시 게이트웨이 프록시 클라이언트 측에 쓰기에 대한 응답
RouteToRequestUrl 필터 게이트웨이 URL 취득 요구에 일본어 변환 요청 URL을 전달하는 데 사용되는
웹 소켓 라우팅 필터 사용 봄 웹 소켓 요청 웹 소켓을 전달
게이트웨이 메트릭 필터 모니터링 기능의 통합 모니터링 지표를 제공
라우팅으로 교환 마킹 중복 라우팅 및 전달을 방지

결합 된 글로벌 필터 GatewayFilter 주문

게이트웨이가 요청을 수신하면, 웹 필터링 처리기 프로세서 모든 GlobalFilter의 인스턴스 및 모든 구성 라우팅 GatewayFilter의 필터 체인 인스턴스. 필터에있어서, 필터 체인의 모든 것 org.springframework.core.Ordered 정렬 특수 번호 지정된 크기.
스프링 클라우드 게이트웨이 그래서 높은 우선 순위가 "사전"단계에서 제 필터를 실행한다 "전"과 "후"위상 필터 로직을 실행, 구별은 "포스트"단계의 마지막 필터의 우선 순위가 가장 낮은 실행.

  • 숫자가 낮을수록 앞으로 수행

샘플 코드 :

@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

앞으로 라우팅 필터

요청이 들어 오면, ForwardRoutingFilter이 URL을, 교환 속성에 대한 URL 볼 것 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR의 계획이 URL 인 경우, 값을 전달 (예 : 정 : // localendpoint), 다음 필터의 Spirngd 사용됩니다 DispatcherHandler을 이 처리 할 요청. 요청 URL 경로의 일부는, 경로는 앞으로 URL에 덮어 쓰기됩니다. 그러나이 추가됩니다, 원래의 URL을 수정하지 ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR의 속성입니다.

PS : 소위 URL 방식 등등 단순히 HTTP, HTTPS와 같은 URL 프로토콜의 일부, WS이다. 사용자 정의 방식은 일반적으로 일반적으로 페이지 URL 방식을 이동하는 데 사용하는 등 응용 프로그램 개발자로, 행동의 URL을 식별하는 데 사용됩니다

LoadBalancerClient 필터

필터는 리본을 통합하는 데 사용되는 코어는 마이크로 서비스의 이름을 얻을하고 리본을 통해 호출의 실제 주소를 얻기 위해, 계획이 URL의 lb를하다 구문 분석하는 것입니다.

요청이 들어 오면, LoadBalancerClientFilter는 URL을,의 재산 교환을위한 URL 볼 것 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR의 계획이 URL 인 경우, 값을 LB , 다음 필터의 봄 클라우드 사용 (: 파운드 // MYSERVICE 예를 들어), LoadBalancerClient 받는 사람 MYSERVICE 실제 호스트 및 포트에 해결하고 원래 교체 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR의 속성을. 원래는 URL에 추가됩니다 ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR의 속성입니다. 필터는 또한 볼 ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR의 속성을 속성 값이 발견되면 LB가 동일한 로직을 수행 할 것이다.

샘플 구성 :

spring:
  cloud:
    gateway:
      routes:
      - id: myRoute
        uri: lb://service
        predicates:
        - Path=/service/**

로하지 않을 경우 기본적으로 로드 밸런서 지정된 서비스 인스턴스를 찾을 수는 503합니다 (경우, 예를 들어 위의 구성으로 돌아갑니다 로드 밸런서가 : 구성을 사용합니다 명명 된 인스턴스 서비스를 찾을 수 없습니다, 그것은 503를 반환) spring.cloud.gateway를 = 사실 .loadbalancer.use404로 , 404로 복귀 할 수 있었다.
로드 밸런서는 반환 ServiceInstance을isSecure를의 값 재정의 요청 방식. 예를 들어, 요청이 HTTPS를 사용하여 게이트웨이에 히트 인 경우 만 ServiceInstance 대해 isSecure는 다음 하류 마이크로 서비스를 수신 HTTP 요청 거짓이고, 그 반대의 경우도 마찬가지입니다. 경로가 지정된 경우 또한, GATEWAY_SCHEME_PREFIX_ATTR의 속성을 접두사가 제거되고, 라우팅 방식의 URL이 포함됩니다 ServiceInstance의 구성.

의 Netty 라우팅 필터

요청이 들어 오면, NettyRoutingFilter는 재산의 교환하는 URL, 볼 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR의 계획이 URL의 경우, 값을 HTTP 또는 HTTPS 다음 필터 인 Netty의 사용 HttpClient를을 다운 스트림 서비스에 대한 프록시 요청을 보낼 수 있습니다. 의 교환에 대한 응답으로 획득 ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR의 필터에서 나중에 사용하기 위해 속성. (실험 필터로 : WebClientHttpRoutingFilter는 동일한 기능을 수행하지만, 필요 수의 Netty)

의 Netty 쓰기 응답 필터

NettyWriteResponseFilter 되돌림 게이트웨이 프록시 응답이 상기 필터의 실행은 모든 다른 필터 완료 후에 실행될 것이며, 교환 조건에서 수행되도록, 클라이언트 측 ServerWebExchangeUtils.CLIENT_RESPONSE_CONN_ATTR의 속성 값이 비어 있지 않은 값 의 Netty의 연결 인스턴스입니다. (실험 필터로 : WebClientWriteResponseFilter는 동일한 기능을 수행하지만, 필요 수의 Netty)

RouteToRequestUrl 필터

게이트웨이에서 사용되는 URL 필터로부터 원래 요청은 사용되는 전송 요청 URL로 획득 될 수있다. 요청이 들어 오면 RouteToRequestUrlFilter가 교환으로부터 획득 ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR의 속성의 값을, 값 A는 루트 오브젝트. 객체가 비어 있지 않으면, 다음, RouteToRequestUrlFilter는 요청 URL과 기반으로합니다 경로 URL에 새로운 URL 객체를 만들 수 있습니다. 새로운 URL은 교환 배치됩니다 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR의 속성을.
접두사 방식, 예를 들어,와 URL 경우 WS : LB // servicelDLB의 URL에서 제거 방식과 배치 ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR는 , 그 뒤에 필터를 사용하는 것이 편리하다.

웹 소켓 라우팅 필터

필터의 역할 NettyRoutingFilter 유사합니다. 요청이 들어 오면, WebsocketRoutingFilter가 교환되는 URL, 볼 것이다 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR의 계획이 URL의 경우, 속성의 값 WS 또는 WSS를 한 후 사용 봄 웹 소켓 필터 웹 소켓은 하류에 요청을 전달합니다.
요청이 웹 소켓 부하 분산을 필요로하는 경우 또한, 당신은 예를 들어,로드 밸런싱을 LB하기 위해 URL에 접두사를 추가 할 수 있습니다 LB : WS를 : // 서비스 id .

샘플 구성 :

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/**

게이트웨이 메트릭 필터

게이트웨이 메트릭 필터를 사용하려면,에서 프로젝트에 추가 할 스프링 부팅 스타터 액추에이터 다음 구성 파일의 구성, 의존성 spring.cloud.gateway.metrics.enabled는 사실이다. 이 필터는 이름이 추가됩니다 gateway.requests 다음과 같은 태그가 포함 메트릭 (타이머 메트릭을) 타이밍을 :

  • routeId : 라우팅 ID
  • routeUri : API는 URI로 라우팅됩니다
  • 결과 : HttpStatus.Series 정렬
  • 상태 : HTTP 현상은 클라이언트에 반환
  • httpStatusCode : 요청하는 클라이언트의 HTTP 상태로 돌아
  • httpMethod : HTTP를 사용하여 요청에있어서
    노출이 지표 /actuator/metrics/gateway.requests 종료점을 쉽게 Grafana 대시 보드를 만들 메테우스와 통합 될 수있다.

PS : 프로 메테우스는 모니터링 도구, Grafana 시각적 모니터링 도구입니다, 봄 부팅 액추에이터는이 두 가지 도구와 통합 할 수 있습니다.

라우팅으로 교환 마킹

완전한 스트립 다운 요청 필터 체인은 교환을 추가 할 필터의 하류에 상기 요청을 전달하는 책임되면 gatewayAlreadyRouted의 교환이 분류되도록 같은 속성 라우트 (라우팅). 요청이로 표시되면 라우팅 된 다른 라우팅 필터 다시 경로 요청을하지 않습니다,하지만 건너 뜁니다.
위의 이해 모든 내장 전역 필터, 우리는 요청이 다운 스트림 다른 필터의 다른 프로토콜에 의해 전달 될 것이라는 점을 알고있다. 그것은이 추가 책임 gatewayAlreadyRouted의 속성을 필터 필터 요청을 전달하는 궁극적 책임이있다 :

  • 바이 HTTP, HTTPS 요청 NettyRoutingFilter 또는 WebClientHttpRoutingFilter는 이 속성을 추가
  • 바이 앞으로 요청 ForwardRoutingFilter는 이 속성을 추가
  • 바이 웹 소켓 요청 WebsocketRoutingFilter는 이 속성을 추가
    이러한 필터 교환하는 방법을 전화로 표시된 라우트 , 또는 교환 여부를 확인하는 것입니다 라우트 :
  • ServerWebExchangeUtils.isAlreadyRouted : 교환 상태가 라우팅 여부를 확인
  • ServerWebExchangeUtils.setAlreadyRouted : 교환 상태로 라우팅
    게이트웨이, 단순히 것은 gatewayAlreadyRouted가 추가 필터함으로써 전달 특성을 라우팅 중복을 방지 경로를 중복하지 않고, 통과이 발송 요청을 나타냅니다.

이 필터는 해당 전역 구성 클래스가, 소스 코드를 볼 수 있습니다 관심이 :

  • org.springframework.cloud.gateway.config.GatewayAutoConfiguration
  • org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration
  • org.springframework.cloud.gateway.config.GatewayLoadBalancerClientAutoConfiguration

추천

출처www.cnblogs.com/fx-blog/p/11752657.html