Spring Cloud gateway 三 自定義過濾器GatewayFilter

  • 2019 年 11 月 8 日
  • 筆記

之前zuul 網關介紹。他有過濾器周期是四種,也是四種類型的過濾器。而gateway 只有倆種過濾器:「pre」 和 「post」。

  • PRE: 這種過濾器在請求被路由之前調用。
  • POST:這種過濾器在路由到微服務以後執行。

這倆種過濾器是不是很熟悉。其實和zuul的過濾器很像。

但是gateway 過濾器又可以分為倆種。GatewayFilter 與 GlobalFilter。

  • GlobalFilter 全局過濾器
  • GatewayFilter 將應用到單個路由或者一個分組的路由上。

還有內置的過濾器斷言機制。在上一篇已經做過介紹。本篇就不在介紹。

同樣全局過濾器也在上一篇列舉了全局過濾器的一種寫法,有興趣的同學可以回過頭看一下。

自定義過濾器

創建ServerGatewayFilter 類

package com.xian.cloud.filter;    import lombok.extern.slf4j.Slf4j;  import org.springframework.cloud.gateway.filter.GatewayFilter;  import org.springframework.cloud.gateway.filter.GatewayFilterChain;  import org.springframework.core.Ordered;  import org.springframework.web.server.ServerWebExchange;  import reactor.core.publisher.Mono;    /**   * <Description>   *   * @author [email protected]   * @version 1.0   * @createDate 2019/11/07 17:34   */  @Slf4j  public class ServerGatewayFilter implements GatewayFilter, Ordered {        @Override      public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {          log.info("ServerGatewayFilter filter ");          return chain.filter( exchange );      }      @Override      public int getOrder() {          return 0;      }  }

創建 GatewayRoutesConfiguration

package com.xian.cloud.filter;    import lombok.extern.slf4j.Slf4j;  import org.springframework.cloud.gateway.route.RouteLocator;  import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;  import org.springframework.context.annotation.Bean;  import org.springframework.context.annotation.Configuration;    /**   * <Description>   *   * @author [email protected]   * @version 1.0   * @createDate 2019/11/08 09:45   */  @Configuration  @Slf4j  public class GatewayRoutesConfiguration {      /**       * java 配置 server 服務路由       * @param builder       * @return       */      @Bean      public RouteLocator routeLocator(RouteLocatorBuilder builder) {          log.info("ServerGatewayFilter filtet........");          return builder.routes()                  .route(r ->                          r.path("/server/**")                                  .filters(                                          f -> f.stripPrefix(1)                                                  .filters(new ServerGatewayFilter())                                  )                                  .uri("lb://cloud-discovery-server")                  )                  .build();      }  }

啟動服務
gateway 服務日誌列印

[2019-11-08 11:07:17.357] [] [] [] [] [INFO ] com.xian.cloud.filter.GatewayRoutesConfiguration - ServerGatewayFilter filtet........

命令行 curl http://localhost:9000/server/server/hello?name=tom 返回 hello tom age = 20

日誌列印

[2019-11-08 11:08:09.966] [] [] [] [] [INFO ] com.xian.cloud.filter.AuthorizeFilter - AuthorizeFilter token 全局過濾器 token:null,uid:null  [2019-11-08 11:08:09.970] [] [] [] [] [INFO ] com.xian.cloud.filter.ServerGatewayFilter - ServerGatewayFilter filter 

我們看到日誌已經列印我們想看到的日誌。

優先順序

java配置方式與yml文件配置。java配置優先順序更高。親測

整理 斷言 和 自定義過濾器

  • 斷言 其實斷言的作用是不是要將請求路由到服務上,是不是符合條件。就像玩過山車危險遊戲一樣,會有年齡,體重、病史的一些限制。
  • 過濾器 就還是過山車的案例,你符合了條件。那麼好,我要給你帶上安全帶等一些安全保護措施,才能讓你真正的玩耍。道理是相同的。

gateway 的斷言和過濾器提供如此豐富的內置斷言和過濾器。讓我們有非常豐富的組合模式,應對我們實際開發的場景。還可以根據具體的場景做一些特殊處理。

2.2.X版本 gateway 增加了類似於註冊中心的元數據。在gateway 配置一下元數據。帶著數據請求到下游服務。有興趣的同學可以去官網查看官方文檔。

如何喜歡可以關注分享本公眾號。
file

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。轉載請附帶公眾號二維碼