Spring Cloud Gateway(分发请求)

Spring Cloud Gateway 的过滤器和 Spring MVC 的拦截器的区别

过滤器用于整个微服务系统的网关层控制,拦截器则用于单个微服务内部的控制层请求处理。

1. 作用范围
  • Spring Cloud Gateway 过滤器:过滤器的作用范围是在网关层,主要在请求进入后端服务之前和响应返回客户端之前执行。它处理的是网关中的所有流量,可以对来自客户端的请求进行预处理,并决定是否转发给后端服务,适用于微服务架构中的网关场景。

  • Spring MVC 拦截器:拦截器的作用范围是在单个微服务或应用内部的控制层(Controller)请求,作用于处理 HTTP 请求的 Spring MVC 控制器(Controller)之前和之后,主要用于单个服务的请求处理,不适用于跨服务请求的场景。

2. 执行时机
  • 过滤器:过滤器在请求到达后端服务前执行,可以修改请求的路径、请求头、响应头等内容。一般分为 Pre Filter(请求前过滤器)和 Post Filter(响应后过滤器),可以决定是否拦截请求或修改响应内容。过滤器通常对整个网关服务的请求流进行控制,适用于负载均衡、路由分发和限流等。

  • 拦截器:拦截器在单个服务的控制器方法调用前和调用后执行,常用于身份验证、日志记录、会话管理等功能,控制请求在具体 Controller 层的行为。拦截器无法修改网关层的流量请求,也无法对整个微服务系统中的请求流量进行统一管理。

3. 使用场景
  • 过滤器的使用场景

    • 路由:将请求分发到不同的后端微服务。
    • 身份认证和授权:在请求到达后端服务之前对请求进行身份验证或添加认证信息。
    • 限流与熔断:对高并发场景的请求流量进行限流、熔断保护。
    • 日志记录:记录跨服务的请求和响应日志,便于追踪和监控。
    • 添加、修改请求或响应头:在请求进入网关时或响应返回时修改头信息。
  • 拦截器的使用场景

    • 权限检查:在控制器执行前,检查用户的权限是否符合业务要求。
    • 参数验证:在请求到达控制器前,验证请求参数的合法性。
    • 日志记录:记录进入控制器的请求信息和返回结果,用于调试和监控。
    • 异常处理:在请求完成后统一处理和记录异常情况。
4. 配置方式与依赖关系
  • 过滤器:过滤器是 Spring Cloud Gateway 的核心功能,配置在网关服务的 application.yml 中,并且可以配置全局过滤器或局部过滤器,作用于网关中的所有请求或特定的路由路径。它依赖 Spring Cloud Gateway 组件,在网关的微服务架构中使用。

  • 拦截器:拦截器依赖 Spring MVC,在单个 Spring Boot 应用程序中配置和使用。拦截器通常在配置类中进行注册,并通过实现 HandlerInterceptor 接口来自定义拦截逻辑。它不会作用于跨服务的请求,只处理单个服务的请求。

5.总结
特性Spring Cloud Gateway 过滤器Spring MVC 拦截器
作用范围网关层(跨微服务)单个服务
执行时机请求到达后端服务前,响应返回客户端前Controller 调用前后
使用场景路由、限流、认证、修改头信息等权限检查、日志记录、参数验证等
配置方式application.yml 或自定义过滤器类实现 HandlerInterceptor 接口
依赖组件Spring Cloud GatewaySpring MVC

步骤 1:创建网关项目并添加依赖

我们先创建一个 Spring Boot 项目并添加 Spring Cloud Gateway 的依赖。网关的基本配置会依赖这些依赖项。

  1. 创建项目:在 IntelliJ IDEA 或者通过 Spring Initializr 创建一个 Spring Boot 项目。
  2. 添加依赖:在 pom.xml 中引入 Spring Cloud Gateway 依赖。

pom.xml 中,加入以下内容:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Spring Cloud Gateway 依赖提供了核心的网关功能,而 Actuator 依赖可以帮助我们监控和管理网关。

步骤 2:编写启动类

接下来,我们需要一个启动类来运行我们的网关服务。这是一个简单的 Spring Boot 启动类,将帮助我们启动项目。

src/main/java 目录下创建一个 GatewayApplication.java,代码如下:

package com.example.gateway;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}

启动类 GatewayApplication 的作用是启动 Spring Boot 应用,使网关服务可以监听客户端的请求。

步骤 3:配置基本的路由规则

在网关中,路由规则定义了请求路径和目标服务之间的映射关系。通过这些配置,网关可以根据请求路径将请求转发到不同的微服务。

