【微服务】网关 - Gateway(下)(day8)

news2024/12/28 4:29:22

网关过滤工厂

在上一篇文章中,主要是对网关进行了一个总体的介绍,然后对网关中的断言进行了一个描述。在这篇文章中,主要是对网关中的最后一大核心——过滤进行介绍。

当客户端发送过来的请求经过断言之后,如果还想在请求前后添加一些逻辑,那么就可以使用过滤器来做。这个过滤器其实就相当于SpringMVC中的拦截器、Servlet中的过滤器。同样,过滤和断言类似,SpringCloudGateway内部也内置了许多Filter。

过滤器可以分为全局默认过滤器(GlobalFilter)、单一内置过滤器(GatewayFilter)以及自定义过滤器。

过滤器可以在请求前后对业务逻辑进行处理,因此它的功能有:请求鉴权、记录接口耗时等。

GatewayFilter

GatewayFilter,表示单一内置过滤器,一般应用到单个路由或者一个分组的路由上。

和断言相同,在网关服务的配置文件中配置条件,然后在订单服务创建一个FilterController类来测试项目。

跟请求头相关的

AddRequestHeaderGatewayFilterFactory

该过滤器表示在请求头上添加内容,具体内容跟自己配置的文件相关。

如下配置表示在/filter/addRequestHeader请求的请求头上加上key为role,value为admin的内容。

spring:
  cloud:
    gateway:
      routes:
        - id: 11
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/filter/addRequestHeader
          filters:
            - AddRequestHeader=role, admin
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {

    /**
     * AddRequestHeaderGatewayFilterFactory
     * 表示在请求头中添加一些内容
     * 测试添加的是role=admin
     */
    @GetMapping("/addRequestHeader")
    public String addRequestHeader() {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = servletRequestAttributes.getRequest();
        String role = request.getHeader("role");
        return "在过滤内置工厂中添加的内容为:role = " + role;
    }

}

RemoveRequestHeaderGatewayFilterFactory

改过滤器表示将请求头上的内容删除,具体删除内容跟配置文件有关。

如下配置表示移除请求头中key为content的内容。在postman的请求中,专门加入要移除的内容,测试之后发现请求头中确实没有,表示验证成功。

spring:
  cloud:
    gateway:
      routes:
        - id: 12
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/filter/removeRequestHeader
          filters:
            - RemoveRequestHeader=content
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {

    /**
     * RemoveRequestHeaderGatewayFilterFactory
     * 表示移除请求头中的一些内容
     * 测试移除的是content
     */
    @GetMapping("/removeRequestHeader")
    public String removeRequestHeader(HttpServletRequest request) {
        String value = "";
        Enumeration<String> headers = request.getHeaderNames();
        while (headers.hasMoreElements()) {
            String headerKey = headers.nextElement();
            String headValue = request.getHeader(headerKey);
            value = value +  headerKey + '\t' + headValue + '\n';
        }
        return value;
    }

}

SetRequestHeaderGatewayFilterFactory

该过滤器表示修改请求头原先的一些设置,测试发现好像即使没加这个请求头,他也会自动加上。

如下配置表示将请求头中key为usernmae的内容,将其value设置成wbz。

spring:
  cloud:
    gateway:
      routes:
        - id: 13
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/filter/setRequestHeader
          filters:
            - SetRequestHeader=username, wbz
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {

    /**
     * SetRequestHeaderGatewayFilterFactory
     * 表示将原先请求头中的内容进行更换
     * 测试是将key为username的wky更换成wbz
     */
    @GetMapping("/setRequestHeader")
    public String setRequestHeader(HttpServletRequest request) {
        return "请求头中username对应的是:" + request.getHeader("username");
    }

}

 

跟请求参数相关的 

AddRequestParameterGatewayFilterFactory

该过滤器表示在请求参数上添加一些内容。

如下配置表示在请求参数上添加key为phone,value为13191038888的内容。

