????在前面五篇的分析中,對 Spring Cloud Gateway 的 filter 組件有了一個大概的認知,今天就練練手,寫一個統計請求返回時長的 global filter
????閱讀官方文檔和在前面讀源碼的過程中,大致知道 global filter 需要繼承 GlobalFilter 、 Ordered
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
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态