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

网关过滤工厂

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

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

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

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

GatewayFilter

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

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

跟请求头相关的

AddRequestHeaderGatewayFilterFactory

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

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

spring:cloud:gateway:routes:- id: 11uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/addRequestHeaderfilters:- 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: 12uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/removeRequestHeaderfilters:- 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: 13uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/setRequestHeaderfilters:- 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: 14uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/addRequestParameterfilters:- 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: 15uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/removeRequestParameterfilters:- RemoveRequestParameter=nickName

跟响应头相关的

AddResponseHeaderFilterGatewayFactory

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

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

spring:cloud:gateway:routes:- id: 16uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/addResponseHeaderfilters:- 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: 17uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/removeResponseHeaderfilters:- 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: 18uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/setResponseHeaderfilters:- 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: 19uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/prefixPathfilters:- 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: 20uri: lb://cloud-consumer-order-open-feign-84predicates:- 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: 21uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/redirectTofilters:- RedirectTo=302,https://www.baidu.com

其他

RequestRateLimiterGatewayFilterFactory

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

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

spring:cloud:gateway:routes: - id: 22uri: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: 23uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/retryfilters:- name: Retryargs:retries: 3statuses: BAD_GATEWAY

RequestSizeGatewayFilterFactory

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

spring:cloud:gateway:routes:  - id: 24uri: lb://cloud-consumer-order-open-feign-84predicates:- Path=/filter/requestSizefilters:- name: RequestSizeargs: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: Retryargs:retries: 3statuses: BAD_GATEWAY- name: RequestSizeargs:maxSize: 2048

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

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

相关文章

SQl注入文件上传及sqli-labs第七关less-7

Sql注入文件上传 1、sql知识基础 secure_file_priv 参数 secure_file_priv 为 NULL 时&#xff0c;表示限制mysqld不允许导入或导出。 secure_file_priv 为 /tmp 时&#xff0c;表示限制mysqld只能在/tmp目录中执行导入导出&#xff0c;其他目录不能导出导入。 secure_fil…

opencv学习:利用帧差法实现对视频移动物体的识别、帧差法的优缺点及完整代码实现

基本概念 帧差法是视频处理和计算机视觉领域中用于移动检测的一种简单而有效的方法。它主要依赖于连续视频帧之间的像素差异来识别场景中的移动对象。 帧差法&#xff1a; 定义&#xff1a;帧差法通过比较连续的视频帧之间的差异来检测移动对象。基本思想是移动对象会在连续的…

【Android 源码分析】Activity生命周期之onDestroy

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

信息学奥赛使用的编程IDE:Dev-C++ 安装指南

信息学奥赛&#xff08;NOI&#xff09;作为全国性的编程竞赛&#xff0c;要求参赛学生具备扎实的编程能力&#xff0c;而熟练使用适合的编程工具则是学习与竞赛的基础。在众多编程环境中&#xff0c;Dev-C IDE 因其简洁、轻量、支持C编程等特点&#xff0c;成为许多参赛者的常…

Android阶段学习思维导图

前言 记录下自己做的一个对Android原生应用层的思维导图&#xff0c;方便个人记忆扩展&#xff1b;这里只露出二级标题。 后语 虽然有些内容只是初步了解&#xff0c;但还是记录了下来&#xff1b;算是对过去一段学习的告别。

Linux Cent7 已安装MySQL5.7.X,再安装MYSQL8.4.2

一、 下载安装 检查Linux系统的glibc版本rpm -qa | grep glibc结果&#xff1a;glibc-common-2.17-260.el7_6.6.x86_64 glibc-2.17-260.el7_6.6.x86_64 glibc-headers-2.17-260.el7_6.6.x86_64 glibc-devel-2.17-260.el7_6.6.x86_64访问MySQL官网&#xff0c;下载对应版本数据…

JavaSE——面向对象6.1:继承知识点补充(虚方法表等)

目录 一、子类到底能继承父类中的哪些内容&#xff1f; 二、继承内存图 三、继承中&#xff1a;成员变量和成员方法的访问特点 (一)成员变量的访问特点 (二)成员方法的访问特点 1.this与super访问成员方法的特点 2.方法重写 2.1方法重写的本质&#xff1a;子类覆盖了从…

shell脚本写代码