@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {

    /**
     * AddRequestParameterGatewayFilterFactory
     * 表示在请求参数中加入一些内容
     * 测试是加入一个key为phone,value为1319103888的键值对
     */
    @GetMapping("/addRequestParameter")
    public String addRequestParameter(HttpServletRequest request, String phone) {
        log.info("测试" + phone);
        return "phone:" + request.getParameter("phone");
    }

}
spring:
  cloud:
    gateway:
      routes:
        - id: 14
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/filter/addRequestParameter
          filters:
            - AddRequestParameter=phone,13191038888

RemoveRequestParameterGatewayFilterFactory

该过滤器表示删除请求参数上的一些内容。

如下配置表示删除请求参数上key为nickName的内容。

@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {

    /**
     * RemoveRequestParameterGatewayFilterFactory
     * 表示在请求参数中删除一些内容
     * 测试是删除一个key为nickName,无论value是啥的内容
     */
    @GetMapping("removeRequestParameter")
    public String removeRequestParameter(HttpServletRequest request) {
        return "nickName:" + request.getParameter("nickName");
    }

}
spring:
  cloud:
    gateway:
      routes:
        - id: 15
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/filter/removeRequestParameter
          filters:
            - RemoveRequestParameter=nickName

跟响应头相关的

AddResponseHeaderFilterGatewayFactory

该过滤器表示在响应头上添加一些内容。

如下配置表示在响应头上新增一个key为role,value为admin的键值对。

spring:
  cloud:
    gateway:
      routes:
        - id: 16
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/filter/addResponseHeader
          filters:
            - AddResponseHeader=role, admin
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {

    /**
     * AddResponseHeaderGatewayFilterFactory
     * 表示在响应头中新增一些内容
     * 测试是新增一个key为role,content为admin的键值对
     */
    @GetMapping("/addResponseHeader")
    public String addResponseHeader(HttpServletResponse response) {
        return "响应";
    }

}

RemoveResponseHeaderFilterGatewayFactory

该过滤器表示移除响应头上的一些内容。

如下配置表示将响应头中key为content的内容移除

spring:
  cloud:
    gateway:
      routes:
        - id: 17
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/filter/removeResponseHeader
          filters:
            - RemoveResponseHeader=content
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {

    /**
     * RemoveResponseHeaderGatewayFilterFactory
     * 表示在响应头中移除一些内容
     * 测试是将key为content的内容移除
     */
    @GetMapping("/removeResponseHeader")
    public String removeResponseHeader(HttpServletResponse response) {
        response.setHeader("content", "delete");
        return "响应";
    }

}

SetResponseHeaderFilterGatewayFactory

该过滤器表示设置响应头上的一些内容,即使原本响应头上没有,依旧可以设置成功,有的话就换成设置之后的。

如下配置表示将key为username的对应的value设置成wbz。

spring:
  cloud:
    gateway:
      routes:
        - id: 18
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/filter/setResponseHeader
          filters:
            - SetResponseHeader=username, wbz
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {

    /**
     * SetResponseHeaderGatewayFilterFactory
     * 表示在响应头中设置一些内容
     * 测试是将key为username的对应value设置为wbz
     */
    @GetMapping("/setResponseHeader")
    public String setResponseHeader(HttpServletResponse response) {
        response.setHeader("username", "wky");
        return "响应";
    }

}

跟路径有关的

PrefixPathGatewayFilterFactory

该过滤器是用来设置统一前缀的,假设某个服务的路径都带有一个相同的前缀,那么就可以使用该过滤器进行设置。当请求通过断言之后,过滤器路由服务之前就会自动加上前缀。

如下配置请求的完整URL是/filter/prefixPath,我将filter抽取出来放到过滤器中,因此我在输入URL时,只输入127.0.0.1:9527/prefixPath,就可以成功路由到/filter/prefixPath上。

spring:
  cloud:
    gateway:
      routes:
        - id: 19
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/prefixPath
          filters:
            - PrefixPath=/filter
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {

    /**
     * PrefixPathGatewayFilterFactory
     * 表示设置一个响应统一前缀
     */
    @GetMapping("/prefixPath")
    public String prefixPath() {
        return "设置统一前缀成功";
    }

}

SetPathGatewayFilterFactory

该过滤器是用来进行地址替换的,客户端发送的地址经过断言之后,就会替换成过滤器中给出的真实地址。

