Spring Cloud Gateway网关中各个过滤器的作用与介绍

news2024/11/20 18:31:34

文章目录

      • 1. Route To Request URL Filter(路由过滤器)
      • 2. Gateway Filter(全局过滤器)
      • 3. Pre Filter(前置过滤器)
      • 4. Post Filter(后置过滤器)
      • 5. Error Filter(错误过滤器)
      • 6. Rewrite Path Filter(路径重写过滤器)
      • 7. Rate Limit Filter(速率限制过滤器)
      • 8. Strip Prefix Filter(前缀删除过滤器)
      • 结论

在这里插入图片描述

🎉欢迎来到架构设计专栏~Spring Cloud Gateway网关中各个过滤器的作用与介绍


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:架构设计
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

随着微服务架构的兴起,API网关变得越来越重要。它是微服务体系结构中的一个关键组件,用于处理所有传入和传出的请求流量,同时还提供了一些关键的功能,如身份验证、安全性、监控、负载均衡和路由。Spring Cloud Gateway是一个基于Spring Framework 5,Spring Boot 2和Project Reactor的API网关工具,它的灵活性和强大性使得它成为了构建微服务架构的理想选择。

在这里插入图片描述

Spring Cloud Gateway通过一系列的过滤器来处理请求,并将请求路由到适当的微服务。这些过滤器是它的核心组成部分,每个过滤器都有自己的特定功能。在本文中,我们将深入探讨Spring Cloud Gateway中各个过滤器的作用与介绍。

在这里插入图片描述

1. Route To Request URL Filter(路由过滤器)

路由过滤器是Spring Cloud Gateway的核心过滤器之一。它的主要作用是根据请求的URL将请求路由到适当的目标微服务。这个过滤器是必需的,因为API网关通常要处理多个微服务,而路由过滤器负责将请求发送到正确的微服务。

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("example_route", r -> r
            .path("/example/**")
            .uri("http://example.com"))
        .build();
}

在上面的示例中,我们创建了一个自定义的路由配置,将以/example/开头的请求路由到http://example.com这个目标微服务。

2. Gateway Filter(全局过滤器)

Gateway Filter是Spring Cloud Gateway中的全局过滤器,它可以应用到所有的路由请求上。全局过滤器通常用于实现与安全性、性能监控和日志记录等相关的全局功能。

以下是一个示例,展示如何创建一个全局的Gateway Filter:

@Bean
public GlobalFilter customGlobalFilter() {
    return (exchange, chain) -> {
        // 在此处编写全局过滤器逻辑
        ServerHttpRequest request = exchange.getRequest();
        // 可以进行各种处理,如请求日志记录、性能监控等
        return chain.filter(exchange);
    };
}

3. Pre Filter(前置过滤器)

前置过滤器是在请求被路由到目标微服务之前执行的过滤器。它可以用于修改请求、记录日志、添加头信息等操作。前置过滤器通常用于请求处理前的预处理任务。

在这里插入图片描述

以下是一个前置过滤器的示例,它用于在请求头中添加一个自定义的标头:

@Bean
public GlobalFilter customPreFilter() {
    return (exchange, chain) -> {
        ServerHttpRequest request = exchange.getRequest().mutate()
            .header("X-Custom-Header", "Custom-Value")
            .build();
        return chain.filter(exchange.mutate().request(request).build());
    };
}

4. Post Filter(后置过滤器)

后置过滤器是在请求被路由到目标微服务之后执行的过滤器。它可以用于修改响应、记录日志、添加响应头信息等操作。后置过滤器通常用于请求处理后的后续处理任务。
在这里插入图片描述

以下是一个后置过滤器的示例,它用于在响应头中添加一个自定义的标头:

@Bean
public GlobalFilter customPostFilter() {
    return (exchange, chain) -> {
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            ServerHttpResponse response = exchange.getResponse();
            response.getHeaders().add("X-Custom-Header", "Custom-Value");
        }));
    };
}

5. Error Filter(错误过滤器)

错误过滤器是在请求或响应过程中发生错误时执行的过滤器。它通常用于处理异常情况,例如返回特定的错误响应、记录错误日志等。

以下是一个错误过滤器的示例,它用于处理异常并返回自定义的错误响应:

@Bean
public GlobalFilter customErrorFilter() {
    return (exchange, chain) -> {
        return chain.filter(exchange).onErrorResume(ex -> {
            ServerHttpResponse response = exchange.getResponse();
            if (ex instanceof CustomException) {
                response.setStatusCode(HttpStatus.BAD_REQUEST);
                return response.setComplete();
            }
            return Mono.error(ex);
        });
    };
}

6. Rewrite Path Filter(路径重写过滤器)

路径重写过滤器用于修改请求的URL路径。它可以用于将请求路由到不同的路径或微服务,或者用于隐藏后端微服务的实际路径。

以下是一个路径重写过滤器的示例,它将请求的路径从/api/v1/resource重写为/v1/resource

