最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解SpringCloud Gateway之過濾器GatewayFilter

 更新時(shí)間:2018年10月16日 15:14:42   作者:Mr_1214  
這篇文章主要介紹了詳解SpringCloud Gateway之過濾器GatewayFilter,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

在Spring-Cloud-Gateway之請求處理流程文中我們了解最終網(wǎng)關(guān)是將請求交給過濾器鏈表進(jìn)行處理,接下來我們閱讀Spring-Cloud-Gateway的整個(gè)過濾器類結(jié)構(gòu)以及主要功能

通過源碼可以看到Spring-Cloud-Gateway的filter包中吉接口有如下三個(gè),GatewayFilter,GlobalFilter,GatewayFilterChain,下來我依次閱讀接口的主要實(shí)現(xiàn)功能。

GatewayFilterChain

類圖


代碼

/**
 * 網(wǎng)關(guān)過濾鏈表接口
 * 用于過濾器的鏈?zhǔn)秸{(diào)用
 * Contract to allow a {@link WebFilter} to delegate to the next in the chain.
 *
 * @author Rossen Stoyanchev
 * @since 5.0
 */
public interface GatewayFilterChain {

  /**
   * 鏈表啟動(dòng)調(diào)用入口方法
   * Delegate to the next {@code WebFilter} in the chain.
   * @param exchange the current server exchange
   * @return {@code Mono<Void>} to indicate when request handling is complete
   */
  Mono<Void> filter(ServerWebExchange exchange);

}
  /**
   * 網(wǎng)關(guān)過濾的鏈表,用于過濾器的鏈?zhǔn)秸{(diào)用
   * 過濾器鏈表接口的默認(rèn)實(shí)現(xiàn),
   * 包含2個(gè)構(gòu)建函數(shù):
   * 1.集合參數(shù)構(gòu)建用于初始化吧構(gòu)建鏈表
   * 2. index,parent參數(shù)用于構(gòu)建當(dāng)前執(zhí)行過濾對(duì)應(yīng)的下次執(zhí)行的鏈表 
   */
  private static class DefaultGatewayFilterChain implements GatewayFilterChain {

    /**
     * 當(dāng)前過濾執(zhí)行過濾器在集合中索引
     */
    private final int index;
    /**
     * 過濾器集合
     */
    private final List<GatewayFilter> filters;

    public DefaultGatewayFilterChain(List<GatewayFilter> filters) {
      this.filters = filters;
      this.index = 0;
    }

    /**
     * 構(gòu)建
     * @param parent 上一個(gè)執(zhí)行過濾器對(duì)應(yīng)的FilterChain
     * @param index 當(dāng)前要執(zhí)行過濾器的索引
     */
    private DefaultGatewayFilterChain(DefaultGatewayFilterChain parent, int index) {
      this.filters = parent.getFilters();
      this.index = index;
    }

    public List<GatewayFilter> getFilters() {
      return filters;
    }

    /**
     * @param exchange the current server exchange
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange) {
      return Mono.defer(() -> {
        if (this.index < filters.size()) {
          //獲取當(dāng)前索引的過濾器
          GatewayFilter filter = filters.get(this.index);
          //構(gòu)建當(dāng)前索引的下一個(gè)過濾器的FilterChain
          DefaultGatewayFilterChain chain = new DefaultGatewayFilterChain(this, this.index + 1);
          //調(diào)用過濾器的filter方法執(zhí)行過濾器
          return filter.filter(exchange, chain);
        } else {
          //當(dāng)前索引大于等于過濾集合大小,標(biāo)識(shí)所有鏈表都已執(zhí)行完畢,返回空
          return Mono.empty(); // complete
        }
      });
    }
  }

過濾器的GatewayFilterChain 執(zhí)行順序

  1. 通過GatewayFilter集合構(gòu)建頂層的GatewayFilterChain
  2. 調(diào)用頂層GatewayFilterChain,獲取第一個(gè)Filter,并創(chuàng)建下一個(gè)Filter索引對(duì)應(yīng)的GatewayFilterChain
  3. 調(diào)用filter的filter方法執(zhí)行當(dāng)前filter,并將下次要執(zhí)行的filter對(duì)應(yīng)GatewayFilterChain傳入。

GatewayFilter

類圖

/**
 * 網(wǎng)關(guān)路由過濾器,
 * Contract for interception-style, chained processing of Web requests that may
 * be used to implement cross-cutting, application-agnostic requirements such
 * as security, timeouts, and others. Specific to a Gateway
 *
 * Copied from WebFilter
 *
 * @author Rossen Stoyanchev
 * @since 5.0
 */
public interface GatewayFilter extends ShortcutConfigurable {

  String NAME_KEY = "name";
  String VALUE_KEY = "value";

  /**
   * 過濾器執(zhí)行方法
   * Process the Web request and (optionally) delegate to the next
   * {@code WebFilter} through the given {@link GatewayFilterChain}.
   * @param exchange the current server exchange
   * @param chain provides a way to delegate to the next filter
   * @return {@code Mono<Void>} to indicate when request processing is complete
   */
  Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);

}