如下配置是客户端发送的请求地址是127.0.0.1:9527/random/test,断言判断为true之后,过滤器就会将这个地址进行替换,然后再向服务端发送请求。

spring:
  cloud:
    gateway:
      routes:
        - id: 20
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/random/{regexp}
          filters:
            - SetPath=/filter/setPath/{regexp}
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {

    /**
     * SetPathGatewayFilterFactory
     * 地址替换,即客户端发送的请求是根据断言来的
     * 断言成功之后过滤器会将其替换成真实的地址
     */
    @GetMapping("/setPath/{regexp}")
    public String setPath(@PathVariable String regexp) {
        return "地址替换成功";
    }

}

 RedirectToGatewayFilterFactory

该过滤器表示重定向。

如下配置表示当客户端访问127.0.0.1:9527/redirectTo时,网关就会重定向到百度。

spring:
  cloud:
    gateway:
      routes: 
       - id: 21
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/redirectTo
          filters:
            - RedirectTo=302,https://www.baidu.com

其他

RequestRateLimiterGatewayFilterFactory

该过滤器表示为当前网关的所有请求执行限流过滤,如果被限流,默认会响应HTTP 429-Too ManyRequests。默认提供了RedisRateLimiter的限流算法,采用令牌桶算法实现限流功能(对于具体的限流算法,在介绍Sentinel或其他限流组件时会详细介绍)。

如下配置表示限流过滤器的内容。

spring:
  cloud:
    gateway:
      routes: 
        - id: 22
          uri:
          predicates:
            - Path=/filter/**
          filters:
            - RequestRateLimiter=redis-rate-limiter.replenishRate, 10
            # 令牌填充速度,即每秒钟允许多少个请求(不丢弃任何请求)
            - RequestRateLimiter=redis-rate-limiter.burstCapacity, 20
            # 令牌桶容量,即每秒⽤⼾最⼤能够执⾏的请求数量(不丢弃任何请求)。将此值设置为零将阻⽌所有请求。
            - RequestRateLimiter=redis-rate-limiter.requestedTokens, 1
            # 每次请求占⽤⼏个令牌,默认为1。

RetryGatewayFilterFactory

该过滤器表示重试过滤器,会针对不同的响应进行重试。当后端服务不可用时,网关会根据配置参数来发起重试。

如下配置中,设置重试3次,然后针对BAD_GATEWAY的响应进行重试。BAD_GATEWAY是HttpStatus中的状态码,只要配置文件中配置的状态和服务响应回去的状态相同,那么就会进行重试。从结果可以看出,共发送了三次请求,正常发送依次,重试三次。

@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {

    /**
     * RetryGatewayFilterFactory
     * 重试过滤器
     */
    @GetMapping("/retry")
    public String retry(HttpServletResponse response) {
        log.info("重试机制");
        response.setStatus(502);
        return "重试机制";
    }

}
spring:
  cloud:
    gateway:
      routes:  
       - id: 23
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/filter/retry
          filters:
            - name: Retry
              args:
                retries: 3
                statuses: BAD_GATEWAY

RequestSizeGatewayFilterFactory

该过滤器表示设置允许接收最大请求包的大小,如果请求大小超过设置的值,则返回413 Payload Too Large。请求包默认大小为5M,单位是字节。

spring:
  cloud:
    gateway:
      routes:  
        - id: 24
          uri: lb://cloud-consumer-order-open-feign-84
          predicates:
            - Path=/filter/requestSize
          filters:
            - name: RequestSize
              args:
                maxSize: 2048 
@Slf4j
@RestController
@RequestMapping("/filter")
public class FilterController {
   
     /**
     * RequestSizeGatewayFilterFactory
     * 该过滤器表示能接收的请求包的大小,默认是5MB
     */
    @PostMapping("/requestSize")
    public String requestSize(@RequestPart MultipartFile file) {
        return "文件大小为:" + file.getSize();
    }

}

 

DefaultGatewayFilterFactory