@Bean
public GlobalFilter customRewritePathFilter() {
    return (exchange, chain) -> {
        ServerHttpRequest request = exchange.getRequest();
        URI uri = request.getURI();
        URI newUri = UriComponentsBuilder.fromUri(uri)
            .path("/v1" + uri.getPath())
            .build()
            .toUri();
        ServerHttpRequest modifiedRequest = request.mutate().uri(newUri).build();
        return chain.filter(exchange.mutate().request(modifiedRequest).build());
    };
}

7. Rate Limit Filter(速率限制过滤器)

速率限制过滤器用于控制请求的速率,防止过多的请求导致系统负载过高。它可以基于时间窗口内的请求次数来限制速率。

以下是一个速率限制过滤器的示例,它限制每个IP地址在一分钟内最多只能发送100个请求:

@Bean
public KeyResolver ipKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}

@Bean
public CustomKeyResolver customKeyResolver() {
    return new CustomKeyResolver();
}

public class CustomKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        // 在此处编写自定义的速率限制逻辑
        return Mono.just("custom-key");
    }
}

上述示例中,我们使用ipKeyResolver来限制每个IP地址的请求速率,并使用customKeyResolver来进行自定义的速率限制。

8. Strip Prefix Filter(前缀删除过滤器)

前缀删除过滤器用于删除请求的URL路径前缀。它通常用于将请求从网关路由到后端微服务时,去掉不需要的前缀。

以下是一个前缀删除过滤器的示例,它删除请求路径的前缀/api

@Bean
public GlobalFilter customStripPrefixFilter() {
    return (exchange, chain) -> {
        ServerHttpRequest request = exchange.getRequest();
        URI uri = request.getURI();
        URI newUri = UriComponentsBuilder.fromUri(uri)
            .path(uri.getPath().replaceFirst("/api", ""))
            .build()
            .toUri();
        ServerHttpRequest modifiedRequest = request.mutate().uri(newUri).build();
        return chain.filter(exchange.mutate().request(modifiedRequest).build());
    };
}

结论

Spring Cloud Gateway提供了丰富的过滤器功能,使您能够轻松地处理请求和响应,实现各种功能,如路由、安全性、日志记录、速率限制等。通过合理配置和组合这些过滤器,您可以构建强大、灵活且高度可定制的API网关,满足不同场景下的需求。

在这里插入图片描述

在实际项目中,根据具体的业务需求和安全策略,您可以选择使用适当的过滤器来增强您的API网关。希望本文对于理解Spring Cloud Gateway中各个过滤器的作用有所帮助,也能够帮助您更好地构建微服务架构中的API网关。
在这里插入图片描述

如果您有兴趣,可以尝试自己编写和定制过滤器,以满足特定的需求。通过深入研究和实践,您将更好地掌握Spring Cloud Gateway的强大功能,从而构建出高效、可靠的微服务系统。祝您在API网关的使用中取得成功!


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

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

相关文章

【刷题笔记10.6】LeetCode:汉明距离

LeetCode&#xff1a;汉明距离 一、题目描述 两个整数之间的汉明距离是指这两个数字对应二进制位不同的位置的数目。 给你两个整数x 和 y&#xff0c;计算并返回他们之间的汉明距离。 二、分析及代码实现 对于汉明距离问题我们其实可以将其转换为&#xff1a;计算x 和 y按…

U盘作为启动盘安装苹果OS X操作系统

如何制作 macOS USB启动盘&#xff1f;如何创建可引导的 macOS 安装器&#xff1f;接下来就为大家带来可引导的苹果电脑 macOS 系统U盘启动盘制作教程。U盘是我们在工作和生活中的好帮手&#xff0c;能储存和传递数据文件&#xff0c;重要的是&#xff0c;U盘还可以制作成苹果电…

leetcode - 365周赛

一&#xff0c;2873.有序三元组中的最大值 I ​ 该题的数据范围小&#xff0c;直接遍历&#xff1a; class Solution {public long maximumTripletValue(int[] nums) {int n nums.length;long ans 0;for(int i0; i<n-2; i){for(int ji1; j<n-1; j){for(int kj1; k<…

矩阵键盘的扫描原理与基础应用

基础知识 原理图 首先需要先将 J5 跳帽放到1和2之间。 表示选择的是矩阵键盘。 简化原理图 扫描原理&#xff1a; 以左上角按键为例。 先向 R1 输出低电平&#xff0c;向 R2&#xff0c;R3&#xff0c;R4 输出高电平。 再然后向 C1&#xff0c;C2&#xff0c;C3&#xff…

在Linux中软链接和硬链接的区别是什么?

2023年10月6日&#xff0c;周五晚上 目录 软链接(SymbolicLink):硬链接(HardLink):区别: 软链接(SymbolicLink): 软链接本身只是一个指向其他文件或目录的指针,不占用任何磁盘空间。软链接的修改或删除不会影响原文件。软链接可以指向不同文件系统中的文件。 硬链接(HardLink…

Cookie和Session详解以及结合生成登录效果

目录 引言 1.Cookie中的数据从哪来数据长啥样&#xff1f; 2.Cookie有什么作用&#xff1f; 3.cookie与session的工作关联&#xff1f; 4.Cookie到哪去&#xff1f; 5.Cookie如何存&#xff1f; 6.Session 7.Cookie与Session的关联与区别 8.通过代码理解 8.1 相关代码 8.2…