網(wǎng)關(guān)過濾器接口,有且只有一個(gè)方法filter,執(zhí)行當(dāng)前過濾器,并在此方法中決定過濾器鏈表是否繼續(xù)往下執(zhí)行,接下來我們看下幾個(gè)主要的功能實(shí)現(xiàn)類

OrderedGatewayFilter

/**
 * 排序的網(wǎng)關(guān)路由過濾器,用于包裝真實(shí)的網(wǎng)關(guān)過濾器,已達(dá)到過濾器可排序
 * @author Spencer Gibb
 */
public class OrderedGatewayFilter implements GatewayFilter, Ordered {

  //目標(biāo)過濾器
  private final GatewayFilter delegate;
  //排序字段
  private final int order;

  public OrderedGatewayFilter(GatewayFilter delegate, int order) {
    this.delegate = delegate;
    this.order = order;
  }

  @Override
  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    return this.delegate.filter(exchange, chain);
  }
}  

OrderedGatewayFilter實(shí)現(xiàn)類主要目的是為了將目標(biāo)過濾器包裝成可排序的對(duì)象類型。是目標(biāo)過濾器的包裝類

GatewayFilterAdapter

  /**
   * 全局過濾器的包裝類,將全局路由包裝成統(tǒng)一的網(wǎng)關(guān)過濾器
   */
  private static class GatewayFilterAdapter implements GatewayFilter {

    /**
     * 全局過濾器
     */
    private final GlobalFilter delegate;

    public GatewayFilterAdapter(GlobalFilter delegate) {
      this.delegate = delegate;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
      return this.delegate.filter(exchange, chain);
    }
  }

GatewayFilterAdapter實(shí)現(xiàn)類主要目的是為了將GlobalFilter過濾器包裝成GatewayFilter類型的對(duì)應(yīng)。是GlobalFilter過濾器的包裝類

GlobalFilter

GlobalFilter 為請求業(yè)務(wù)以及路由的URI轉(zhuǎn)換為真實(shí)業(yè)務(wù)服務(wù)的請求地址的核心過濾器,不需要配置,模式系統(tǒng)初始化時(shí)加載,并作用在每個(gè)路由上。

初始化加載,通過GatewayAutoConfiguration自動(dòng)創(chuàng)建

GatewayAutoConfiguration 類

    /**
     * 全局過濾器,用戶通過HttpClient轉(zhuǎn)發(fā)請求
     * @param httpClient
     * @param headersFilters
     * @return
     */
    @Bean
    public NettyRoutingFilter routingFilter(HttpClient httpClient,
                        ObjectProvider<List<HttpHeadersFilter>> headersFilters) {
      return new NettyRoutingFilter(httpClient, headersFilters);
    }

    /**
     * 全局的過濾器,用戶將HttpClient客戶端轉(zhuǎn)發(fā)請求的響應(yīng)寫入到原始的請求響應(yīng)中
     * @param properties
     * @return
     */
    @Bean
    public NettyWriteResponseFilter nettyWriteResponseFilter(GatewayProperties properties) {
      return new NettyWriteResponseFilter(properties.getStreamingMediaTypes());
    }

