一、自定义局部过滤器

  自定义过滤器需要实现GatewayFilterOrdered。其中GatewayFilter中的这个方法就是用来实现你的自定义的逻辑的

Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);

示例:统计某个服务的响应时间

1.1、创建Filer

public class ElapsedFilter implements GatewayFilter, Ordered {

    private static final Log log = LogFactory.getLog(GatewayFilter.class);
private static final String ELAPSED_TIME_BEGIN = "elapsedTimeBegin"; @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
exchange.getAttributes().put(ELAPSED_TIME_BEGIN, System.currentTimeMillis());
return chain.filter(exchange).then(
Mono.fromRunnable(() -> {
Long startTime = exchange.getAttribute(ELAPSED_TIME_BEGIN);
if (startTime != null) {
log.info(exchange.getRequest().getURI().getRawPath() + ": " + (System.currentTimeMillis() - startTime) + "ms");
}
})
);
} @Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}

在请求刚刚到达时,往ServerWebExchange中放入了一个属性elapsedTimeBegin,属性值为当时的毫秒级时间戳。然后在请求执行结束后,又从中取出我们之前放进去的那个时间戳,与当前时间的差值即为该请求的耗时。因为这是与业务无关的日志所以将Ordered设为Integer.MAX_VALUE以降低优先级。

chain.filter(exchange)之前的就是 “pre” 部分,之后的也就是then里边的是 “post” 部分。

1.2、配置

创建好 Filter 之后我们将它添加到我们的 Filter Chain 里边

@Bean
public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
// @formatter:off
return builder.routes()
.route(r -> r.path("/fluent/customer/**")
.filters(f -> f.stripPrefix(2)
.filter(new ElapsedFilter())
.addResponseHeader("X-Response-Default-Foo", "Default-Bar"))
.uri("lb://CONSUMER")
.order(0)
.id("fluent_customer_service")
)
.build();
// @formatter:on
}

注意:实际在使用 Spring Cloud 的过程中,需要使用 Sleuth+Zipkin 来进行耗时分析。

二、全局过滤器

有多个路由就需要一个一个来配置,并不能通过像下面这样来实现全局有效(也未在 Fluent Java API 中找到能设置 defaultFilters 的方法)

@Bean
public ElapsedFilter elapsedFilter(){
return new ElapsedFilter();
}

自定义过滤器需要实现GlobalFilter和Ordered

示例:校验token

2.1、创建Filter

public class TokenFilter implements GlobalFilter, Ordered {

    @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getQueryParams().getFirst("token");
if (token == null || token.isEmpty()) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
} @Override
public int getOrder() {
return -100;
}
}

2.2、在 Spring Config 中配置这个 Bean

@Bean
public TokenFilter tokenFilter(){
return new TokenFilter();
}

三、GatewayFilter与GlobalFilter的区别

3.1、GatewayFilter

  在一个高的角度来看,Global filters会被应用到所有的路由上,而Gateway filter将应用到单个路由上或者一个分组的路由上。

  GatewayFilter是从WebFilter中Copy过来的,相当于一个Filter过滤器,可以对访问的URL过滤横切处理,应用场景比如超时,安全等。

  GatewayFilter和GlobalFilter两个接口中定义的方法一样都是Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain),唯一的区别就是GatewayFilter继承了ShortcutConfigurable,GlobalFilter没有任何继承。

  参看示例一:Gateway Filter与RouteLocator绑定使用

3.2、GlobalFilter

  Spring Cloud gateway定义了GlobalFilter的接口让我们去自定义实现自己的的GlobalFilter。GlobalFilter是一个全局的Filter,作用于所有的路由。

  让其在Gateway中运行生效,有两种方式一种直接加@Component注解,另外一种可以在 Spring Config 中配置这个 Bean如下示例二所示;

最新文章

  1. Git过滤文件和文夹
  2. win7双系统安装ubuntu并配置常用软件
  3. 让apache后端显示真实客户端IP
  4. OneThink学习笔记01
  5. hadoop运行原理之Job运行(一) JobTracker启动及初始化
  6. MySQL+Keepalived实现双机HA
  7. Vue.2.0.5-列表渲染
  8. 【环境】openSUSE安装记录 - 古董本上的windows 7和opensuse双系统
  9. (转载)php curl_init函数用法
  10. Java多线程Thread.yield(),thread.join(), Thread.sleep(200),Object.wait(),Object.notify(),Object.notifyAll()的区别
  11. Android Toast封装
  12. hdu5023--A Corrupt Mayor&#39;s Performance Art
  13. 【转】JDBC学习笔记(4)——PreparedStatement的使用
  14. Linux入门——用户组管理
  15. Python爬虫【实战篇】bilibili视频弹幕提取
  16. Javascript基础语法(二)
  17. Windws Server 2008 R2 WEB环境配置之IIS7/IIS7.5+FastCGI+PHP 5.6.4+MYSQL+phpMyAdmin
  18. BizTalk RosettaNet解决方案搭建
  19. 用TSQL从sqlserve 发布订阅链中删除一张或几张表
  20. springboot(十九)使用actuator监控应用

热门文章

  1. vue使用hightchats
  2. g++参数介绍
  3. codeforces水题100道 第二十三题 Codeforces Beta Round #77 (Div. 2 Only) A. Football (strings)
  4. Android Studio Error:Connection timed out: connect.解决方案
  5. Android自定义字体
  6. PowerDesigner 同步Name到Comment 及 同步 Comment 到Name
  7. jquery.sparkline.js简介
  8. 五、K3 WISE 开发插件《K3 Wise 群发短信配置开发(一)之短信平台配置》
  9. sencha touch 在线实战培训 第一期 第四节
  10. Jenkins常见任务配置