前面写的都是针对某一路由生效的,若需要对全部路由生效,则可以使用该过滤器,这个过滤器就需要一个过滤列表,例如上述的重试过滤器、限流过滤器等等,就可以加入1到默认过滤器中,这样就可以对所有服务生效。

spring:
  cloud:
    gateway:
      default-filters:
        - name: Retry
          args:
            retries: 3
            statuses: BAD_GATEWAY
        - name: RequestSize
          args:
            maxSize: 2048

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 MySQL 中处理 BLOB 和 CLOB 数据类型

在 MySQL 数据库中&#xff0c;BLOB&#xff08;Binary Large Object&#xff09;和 CLOB&#xff08;Character Large Object&#xff09;数据类型用于存储大量的二进制数据和字符数据。本篇文章我们来一起看看如何在 MySQL 中处理 BLOB 和 CLOB 数据类型&#xff0c;并加入如…

7.3美团—Java日常实习面经

7.2晚上投的&#xff0c;发邮件约到了7.3晚上 总时长1小时10分钟左右 自我介绍 拷打项目30min 缓存三兄弟 Redis除了缓存&#xff0c;还能做什么 Redis的数据结构&#xff0c;什么时候用哈希&#xff0c;什么时候用字符串 线程池的执行流程 MySQL索引的数据结构 聚簇索引…

基于PHP+uniapp微信小程序的个性化影视推荐系统的设计54lfb

目录 项目介绍技术栈和环境说明具体实现截图php技术介绍文件解析微信开发者工具HBuilderXuniapp开发技术简介解决的思路性能/安全/负载方面数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 项目介绍 首先要进行需求分析&#xff0c;分析出电影信…

JUC高并发编程7:辅助类

1 减少计数CountDownLatch 1.1 CountDownLatch 概述 CountDownLatch 是 Java 并发包&#xff08;java.util.concurrent&#xff09;中的一个同步工具类&#xff0c;用于在多个线程之间进行协调。它允许一个或多个线程等待其他线程完成一组操作。 1.1.1 主要方法 CountDownL…

【重学 MySQL】六十二、非空约束的使用

【重学 MySQL】六十二、非空约束的使用 定义目的关键字特点作用创建非空约束删除非空约束注意事项 在MySQL中&#xff0c;非空约束&#xff08;NOT NULL Constraint&#xff09;是一种用于确保表中某列不允许为空值的数据库约束。 定义 非空约束&#xff08;NOT NULL Constra…

基于LORA的一主多从监测系统_AHT20温湿度传感器

1&#xff09;AHT20温湿度传感器 这个传感器&#xff0c;网上能找到的资料还是比较多的&#xff0c;我们使用的是HAL硬件i2c&#xff0c;相比于模拟i2c&#xff0c;我们不需要过于关注时序问题&#xff0c;我们只需要关心如何获取数据以及数据如何处理&#xff0c;下面以数据手…

指针——指针数组、数组指针

&#xff08;一&#xff09;指针数组 1、本质&#xff1a;指针数组的本质任然是数组 2、基本格式&#xff1a;int* arr[5] 3、应用&#xff1a;如尝试使用指针来模拟二维数组 先来看代码 #include<stdio.h> //指针数组——模拟实现二维数组 int main() {int a[5] {…

java面向对象之类与对象

目录 1.定义一个类 案例:定义一个学生类 1.代码 2.效果 2.类的实例化与使用 1.代码 2.效果 3.访问控制 1)private 2)default 3)protected 4)public 注:如下图 4.封装一个类 案例:封装一个教师类 1)代码 2)效果 5.定义一个构造方法 1)无参数构造 2)有参数构造 3&#xff09;注 6…

【Java 问题】基础——反射

接上文 反射 49.什么是反射&#xff1f;应用&#xff1f;原理&#xff1f; 49.什么是反射&#xff1f;应用&#xff1f;原理&#xff1f; 什么是反射&#xff1f; 我们通常都是利用 new 方式来创建对象实例&#xff0c;这可以说就是一种“正射”&#xff0c;这种方式在编译时候…

HJDQN环境配置

