dubbo filter擴展,Spring Cloud Gateway (六) 自定義 Global Filter

 2023-10-12 阅读 20 评论 0

摘要:Spring Cloud Gateway (六) 自定義 Global Filter 簡介 ????在前面五篇的分析中,對 Spring Cloud Gateway 的 filter 組件有了一個大概的認知,今天就練練手,寫一個統計請求返回時長的 global filter 思路整理 ????閱讀官方文檔和在前面讀源碼的過程中&#x

Spring Cloud Gateway (六) 自定義 Global Filter


簡介

????在前面五篇的分析中,對 Spring Cloud Gateway 的 filter 組件有了一個大概的認知,今天就練練手,寫一個統計請求返回時長的 global filter

思路整理

????閱讀官方文檔和在前面讀源碼的過程中,大致知道 global filter 需要繼承 GlobalFilter 、 Ordered

  • GlobalFilter : 需要重寫 filter 方法,在其中實現自己的處理邏輯,很大部分都是對 exchange 進行操作,取值賦值等等
  • Ordered : 需要重寫 getOrder 方法,決定自定義 filter 在鏈中的位置,按照數字大小進行的排序

自定義時長統計 filter 編寫

dubbo filter擴展?????這里就簡單的借鑒下 GatewayMetricsFilter 的寫法,在 filter 鏈觸發完成后,無論失敗或者成功,都進行統計。filter 次序就簡單的取 WRITE_RESPONSE_FILTER_ORDER 之后(用它定義的次序減一)。代碼大致如下:

/*** 統計一次請求在filter鏈中的時長** @author lw1243925457*/
public class DurationStatisticsFilter implements GlobalFilter, Ordered {private static final Log log = LogFactory.getLog(DurationStatisticsFilter.class);private static final String START_STAMP = "startStamp";/*** 請求響應時長統計* 1.首先將請求進來時的時間戳寫入到 exchange中* 2.filter鏈走完后,無論成功或者失敗,都視為完成,從exchange取出開始時間戳,打印時長信息* @param exchange the current server exchange* @param chain provides a way to delegate to the next filter* @return mono*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.debug("duration statistics filter");exchange.getAttributes().put(START_STAMP, System.currentTimeMillis());return chain.filter(exchange).doFinally(f -> printDurationTime(exchange));}private void printDurationTime(ServerWebExchange exchange) {long startStamp = exchange.getAttribute(START_STAMP);long endStamp = System.currentTimeMillis();log.debug("duration filter time : " + (endStamp - startStamp) + " ms");}/*** 這里簡單位于 NettyWriteResponseFilter 之后吧* @return order*/@Overridepublic int getOrder() {return WRITE_RESPONSE_FILTER_ORDER - 1;}
}

主函數配置運行

????需要在主函數中配置 bean,整個代碼大致如下:

@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}@Beanpublic RouteLocator myRoutes(RouteLocatorBuilder builder) {return builder.routes().route(p -> p.path("/").filters(f -> f.addRequestParameter("test", "test").addResponseHeader("return", "return").retry(retryConsumer)).uri("http://localhost:8082/")).build();}@Beanpublic GlobalFilter durationStatisticsFilter() {return new DurationStatisticsFilter();}
}

????很簡單,大致就這些,運行起來,瀏覽器訪問,可以看到下面的輸出,over

o.s.c.g.sample.DurationStatisticsFilter  : duration statistics filter
o.s.c.g.sample.DurationStatisticsFilter  : duration filter time : 349 ms

Filter 相關分析記錄

  • Spring cloud Gateway (一) 代碼拉取與運行示例
  • Spring cloud Gateway(二) 一個Http請求的流程解析
  • Spring Cloud Gateway (三) Filter 鏈
  • Spring Cloud Gateway(四) 請求重試機制
  • Spring Cloud Gateway(五) 限流
  • Spring Cloud Gateway (六) 自定義 Global Filter

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/135578.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息