用简单的test语句来判断是否闰年 #! /bin/bash read -p "sd " yearif [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 -o $((year%400)) -eq 0 ]thenecho "是润年"elseecho "不是闰年" fi判断一个数是否为偶数 #! /bin/bash read -p "…

【C语言】猜数字小游戏

&#x1f602;个人主页: 起名字真南 &#x1f923;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 随机数的生成1.1 rand1.2 srand1.3 time1.4 设置随机数范围 2 猜数字游戏实现 前言&#xff1a;我们学习完前面的循环以后可以写一个猜数字小游戏 1 随机数的生成 想要完成…

Java 中的 LinkedHashMap

让我们从一个简单的 Java 代码片段开始&#xff0c;演示如何在 Java 中创建和使用 LinkedHashMap。 import java.util.LinkedHashMap; public class LinkedHashMapCreation { public static void main(String[] args) { // Create a LinkedHashMap of S…

django的路由分发

前言&#xff1a; 在前面我们已经学习了基础的Django了&#xff0c;今天我们将继续学习&#xff0c;我们今天学习的是路由分发&#xff1a; 路由分发是Web框架中的一个核心概念&#xff0c;它指的是将不同的URL请求映射到对应的处理函数&#xff08;视图&#xff09;的过程。…

Ambari搭建Hadoop集群 — — 问题总结

Ambari搭建Hadoop集群 — — 问题总结 一、部署教程&#xff1a; 参考链接&#xff1a;基于Ambari搭建大数据分析平台-CSDN博客 二、问题总结&#xff1a; 1. VMwear Workstation 查看网关 2. 资源分配 参考&#xff1a; 硬盘&#xff1a;master&#xff08;29 GB&#xff…

手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]

有时候&#xff0c;您会被锁定在自己的 Android 设备之外&#xff0c;而且似乎不可能重新进入。 一个例子就是你买了一部二手手机&#xff0c;后来发现无法使用。另一种情况是你忘记了屏幕锁定密码和用于验证密码的 Google 帐户凭据。这种情况很少见&#xff0c;但确实会发生&…

15分钟学 Python 第35天 :Python 爬虫入门(一)

Day 35 : Python 爬虫简介 1.1 什么是爬虫&#xff1f; 网页爬虫&#xff08;Web Crawler&#xff09;是自动访问互联网并提取所需信息的程序。爬虫的主要功能是模拟用户通过浏览器访问网页的操作&#xff0c;从而实现对网页内容的批量访问与信息提取。它们广泛应用于数据收集…

Unity各个操作功能+基本游戏物体创建与编辑+Unity场景概念及文件导入导出

各个操作功能 部分功能 几种操作游戏物体的方式&#xff1a; Center:有游戏物体父子关系的时候&#xff0c;中心点位置 Global/Local:世界坐标系方向/自身坐标系方向 &#xff1a;调试/暂停/下一帧 快捷键 1.Alt鼠标左键&#xff1a;可以实现巡游角度查看场景 2.鼠标滚轮…

MySQL从0到1基础语法笔记(上)

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java Web关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 MySQL笔记&#xff1a; 一、注释&#xff1a; 二、SQL四大类&#xff…

在线测径仪都有哪些别称?

在线测径仪广泛运用于电线电缆、输送管、金属丝、PVC管、医疗器械、塑料、金属拉丝、橡胶、高线、圆钢、钢筋、螺纹钢、钢管、轧钢等生产行业&#xff0c;主要用于这些行业生产出的产品的直径、椭圆度&#xff08;双轴及以上测头&#xff09;等的检测。 测径仪为在线检测设备&a…

智能指针详解

目录 智能指针原理 RAII Unique_ptr Shared_ptr Shared_ptr缺点 定制删除器 在C库里提供的智能指针有跟多&#xff0c;如下图所示&#xff0c;使用时需要包含头文件<memory>。下面将详细介绍这些智能指针的底层原理和缺点&#xff0c;还有每个智能指针的应用场景。…

嘉立创EDA中PCB快速画螺旋触摸焊盘或其他不规则形状

常见触摸焊盘 首先需要有CAD软件 使用CAD的原因&#xff1a;能快速编辑线条和不规则形状&#xff0c;在嘉立创EDA中不能快速完成。 画图整体步骤&#xff1a; 1&#xff0c;先在CAD中画出螺旋线&#xff08;HELIX&#xff09; 这里需要设置底部半径&#xff0c;圈数和顶部半…