git clone仓库代码等不做赘述 #创建&#xff0c;激活conda环境即可 conda create -n EAHJDQN python3.6 conda activate EAHJDQN#安装包 pip install mujoco_py2.0.2.8pip install Cython0.29.21pip install torch1.8.1cu111 torchvision0.9.1cu111 torchaudio0.8.1 -f https:/…

【信息论基础第四讲】信息的流动——平均互信息及其性质

一、平均互信息与互信息 1、互信息 互信息量表示接收到消息yj后&#xff0c;获得关于事件xi的信息量。 2、 从熵的角度来定义平均互信息量&#xff1a; 从信源X熵H(X)到信宿熵H(X|Y)熵减少了&#xff0c;同时为信宿Y提供了信息量&#xff0c;而信息从信源到信宿的变化是流经信…

每日OJ题_牛客_平方数_数学_C++_Java

目录 牛客_平方数_数学 题目解析 C代码1暴力 C代码2数学 Java代码数学 牛客_平方数_数学 平方数 (nowcoder.com) 描述&#xff1a; 牛妹是一个喜欢完全平方数的女孩子。 牛妹每次看到一个数 x&#xff0c;都想求出离 x 最近的完全平方数 y。 每次手算太麻烦&#xff0c;…

分享几个国外SSL证书提供商网站

国外SSL证书提供商 众所周知兼容性高的SSL证书肯定是在国外申请的&#xff0c;主要确保SSL证书的安全性的同时&#xff0c;对于安全标准在国外相比而言更成熟&#xff0c;保护程度也比较高。 另方面对需要申请的域名没有限制&#xff0c;可选性SSL证书类型种类比较多&#xf…

[Python学习日记-39] 闭包是个什么东西?

[Python学习日记-39] 闭包是个什么东西&#xff1f; 简介 闭包现象 闭包意义与作用 简介 在前面讲函数和作用域的时候应该提到过&#xff0c;当函数运行结束后会由 Python 解释器自带的垃圾回收机制回收函数内作用域已经废弃掉的变量&#xff0c;但是在 Python 当中还有一种…

vulnhub靶场之hackableIII

一.环境搭建 1.靶场描述 Focus on general concepts about CTF Difficulty: Medium This works better with VirtualBox rather than VMware. 2.靶场下载 https://download.vulnhub.com/hackable/hackable3.ova 3.靶场启动 二.信息收集 1.寻找靶场真实的Ip nmap -SP 192.168…

LingedList<T>,自定义泛型

LingedList<T>底层采用双向链表数据结构实现的集合(容器)。 数据结构:是计算机在内存中组织数据的一种方式。 分类: 线性数据结构: 数组:存储同类型数据的大小固定的集合。 列表(List):动态大小的数组,可以灵活的添加,删除元素。 链表(LinkedList):分…

目标检测 DN-DETR(2022)

文章目录 前言gt labels 和gt boxes加噪query的构造attention maskIS&#xff08;InStability&#xff09;指标 前言 gt labels 和gt boxes加噪 query的构造 attention mask IS&#xff08;InStability&#xff09;指标

媒界:家庭出行不用愁 江铃集团新能源易至EV3青春版值得拥有

随着家庭代步、接送孩子上下学的需求进一步释放&#xff0c;纯电小车市场迎来火热发展机遇。江铃集团新能源旗下的易至EV3青春版&#xff0c;以其灵动的车身设计、宽敞的内部空间以及先进的智能配置&#xff0c;成为了家庭用车的优质选择。 作为电动汽车和出行普及者&#xff0…

阿里面试: RocketMQ如何实现每秒上十万QPS的超高吞吐量读取的?

这玩意儿表面看上去挺牛逼&#xff0c;但其实背后的逻辑和套路&#xff0c;在咱们开发里见过的那些招数&#xff0c;都能找到影子。 今天小北和大家一起系统化的梳理梳理一遍&#xff0c;让大家功力猛增&#xff0c;吊打面试官。 1. 消息存储&#xff1a;巧妙利用顺序写 先说…

ARTS Week 43

Algorithm 本周的算法题为 1822. 数组元素积的符号 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。 如果 x 是负数&#xff0c;返回 -1 。 如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组 nums 。令 product 为数…