c++学习之 继承的方式

在C中&#xff0c;继承方式&#xff08;或继承访问权限&#xff09;有三种&#xff1a;public、protected 和 private&#xff0c;它们决定了派生类&#xff08;子类&#xff09;对基类&#xff08;父类&#xff09;成员的访问权限&#xff0c;它们之间的区别如下&#xff1a; …

局部放电发生因素与局部放电试验的重要性

局部放电发生的几个因素&#xff1a;   ①电场过于集中于某点&#xff1b;   ②固体介质有气泡&#xff0c;有害杂质未除净&#xff1b;   ③油中含水、含气、有悬浮微粒&#xff1b;   ④不同的介质组合中&#xff0c;在界面处有严重的电场畸变。   局部放电试验的重…

【小工具-生成合并文件】使用python实现2个excel文件根据主键合并生成csv文件

1 小工具说明 1.1 功能说明 一般来说&#xff0c;我们会先有一个老的文件&#xff0c;这个文件内容是定制好相关列的表格&#xff0c;作为每天的报告。 当下一天来的时候&#xff0c;需要根据新的报表文件和昨天的报表文件做一个合并&#xff0c;合并的时候就会出现有些事新增…

信息学奥赛一本通-编程启蒙3330:【例56.1】 和为给定数

3330&#xff1a;【例56.1】 和为给定数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 625 通过数: 245 【题目描述】 现给出若干个整数&#xff0c;询问其中是否有一对数的和等于给定的数。 【输入】 共三行&#xff1a; 第一行是整数nn(0<n≤100,000)&…

指数分布优化器(EDO)(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

局部放电发生的现象特点以及解决方案

局部放电发生的现象特点&#xff1a;   1、局部放电是局部过热&#xff0c;电器元件和机械元件老化的预兆&#xff1b;   2、局部放电趋势是局放随着时间的上升指数&#xff0c;这是个曲折的过程&#xff0c;某个阶段可能下降&#xff0c;但某个阶段上升&#xff1b;   3…

C# - Opencv应用(1) 之VS下环境配置详解

C# - Opencv应用&#xff08;1&#xff09; 之VS下环境配置详解 有时候&#xff0c;单纯c#做前端时会联合C实现的dll来落地某些功能由于有时候会用C - Opencv实现算法后封装成dll&#xff0c;但是有时候会感觉麻烦&#xff0c;不如直接通过C#直接调用Opencv在此慢慢总结下C# -…

练[极客大挑战 2019]RCE ME

[极客大挑战 2019]RCE ME 文章目录 [极客大挑战 2019]RCE ME掌握知识解题思路关键paylaod 掌握知识 ​ RCE无数字和字母的bypass&#xff0c;取反 异或 递增 解题思路 打开题目链接&#xff0c;发现是代码审计的题目&#xff0c;而且代码比较简单&#xff0c;似乎关键就是RC…

一个很愚蠢的游戏(中)!!!

系列文章目录 c小游戏_睡觉觉觉得的博客-CSDN博客一个很愚蠢的游戏(上)&#xff01;&#xff01;&#xff01;_睡觉觉觉得的博客-CSDN博客 文章目录 系列文章目录前言一、个人名片二、描述三、代码1.代码 总结 前言 无 &#xff08;嘻嘻&#xff09; 一、个人名片 个人主页&a…

[NewStarCTF 2023 公开赛道] week1

最近没什么正式比赛&#xff0c;都是入门赛&#xff0c;有moectf,newstar,SHCTF,0xGame都是漫长的比赛。一周一堆制。 这周newstar第1周结束了&#xff0c;据说py得很厉害&#xff0c;第2周延期了&#xff0c;什么时候开始还不一定&#xff0c;不过第一周已经结束提交了&#…

python --在2x2的子图中绘制三个子图,并使第三个子图居中

python – 在2x2的子图中绘制三个子图&#xff0c;并使第三个子图居中 基于python&#xff0c;绘制一个2x2的子图范围&#xff0c;但是只显示3个子图&#xff0c;并使得第三个子图居中显示’ 思路&#xff1a; 建立一个2x2的子图前两个正常画&#xff0c;其中第三个子图跨越两…

[开源项目推荐]privateGPT使用体验和修改

文章目录 一.跑通简述二.解读ingest.py1.导入库和读取环境变量2.文档加载3.文档处理&#xff08;调用文件加载函数和文本分割函数&#xff09; 三.injest.py效果演示1.main函数解读2.测试 四.修改代码&#xff0c;使之适配多知识库需求1.修改配置文件&#xff1a;constants.py2…

H桥级联型五电平三相逆变器Simulink仿真模型

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

天线基础知识概述

一、天线方向图(一) 图1 天线方向图的辐射能量 辐射能量完全集中在天线方向图的主瓣。这样就不会有副瓣。所有的辐射能量都在天线的半功率波束宽度内。在这些−3dB边界之外,没有能量辐射。在−3dB范围内,能量分布均匀。为了能够对天线进行计算,通常会对计算进行一些简化甚…