GatewayLoadBalancerClientAutoConfiguration 類

  /**
   * 全局過濾器,用于在通過負(fù)載均衡客戶端選擇服務(wù)實(shí)例信息
   * @param client
   * @return
   */
  @Bean
  @ConditionalOnBean(LoadBalancerClient.class)
  public LoadBalancerClientFilter loadBalancerClientFilter(LoadBalancerClient client) {
    return new LoadBalancerClientFilter(client);
  }

GlobalFilter轉(zhuǎn)換成GatewayFilter,并作用于每個(gè)路由上,在FilteringWebHandler實(shí)現(xiàn)

FilteringWebHandler類

  /**
   * 包裝加載全局的過濾器,將全局過濾器包裝成GatewayFilter
   * @param filters
   * @return
   */
  private static List<GatewayFilter> loadFilters(List<GlobalFilter> filters) {
    return filters.stream()
        .map(filter -> {
          //將所有的全局過濾器包裝成網(wǎng)關(guān)過濾器
          GatewayFilterAdapter gatewayFilter = new GatewayFilterAdapter(filter);
          //判斷全局過濾器是否實(shí)現(xiàn)了可排序接口
          if (filter instanceof Ordered) {
            int order = ((Ordered) filter).getOrder();
            //包裝成可排序的網(wǎng)關(guān)過濾器
            return new OrderedGatewayFilter(gatewayFilter, order);
          }
          return gatewayFilter;
        }).collect(Collectors.toList());
  }
  @Override
  public Mono<Void> handle(ServerWebExchange exchange) {
    //獲取請求上下文設(shè)置的路由實(shí)例
    Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
    //獲取路由定義下的網(wǎng)關(guān)過濾器集合
    List<GatewayFilter> gatewayFilters = route.getFilters();

    //組合全局的過濾器與路由配置的過濾器
    List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
    //添加路由配置過濾器到集合尾部
    combined.addAll(gatewayFilters);
    //對(duì)過濾器進(jìn)行排序
    //TODO: needed or cached?
    AnnotationAwareOrderComparator.sort(combined);

    logger.debug("Sorted gatewayFilterFactories: "+ combined);
    //創(chuàng)建過濾器鏈表對(duì)其進(jìn)行鏈?zhǔn)秸{(diào)用
    return new DefaultGatewayFilterChain(combined).filter(exchange);
  }

loadFilters方法是將全局路由使用GatewayFilterAdapter包裝成GatewayFilter

handle方法

  • 獲取當(dāng)前請求使用的路由Route
  • 獲取路由配置的過濾器集合route.getFilters()
  • 合并全過濾器與路由配置過濾器combined
  • 對(duì)過濾器排序AnnotationAwareOrderComparator.sort
  • 通過過濾器集合構(gòu)建頂級(jí)鏈表DefaultGatewayFilterChain,并對(duì)其當(dāng)前請求調(diào)用鏈表的filter方法。

==備注==:

Spring-Cloud-Gateway的過濾器接口分為兩種:

  • GlobalFilter : 全局過濾器,不需要在配置文件中配置,作用在所有的路由上,最終通過GatewayFilterAdapter包裝成GatewayFilterChain可識(shí)別的過濾器
  • GatewayFilter : 需要通過spring.cloud.routes.filters 配置在具體路由下,只作用在當(dāng)前路由上或通過spring.cloud.default-filters配置在全局,作用在所有路由上

