Spring Cloud Alibaba: Gateway 网关过滤器 GatewayGatewayFilter factory (记录)

news2024/11/17 15:42:51

目录

AddRequestHeader GatewayFilter factory

AddRequestHeadersIfNotPresent GatewayFilter factory

AddRequestParameter GatewayFilter Factory

AddResponseHeader GatewayFilter Factory

CircuitBreaker GatewayFilter factory

circuit breaker based on the status code

PrefixPath GatewayFilter factory

StripPrefix GatewayFilter factory

RewritePath GatewayFilter factory

RequestRateLimiter GatewayFilter factory

default-filters

自定义GatewayFilter

多filter的运行


AddRequestHeader GatewayFilter factory

添加对应key和value

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/**
          filters:
            - AddRequestHeader=X-Request-Color, blue

controller获取请求头遍历输出

postman加请求头也能输出

AddRequestHeadersIfNotPresent GatewayFilter factory

可以添加多组key和value(请求头不存在对应key的情况下)

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/**
          filters:
            - AddRequestHeadersIfNotPresent=X-Request-Color:blue,school:rjxy
@GetMapping("/allHeaders")
    public String allHeadersHandle(HttpServletRequest request){
        StringBuilder sb = new StringBuilder();
        //获取请求头所有的key
        Enumeration<String> headerNames = request.getHeaderNames();
        //遍历所有key
        while (headerNames.hasMoreElements()) {
            //获取key
            String name = headerNames.nextElement();
            sb.append(name+"===");
            //获取当前key的所有value
            Enumeration<String> headers = request.getHeaders(name);
            //遍历所有value
            while (headers.hasMoreElements()) {
                //将当前遍历的value追加到sb中
                sb.append(headers.nextElement()+"");
            }
            sb.append("<br>");
​
        }
        
        return sb.toString();
    }

controller进行请求头遍历输出,添加成功

 

AddRequestParameter GatewayFilter Factory

添加请求参数

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/**
          filters:
            - AddRequestParameter=red, blue

controller

@GetMapping("/params")
    public String paramsHandle(String red){
​
        return red;
    }

 

获取成功

AddResponseHeader GatewayFilter Factory

响应修改

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/**
          filters:
            - AddResponseHeader=X-Response-color, Blue
            - AddResponseHeader=X-Response-color, Red

直接F12查看响应头,添加成功

 

CircuitBreaker GatewayFilter factory

熔断过滤工厂,完成网关层的服务熔断与降级

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/**
          filters:
            - name: CircuitBreaker
              args:
                name: myCircuitBreaker
                fallbackUri: forward:/fb

访问http://localhost:7070不成功时,降级访问forward:/fb

降级controller

@GetMapping("/fb")
    public String fallbackHandle(){
        return "This is the Gateway Fallback";
    }

测试,直接不启动7070,访问9000,熔断成功

 

circuit breaker based on the status code

PrefixPath GatewayFilter factory

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:8081
          predicates:
            - Path=/student/**
          filters:
            - PrefixPath=/provider

匹配字段,加上前缀,子模块自动添加路径

 

测试成功

StripPrefix GatewayFilter factory

去除指定的请求路径

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:8081
          predicates:
            - Path=/aa/bb/provider/student/**
          filters:
            - StripPrefix=2

去除/aa/bb

 

测试成功

RewritePath GatewayFilter factory

重写路径

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:8081
          predicates:
            - Path=/red/blue/**
          filters:
            - RewritePath=/red/blue,/provider/student
            //            - RewritePath=/red/?(?<segment>.*), /$\{segment}

匹配路径,替换成指定路径

 

RequestRateLimiter GatewayFilter factory

通过令牌桶算法对进来的请求进行限流

导入依赖

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis-reactive -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    <version>3.0.5</version>
</dependency>

添加限流键解析器

在启动类中添加一个限流键解析器,其用于从请求中解析出需要限流的key。

本例指定的是根据请求的host或ip进行限流。

package com.guo;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import reactor.core.publisher.Mono;
​
@SpringBootApplication
public class Application {
​
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
​
    @Bean
    KeyResolver userKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
    }
}

修改配置文件

server:
  port: 9000
​
​
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:8081
          predicates:
            - Path=/**
          filters:
#              replenishRate 填充率
            - name: RequestRateLimiter
              args:
                key-resolver: "#{@userKeyResolver}"
                redis-rate-limiter.replenishRate: 2
                redis-rate-limiter.burstCapacity: 5
                redis-rate-limiter.requestedTokens: 1
  data:
    redis:
      host: 127.0.0.1
      port: 6379

 

成功

default-filters

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      default-filters:
        - AddRequestHeader=X-Request-Color, Default-Blue
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/header
​
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/headers

 

测试成功

自定义GatewayFilter

AddHeaderGatewayFilter.java

public class AddHeaderGatewayFilter implements GatewayFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest()
                                            .mutate()
                                            .header("X-Request-Color", "filter-Red")
                                            .build();
        ServerWebExchange webExchange = exchange.mutate().request(request).build();
        return chain.filter(webExchange);
    }
}

调用自定义的GatewayFilter

@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder){
    return builder.routes()
            .route("my_router2",
                    ps ->ps.path("/info/**")
                            .filters(fs->fs.filter(new AddHeaderGatewayFilter()))
                            .uri("http://localhost:7070"))
            .build();
}

 

测试成功

多filter的运行

OneGateWayFilter.java

@Slf4j
public class OneGateWayFilter implements GatewayFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        long startTime = System.currentTimeMillis();
        log.info("oneFilter-pre:"+startTime);
        exchange.getAttributes().put("startTime",startTime);
        return chain.filter(exchange).then(
                Mono.fromRunnable(()->{
                    log.info("oneFilter------post");
                    Long startTimeAttr = (Long) exchange.getAttributes().get("startTime");
                    long elaspedTime = System.currentTimeMillis() - startTimeAttr;
                    log.info("所有过滤器执行的时间(毫秒)为:"+elaspedTime);
                })
        );
    }
}

TwoGateWayFilter.java

@Slf4j
public class TwoGateWayFilter implements GatewayFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("TwoFilter----pre");
        return chain.filter(exchange).then(
                Mono.fromRunnable(()->{
                    log.info("TwoFilter------post");
                })
        );
    }
}

ThreeGateWayFilter.java

@Slf4j
public class ThreeGateWayFilter implements GatewayFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("ThreeFilter----pre");
        return chain.filter(exchange).then(
                Mono.fromRunnable(()->{
                    log.info("ThreeFilter------post");
                })
        );
    }
}

 

测试结果

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

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

相关文章

真题详解(构造二叉树)-软件设计(六十八)

真题详解&#xff08;归纳法&#xff09;-软件设计&#xff08;六十七)https://blog.csdn.net/ke1ying/article/details/130517187 CMM能力成熟模型 CL0(未完成)&#xff1a;过程域未执行或未得到定义的目标。 CL1(已执行)&#xff1a;将可标识的输入工作产品转换成可标识的…

数组中的empty剖析

数组中的empty剖析 一、首先empty是怎么来的 直接通过new Array来新建&#xff0c;手动修改数组的length&#xff0c;逗号之间没有任何数据等 const array new Array(3); console.log(array); //* (3) [empty 3]const array2 [1, , 3]; console.log(array2); //* [1, e…

【软考|软件设计师】进程p1,p2,p3,p4,p5和p6的前趋图

目录 题目&#xff1a; 答&#xff1a; 题目&#xff1a; 进程p1,p2,p3,p4,p5和p6的前趋图如下图所示。用PV操作控制这6个进程之间同步与互斥 的程序如下&#xff0c;程序中的空(1)和空(2)处应分别为________,空(3)和空(4)处分别为________, 空(5)和空(6)处应分别为_______…

数据结构:图的插入和删除

线性表中我们把数据元素叫元素&#xff0c;树中将数据元素叫结点&#xff0c;在图中的数据元素我们称之为顶点&#xff08;Vertex&#xff09;。 线性表中可以没有数据元素&#xff0c;称之为空表。树中可以没有结点&#xff0c;叫做空树。但图没有空图。 线性表中&#xff0c;…

2023年好用的MacBook文件管理软件推荐

我们已经有多年的 macOS 编程经验&#xff0c;也开发了很多大家都可以使用的工具。 我们可以解决各种 Mac 问题。 CleanMyMac X 这里是一些小建议&#xff1a;下载 CleanMyMac 即可快速解决本文章中提到的一些问题。但是&#xff0c;为了帮助您自行操作&#xff0c;我们还整理…

举一反三,从“温度转换“到“python蟒蛇绘制“,快速掌握Python语法

1.温度转换实例 我们先用Pychar写一个小程序,从这个小程序出发,我们将快速学习到python中的基础语法.本章中涉及到的语法只是初始语法部分,后续章节将会详细讲解python语法. "温度转换"实例编写:将两种温度体系转换.摄氏度转换为华氏度华氏度转换为摄氏度. 设计算法…

前端项目的通用优化策略

一、虚拟滚动 当我们开发的时候&#xff0c;遇到大数据加载&#xff0c;页面卡顿的问题应该如何处理&#xff1f;大多数情况下&#xff0c;我们都是尽量通过分页的方式处理这类问题&#xff0c;但是总有一些特殊的情况我们必须把数据全部加载到前端进行处理。我曾经遇到过一个…

智能优化算法:基于厨师的优化算法-附代码

智能优化算法&#xff1a;基于厨师的优化算法 文章目录 智能优化算法&#xff1a;基于厨师的优化算法1.基于厨师的优化算法1.1 初始化1.2 阶段1&#xff1a;厨师导师小组更新&#xff08; X S 1 XS_1 XS1​到 X S N c XS_{Nc} XSNc​更新&#xff09;1.3 阶段2&#xff1a;厨师…

Arduino处理json较大数据流以及GZIP数据流方法

Arduino处理json较大数据流以及GZIP数据流方法 ✨在一些需要使用网络并从网络数据平台获取数据的项目中,大多数据平台,提供支持的数据流格式,一般以json数据格式返回为主。 📓Arduino json数据流格式化处理方法 🏳‍🌈一般处理json数据基于都是通过ArduinoJson库来处理…

运营-9.内容消费

一个优秀的产品&#xff0c;页面层级要尽量浅 所以&#xff0c;对于常见的内容产品&#xff0c;用户做内容消费一般只涉及两层页面&#xff1a; 内容消费-图文 内容消费-视频 内容消费——免费消费模式 对于绝大部分内容产品来说&#xff0c;它们的内 容都提供免费消费模式。…

文本的清洗和标准化:如何处理混乱的数据?

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Dubbo源码篇02---从泛化调用探究Wrapper机制的原理

Dubbo源码篇02---从泛化调用探究Wrapper机制的原理 什么是泛化调用从传统三层架构说起反射调用尝试优化 泛化调用泛化调用怎么用通过Spring使用泛化调用 利用泛化调用改造现有服务 泛化调用小结 Wrapper机制自定义代理dubbo底层wrapper原理小结 小结 什么是泛化调用 从传统三层…

java实现大气污染排放传输路径模拟(iClientOpenlayer前端渲染)

开头先看下模拟实现效果图 一、技术应用及背景说明 了解大气污染传输路径模拟可以帮助我们更好地了解空气污染的来源和传播方式&#xff0c;从而采取更有效的控制措施。这种模拟技术可以根据大气环境和气象条件&#xff0c;模拟出污染物在大气中的传播路径和影响范围&#xff0…

树的储存结构和表示法_20230506

树的储存结构和表示法 前言 树是一类非常重要的数据结构&#xff0c;它是图和其它更高阶数据的基础&#xff0c;人们对树的储存结构和表示法进行了大量研究&#xff0c;这里介绍三种常见的链表结构来表示树的基本方法。 树的双亲表示法 假设以一组连续空间储存数据的结点&a…

MySQL基础(六)多表查询

多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&#xff0c;…

密码学【java】初探究加密方式之非对称加密

文章目录 非对称加密1 常见算法2 生成公钥和私钥3 私钥加密4 私钥加密 公钥解密5 公钥和私钥的保存和读取5.1 **保存公钥和私钥**5.2 读取公钥和私钥 非对称加密 非对称加密算法又称现代加密算法。非对称加密是计算机通信安全的基石&#xff0c;保证了加密数据不会被破解。与对…

argument type mismatch

后端接收前端传来的数据 id&#xff0c;进行批量删除&#xff0c;报错如下&#xff1a; 错误一 removeByIds(ids) com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: java.lang.IllegalArgumentException: argument type mismatch at com.baomidou.mybati…

华为OD机试 - 各位相加(Java)

一、题目描述 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。 二、思路与算法 各位相加&#xff0c;使用递归&#xff0c;出口是结果的长度等于1。 三、Java算法源码 public static int addDigits(int num) {recursion(num);re…

vs2017如何创建一个asax文件

VS2017无法为网站创建Global.asax文件&#xff0c;导致出现错误WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping。 解决方案如下&#xff1a; 勾选要应用的网站&#xff0c;这里我要应用的是ExSite 点击安装&#xff0c;然后点击确定即可。 此时&am…

单片机+PHY芯片+Powerlink协议实现高效数据采集探究(工业总线485和CAN的升级)

CAN总线和RS-485总线作为常用的工业通信总线&#xff0c;在许多工业领域中得到广泛使用。但随着工业应用的不断扩展和网络化的需求增加&#xff0c;它们面临着一些局限性。例如CAN总线虽然具有较高的通信速率和可靠性&#xff0c;但存在节点数量受限、数据传输距离短等问题。而…