3.1 创建 application.yml 文件

src/main/resources 目录下创建一个 application.yml 文件,用于定义网关配置。

3.2 定义路由规则

假设我们有三个服务模块:easychat-autheasychat-chateasychat-filesystem。我们希望根据请求路径的不同,将请求转发到相应的服务。

application.yml 中添加以下内容:

server:port: 8080  # 设置网关服务的端口spring:cloud:gateway:routes:- id: easychat-auth-route   # 定义路由的IDuri: lb://easychat-auth   # 目标服务地址,lb:// 表示使用负载均衡predicates:- Path=/auth/**         # 当路径匹配 /auth/** 时,将请求转发到 easychat-auth 服务- id: easychat-chat-routeuri: lb://easychat-chatpredicates:- Path=/chat/**- id: easychat-filesystem-routeuri: lb://easychat-filesystempredicates:- Path=/filesystem/**

配置解释

  • id:为每条路由规则定义一个唯一的 ID,便于管理。
  • uri:目标服务的 URI,这里使用 lb:// 表示服务地址是通过负载均衡机制来解析的。
  • predicates:用于定义路由条件。在这里,我们使用 Path 谓词,通过请求路径来匹配对应的服务模块。

通过这种方式,当网关接收到一个请求时,会检查请求路径:

  • 如果路径匹配 /auth/**,则将请求转发到 easychat-auth 服务。
  • 如果路径匹配 /chat/**,则将请求转发到 easychat-chat 服务。
  • 如果路径匹配 /filesystem/**,则将请求转发到 easychat-filesystem 服务。

步骤 4:配置负载均衡

为了让 lb:// 生效,我们通常需要服务注册中心(比如 Eureka 或 Consul)。在没有服务注册中心的情况下,也可以在 application.yml 中配置静态的负载均衡服务地址。

例如,我们可以指定 easychat-auth 服务的地址为多个实例来模拟负载均衡:

spring:cloud:gateway:routes:- id: easychat-auth-routeuri: lb://easychat-authpredicates:- Path=/auth/**loadbalancer:clients:easychat-auth:instances:- http://localhost:8081- http://localhost:8082

以上配置中:

  • easychat-auth 的请求会在 localhost:8081localhost:8082 之间进行负载均衡。

步骤 5:配置全局过滤器

过滤器可以用于所有路由(称为全局过滤器),也可以用于特定的路由(称为局部过滤器)。我们从配置全局过滤器开始,举例说明如何记录请求的基本信息,比如请求时间和路径。

application.yml 中,可以配置一个全局过滤器,用于在所有请求经过网关时记录日志。我们可以使用 LoggingFilter 来实现这一功能。

application.yml 文件中添加以下内容:

spring:cloud:gateway:default-filters:- name: DedupeResponseHeader    # 移除重复的响应头args:strategy: RETAIN_FIRST      # 保留第一个重复的响应头- name: AddRequestHeader        # 向请求头中添加信息args:X-Request-Gateway: EasyChatGateway- name: RequestRateLimiter      # 基于 Redis 实现的限流器args:redis-rate-limiter:replenishRate: 10         # 每秒允许通过的请求数burstCapacity: 20         # 最大突发流量

在这里:

  • DedupeResponseHeader:移除响应中重复的头部信息,防止信息冗余。
  • AddRequestHeader:给请求头添加一个标识 X-Request-Gateway,可以用于标识该请求通过网关。
  • RequestRateLimiter:使用 Redis 实现限流,这里限制每秒允许 10 个请求,突发流量上限为 20。

步骤 6:配置局部过滤器(仅对某些路由生效)

局部过滤器只对特定的路由生效,下面我们给 easychat-auth 路由配置一些常用的过滤器,比如 请求头修改响应头添加

application.yml 中修改 easychat-auth 路由的配置,增加过滤器设置:

spring:cloud:gateway:routes:- id: easychat-auth-routeuri: lb://easychat-authpredicates:- Path=/auth/**filters:- AddRequestHeader=X-Auth-Token, "Auth123"   # 添加请求头- AddResponseHeader=X-Response-Gateway, "EasyChat-Gateway"  # 添加响应头- RewritePath=/auth/(?<segment>.*), /$\\{segment}  # 重写请求路径

解释:

  • AddRequestHeader:在请求头中添加 X-Auth-Token,值为 "Auth123",可以用于认证或日志记录。
  • AddResponseHeader:在响应头中添加 X-Response-Gateway,值为 "EasyChat-Gateway",标识该响应经过了网关。
  • RewritePath:将 /auth/** 的路径重写为 / 后的部分。例如,请求 /auth/login 将重写为 /login,方便后端服务不需要额外处理路径前缀。

步骤 7:自定义过滤器

如果需要更复杂的逻辑,可以编写自定义过滤器。例如,可以创建一个过滤器来记录请求的时间或检查某些请求参数。以下是创建自定义过滤器的步骤:

7.1 创建过滤器类

src/main/java/com/example/gateway/filter 路径下创建一个名为 CustomLoggingFilter.java 的文件:

package com.example.gateway.filter;import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class CustomLoggingFilter extends AbstractGatewayFilterFactory<CustomLoggingFilter.Config> {private static final Logger logger = LoggerFactory.getLogger(CustomLoggingFilter.class);public CustomLoggingFilter() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {long startTime = System.currentTimeMillis();return chain.filter(exchange).then(Mono.fromRunnable(() -> {long endTime = System.currentTimeMillis();logger.info("Request to {} took {} ms", exchange.getRequest().getURI(), (endTime - startTime));}));};}public static class Config {// 配置类可以存放一些自定义配置}
}

解释:

  • 该过滤器在请求处理前记录开始时间,然后在响应时计算请求的耗时,并输出到日志。
  • apply() 方法返回的 GatewayFilter 处理请求并记录时间。
7.2 将自定义过滤器应用到某个路由

application.yml 中,将 CustomLoggingFilter 添加到 easychat-chat 路由:

spring:cloud:gateway:routes:- id: easychat-chat-routeuri: lb://easychat-chatpredicates:- Path=/chat/**filters:- name: CustomLoggingFilter

这样,每次访问 /chat/** 的请求都会触发自定义日志记录,记录请求的处理耗时。

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

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

相关文章

【spring 】Spring Cloud Gateway 的Filter学习

介绍和使用场景 Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Project Reactor 的 API 网关&#xff0c;它旨在为微服务架构提供一种简单而有效的方式来处理请求路由、过滤、限流等功能。在 Spring Cloud Gateway 中&#xff0c;Filter 扮演着非常重要的角色&#…

opencv(c++)图像的灰度转换

opencv(c)图像的灰度转换 quickopencv.h #pragma once #include <opencv2/opencv.hpp> using namespace cv; class QuickDemo { public:void colorSpace_Demo(Mat& image); };quickopencv.cpp #include "quickopencv.h"// QuickDemo类中的颜色空间演示函…

problem forward和solution backward有什么区别

Note: 在具体研究中&#xff0c;problem forward是先提出问题&#xff0c;然后围绕着科学问题设计出完美的解决方案&#xff1b;而solution backward是先盘算自己有哪些技术&#xff0c;有哪些解决方案&#xff0c;反过来去寻找和定义问题。

C++构造函数详解

构造函数详解&#xff1a;C 中对象初始化与构造函数的使用 在 C 中&#xff0c;构造函数是一种特殊的成员函数&#xff0c;它在创建对象时自动调用&#xff0c;用来初始化对象的状态。构造函数帮助我们确保每个对象在被创建时就处于一个有效的状态&#xff0c;并且在不传递任何…

使用WebSocket技术实现Web应用中的实时数据更新

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用WebSocket技术实现Web应用中的实时数据更新 使用WebSocket技术实现Web应用中的实时数据更新 使用WebSocket技术实现Web应用中…

[N1CTF 2018]eating_cms

打开题目 只有个登录框&#xff0c;其他什么都没有&#xff0c;尝试了一下弱口令&#xff0c;没能成功 尝试访问一下register.php&#xff0c;看看能不能注册个账号 注册页面&#xff0c;随便注册个账号登陆一下 url中感觉是个注入点&#xff0c;尝试使用file伪协议读取一下us…

算法之二分查找优化:leetcode34:在排序数组中查找元素的第一个和最后一个位置

题干 分析 问题背景 给定一个已排序的数组&#xff0c;目标是找到一个给定的目标值 target 在数组中的 第一个位置 和 最后一个位置。如果目标值不存在&#xff0c;返回 [-1, -1]。 由于题干要求的时间复杂度是 O(log n)&#xff0c;并且数组是有序的&#xff0c;考虑使用二分…

【3D Slicer】的小白入门使用指南九

定量医学影像临床研究与实践 任务 定量成像教程 定量成像是从医学影像中提取定量测量的过程。 本教程基于两个定量成像的例子构建: - 形态学:缓慢生长肿瘤中的小体积变化 - 功能:鳞状细胞癌中的代谢活动 第1部分:使用变化跟踪模块测量脑膜瘤的小体积变化第2部分:使用PET标…

为什么要使用Ansible实现Linux管理自动化?

自动化和Linux系统管理 多年来&#xff0c;大多数系统管理和基础架构管理都依赖于通过图形或命令行用户界面执行的手动任务。系统管理员通常使用清单、其他文档或记忆的例程来执行标准任务。 这种方法容易出错。系统管理员很容易跳过某个步骤或在某个步骤上犯错误。验证这些步…

C# 实现对指定句柄的窗口进行键盘输入的实现

在C#中实现对指定句柄的窗口进行键盘操作&#xff0c;可以通过多种方式来实现。以下是一篇详细的指南&#xff0c;介绍如何在C#中实现这一功能。 1. 使用Windows API函数 在C#中&#xff0c;我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的…

JavaWeb--MySQL

1. MySQL概述 首先来了解一下什么是数据库。 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音…

Qt学习笔记(四)多线程

系列文章目录 Qt开发笔记&#xff08;一&#xff09;Qt的基础知识及环境编译&#xff08;泰山派&#xff09; Qt学习笔记&#xff08;二&#xff09;Qt 信号与槽 Qt学习笔记&#xff08;三&#xff09;网络编程 Qt学习笔记&#xff08;四&#xff09;多线程 文章目录 系列文章…

Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)

作者&#xff1a;来自 Elastic Ranjana Devaji, Dana Juratoni Elasticsearch 8.16 引入了 BBQ&#xff08;Better Binary Quantization - 更好的二进制量化&#xff09;—— 一种压缩向量化数据的创新方法&#xff0c;其性能优于传统方法&#xff0c;例如乘积量化 (Product Qu…

Flume和kafka的整合

1、Kafka作为Source 【数据进入到kafka中&#xff0c;抽取出来】 在flume的conf文件夹下&#xff0c;有一个flumeconf 文件夹&#xff1a;这个文件夹是自己创建的 创建一个flume脚本文件&#xff1a; kafka-memory-logger.conf Flume 1.9用户手册中文版 — 可能是目前翻译最完…

现代密码学|古典密码学例题讲解|AES数学基础(GF(2^8)有限域上的运算问题)| AES加密算法

文章目录 古典密码凯撒密码和移位变换仿射变换例题多表代换例题 AES数学基础&#xff08;GF&#xff08;2^8&#xff09;有限域上的运算问题&#xff09;多项式表示法 | 加法 | 乘法X乘法模x的四次方1的乘法 AES加密算法初始变换字节代换行移位列混合轮密钥加子密钥&#xff08…

3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)

3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用) 文章目录 3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)前言1. Spring Cloud Eureka 的概述1.1 服务治理概述1.2 服务注册与发现 2. 实践&#xff1a;创建单机 Eureka Server 注册中心2.1 需求说明 图解…

视频孪生技术在金融银行网点场景中的应用价值

作为国民经济重要的基础行业&#xff0c;金融行业在高速发展的同时衍生出业务纠纷、安全防范、职能管理等诸多问题&#xff0c;对安全防范和监督管理提出了更高的要求。因此&#xff0c;如何能更好的利用视频监控系统价值&#xff0c;让管理人员更简便的浏览监控视频、更快速的…

武汉EI学术会议一览表

武汉近期将举办BDDM2024大数据会议、ASIM2024智能制造会议、ICSGPS2025电网会议&#xff0c;吸引国内外学者参与&#xff0c;推动科技创新与产业发展&#xff0c;录用论文将提交EI索引。 武汉EI学术会议一览表 1.第二届大数据与数据挖掘国际会议&#xff08;BDDM 2024&#xf…

LeetCode Hot100 15.三数之和

题干&#xff1a; 思路&#xff1a; 首先想到的是哈希表&#xff0c;类似于两数之和的想法&#xff0c;共两层循环&#xff0c;将遍历到的第一个元素和第二个元素存入哈希表中&#xff0c;然后按条件找第三个元素&#xff0c;但是这道题有去重的要求&#xff0c;哈希表实现较为…

html + css 自适应首页布局案例

文章目录 前言一、组成二、代码1. css 样式2. body 内容3.全部整体 三、效果 前言 一个自适应的html布局 一、组成 整体居中&#xff0c;宽度1200px&#xff0c;小屏幕宽度100% 二、代码 1. css 样式 代码如下&#xff08;示例&#xff09;&#xff1a; <style>* {…