在前文中,我们介绍了Spring Cloud Gateway内置了一系列的内置过滤器工厂,若Spring Cloud Gateway内置的过滤器工厂无法满足我们的业务需求,那么此时就需要自定义自己的过滤器工厂以实现特定功能。所谓过滤器工厂实际上就是用于创建过滤器实例的,而创建的过滤器实例都实现于GatewayFilter接口。

过滤器生命周期

Gateway以转发请求为边界,分为两个生命周期

  • pre:Gateway转发请求之前
  • post:Gateway转发请求之后

自定义过滤器工厂

继承AbstractGatewayFilterFactory

可参考源码:org.springframework.cloud.gateway.filter.factory.RequestSizeGatewayFilterFactory

配置形式如下:

spring:
cloud:
gateway:
routes:
filters:
# 过滤器工厂的名称
- name: RequestSize
# 该过滤器工厂的参数
args:
maxSize: 500000

继承AbstractNameValueGatewayFilterFactory

可参考源码:org.springframework.cloud.gateway.filter.factory.AddRequestHeaderGatewayFilterFactory

配置形式如下:

spring:
cloud:
gateway:
routes:
filters:
# 过滤器工厂的名称及参数以name-value的形式配置
- AddRequestHeader=S-Header, Bar

PS:AbstractNameValueGatewayFilterFactory继承了AbstractGatewayFilterFactory,所以实际上第二种方式是第一种方式的简化

核心API

  • exchange.getRequest().mutate().xxx:修改request

    *exchange.mutate().xxx:修改exchange

    *chain.filter(exchange):传递给下一个过滤器处理

    *exchange.getResponse():获取响应对象

PS::exchange实际类型为ServerWebExchange,chain实际类型为GatewayFilter

实现自定义过滤器工厂

需求:记录访问日志

自定义过滤器工厂

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange; @Slf4j
@Component
public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
return (exchange, chain) -> {
log.info("配置参数:{}, {}", config.getName(), config.getValue());
ServerHttpRequest request = exchange.getRequest()
.mutate().build();
ServerWebExchange webExchange = exchange.mutate()
.request(request)
.build();
return chain.filter(webExchange);
};
}
}

添加相关配置

spring:
gateway:
discovery:
locator:
enabled: false
routes:
- id: study
uri: lb://study01
predicates:
- TimeBetween=上午0:00,下午11:59
filters:
# 名称必须为过滤器工厂类名的前缀,并且参数只能有两个,因为NameValueConfig里只定义了两个属性
- PreLog=testName,testValue

PS:

  • 自定义过滤器工厂类时,按照Spring Cloud Stream的约定,类名须为“过滤器名(本文例中:PreLog)” + GatewayFilterFactory

测试结果

2019-10-28 15:05:10.620  INFO 8734 --- [or-http-epoll-2] c.e.gateway.PreLogGatewayFilterFactory   : 配置参数:testName, testValue

Spring Cloud Alibaba学习笔记(19) - Spring Cloud Gateway 自定义过滤器工厂的更多相关文章

  1. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  2. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  3. Spring Cloud Alibaba学习笔记(1) - 整合Spring Cloud Alibaba

    Spring Cloud Alibaba从孵化器版本毕业:https://github.com/alibaba/spring-cloud-alibaba,记录一下自己学习Spring Cloud Al ...

  4. Spring Cloud Alibaba学习笔记(15) - 整合Spring Cloud Gateway

    Spring Cloud Gateway 概述 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于Netty.Reactor以及WEbFlux构建,它 ...

  5. Spring Cloud Alibaba学习笔记(3) - Ribbon

    1.手写一个客户端负载均衡器 在了解什么是Ribbon之前,首先通过代码的方式手写一个负载均衡器 RestTemplate restTemplate = new RestTemplate(); // ...

  6. Spring Cloud Alibaba学习笔记(22) - Nacos配置管理

    目前业界流行的统一配置管理中心组件有Spring Cloud Config.Spring Cloud Alibaba的Nacos及携程开源的Apollo,本文将介绍Nacos作为统一配置管理中心的使用 ...

  7. Spring Cloud Alibaba学习笔记(18) - Spring Cloud Gateway 内置的过滤器工厂

    参考:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/single/spring-clou ...

  8. Spring Cloud Alibaba学习笔记(7) - Sentinel规则持久化及生产环境使用

    Sentinel 控制台 需要具备下面几个特性: 规则管理及推送,集中管理和推送规则.sentinel-core 提供 API 和扩展接口来接收信息.开发者需要根据自己的环境,选取一个可靠的推送规则方 ...

  9. Spring Cloud Alibaba学习笔记(2) - Nacos服务发现

    1.什么是Nacos Nacos的官网对这一问题进行了详细的介绍,通俗的来说: Nacos是一个服务发现组件,同时也是一个配置服务器,它解决了两个问题: 1.服务A如何发现服务B 2.管理微服务的配置 ...

随机推荐

  1. windbg预览版,windbg preview配置win7x64双机调试

    目录 一丶简介 二丶步骤 1.下载Windbg Preview (windbg预览版本) 2.配置虚拟机端口 3.虚拟机设置调试湍口 4.windbg preview开始调试. 一丶简介 Windbg ...

  2. Exception in thread "main" java.lang.IllegalStateException: Failed to read 问题解决

    开发中偶尔遇到这样的问题:Exception in thread "main" java.lang.IllegalStateException: Failed to read .. ...

  3. 一次修复linux的efi引导的集中方法总结记录

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/grub_uefi_repair 起因:EFI分区被删除导致引导问 ...

  4. 微信小程序 报错Failed to load image

    加载网络图片WXML代码: <image class="userinfo-avatar" src="{{avatarUrl}}"></imag ...

  5. fluent meshing建立周期性网格

    原视频下载地址:https://pan.baidu.com/s/1pKUXKgz 密码: 6pwh

  6. Java与.net 关于URL Encode 的区别

    在c#中,HttpUtility.UrlEncode("www+mzwu+com")编码结果为www%2bmzwu%2bcom,在和Java开发的平台做对接的时候,对方用用url编 ...

  7. git 项目最常用命令总结

    本文为博主原创,未经允许不得转载: 1.查看git基础配置信息 1.查看用户名和邮箱地址 git config user.name   git config user.email 2.修改用户名和邮箱 ...

  8. 如何打开uboot的函数debug()的开关,输出更多调试信息?

    答: 有两种方法: 一. 方法一 在文件<file>.c的首行加入以下内容: #define DEBUG #undef CONFIG_LOGLEVEL #define CONFIG_LOG ...

  9. [转]Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

    原文地址:https://blog.csdn.net/qq_27093465/article/details/78544505 遇到这个 Java Serializable 序列化这个接口,我们可能会 ...

  10. 最稳定万能vip视频解析接口 支持HTTPS

    最稳定万能vip视频解析接口 支持HTTPS https://cdn.yangju.vip/k/?url=后面加上播放的地址即可 https://cdn.yangju.vip/k/?url= http ...