至此,網(wǎng)關(guān)過濾器的整個(gè)結(jié)構(gòu)以及加載使用流程源碼已經(jīng)閱讀完畢,下篇重點(diǎn)學(xué)習(xí)下路由配置的過濾器加載創(chuàng)建流程

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中BigDecimal的介紹及使用教程BigDecimal格式化及BigDecimal常見問題

    java中BigDecimal的介紹及使用教程BigDecimal格式化及BigDecimal常見問題

    BigDecimal是Java在java.math包中提供的線程安全的API類,用來對(duì)超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算,這篇文章主要介紹了java中BigDecimal的介紹及使用,BigDecimal格式化,BigDecimal常見問題,需要的朋友可以參考下
    2023-08-08
  • java文字轉(zhuǎn)語音播報(bào)功能的實(shí)現(xiàn)方法

    java文字轉(zhuǎn)語音播報(bào)功能的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于java文字轉(zhuǎn)語音播報(bào)功能的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 淺析scala中map與flatMap的區(qū)別

    淺析scala中map與flatMap的區(qū)別

    這篇文章主要介紹了淺析scala中map與flatMap的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 一文帶你全面了解Java?Hashtable

    一文帶你全面了解Java?Hashtable

    HashTable是jdk?1.0中引入的產(chǎn)物,基本上現(xiàn)在很少使用了,但是會(huì)在面試中經(jīng)常被問到。本文就來帶大家一起深入了解一下Hashtable,需要的可以參考一下
    2022-09-09
  • Java如何讀取配置文件并賦值靜態(tài)變量

    Java如何讀取配置文件并賦值靜態(tài)變量

    這篇文章主要介紹了Java如何讀取配置文件并賦值靜態(tài)變量,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 學(xué)習(xí)Java之如何正確地跳出循環(huán)結(jié)構(gòu)

    學(xué)習(xí)Java之如何正確地跳出循環(huán)結(jié)構(gòu)

    我們在利用循環(huán)執(zhí)行重復(fù)操作的過程中,存在著一個(gè)需求:如何中止,或者說提前結(jié)束一個(gè)循環(huán),所以就給大家講解一下,如何在java代碼中返回一個(gè)結(jié)果,如何結(jié)束和跳出一個(gè)循環(huán),需要的朋友可以參考下
    2023-05-05
  • 深入解析Java中的編碼轉(zhuǎn)換以及編碼和解碼操作

    深入解析Java中的編碼轉(zhuǎn)換以及編碼和解碼操作

    這篇文章主要介紹了Java中的編碼轉(zhuǎn)換以及編碼和解碼操作,文中詳細(xì)解讀了編碼解碼的相關(guān)IO操作以及內(nèi)存使用方面的知識(shí),需要的朋友可以參考下
    2016-02-02
  • 輕松掌握J(rèn)ava橋接模式

    輕松掌握J(rèn)ava橋接模式

    這篇文章主要幫助大家輕松掌握J(rèn)ava橋接模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java圖片與二進(jìn)制相互轉(zhuǎn)換實(shí)現(xiàn)示例講解

    Java圖片與二進(jìn)制相互轉(zhuǎn)換實(shí)現(xiàn)示例講解

    這篇文章主要介紹了Java圖片與二進(jìn)制相互轉(zhuǎn)換實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03
  • java稀疏數(shù)組的示例代碼

    java稀疏數(shù)組的示例代碼

    這篇文章主要介紹了java稀疏數(shù)組,稀疏數(shù)組,記錄一共有幾行幾列,有多少個(gè)不同值,把具有不同值的元素和行里了及值記錄在一個(gè)小規(guī)模的數(shù)組中,從而縮小程序的規(guī)模,對(duì)java稀疏數(shù)組相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-07-07

最新評(píng)論

琼海市| 崇明县| 图们市| 图们市| 潼南县| 上虞市| 武隆县| 大港区| 湟中县| 枞阳县| 晋城| 千阳县| 海门市| 淳化县| 汉沽区| 绩溪县| 搜索| 三江| 镇江市| 台中县| 获嘉县| 墨竹工卡县| 泰和县| 田林县| 罗城| 黑水县| 长葛市| 宜章县| 扎兰屯市| 平顶山市| 龙游县| 安龙县| 汪清县| 广宁县| 信阳市| 蓝山县| 迁西县| 长垣县| 广安市| 大兴区| 江孜县|