4. Spring Cloud Gateway 入门与使用

news/2025/2/25 7:05:52

一、什么是网关?

网关是一种网络设备,用于连接两个或多个不同网络,将数据从一个网络转发到另一个网络。它充当了两个网络之间的桥梁,负责转发数据并处理来自不同网络的通信协议转换。

二、网关有什么用?

网关的主要作用有以下几个:

  1. 路由功能:网关可以根据目标地址的不同,选择最佳的路径将数据包从源网络路由到日标网络。它通过维护路由表来确定数据包的转发方向,并选择最优的路径。

  2. 安全控制(统一认证授权):网关可以实施网络安全策略,对进出的数据包进行检查和过滤。它可以验证和授权来自源网络的数据包,并阳止未经授权的访问。防火墙是一种常见的网关设备,用于过滤和保护网络免受恶意攻击和未经授权的访问。

  1. 协议转换:不同网络使用不同的通信协议,网关可以进行协议转换,使得不同网络的设备可以互相通信。例如,例如将 HTTPS 协议转换成 HTTP 协议。

  2. 网络地址转换(NAT):网关还可以执行网络地址转换,将内部网络使用的私有 IP 地址转换为外部网络使用的公共 IP 地址,以实现多台计算机共享一个公共 IP 地址出去上网。

三、Spring Cloud Gateway 组成

  1. 路由(Route):定义了请求应该被转发到哪个目标地址。路由由 ID、目标 URI、断言和过滤器组成。通过面置多个路由,可以实现不同请求的路由规则。

  2. 断言(Predicate):用于匹配请求的条件,如果请求匹配断言条件,则会被路由到对应的目标地址。断言可以基于请求的路径、请求头、请求参数等信息进行匹配。

  1. 过滤器(Filter):用于在请求路由前或路由后进行一些处理,如添加头部信息、修改请求体等。过滤器可以在全局范围或特定路由范围内配置,多个过滤器可以组成过滤器链。

四、Spring Cloud Gateway 基础使用 ★

Spring Cloud Gateway 使用步骤如下

  1. 添加 Gateway 依赖。

  2. 设置网关路由规则。

具体实现如下

添加依赖

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

设置路由规则

spring:
  cloud:
    gateway:
      routes:
      - id: userservice
        uri: http://localhost:9090 # 路由
        predicates: # 断言
        - Path=/user/**
        - Header=X-Header-Flag, \d+
      - id: orderservice
        uri: http://localhost:9091
        predicates:
        - Path=/order/**
server:
  port: 10086

五、匹配多个 Path ★

Spring Cloud Gateway(网关路由规则)中是允许设置多个 Path 的,只需要在 Path 中使用英文逗号"“隔开即可

如下所示:

gateway :
        routes:
        - id: userservice
        uri: http://192.168.1.7:51627
        predicates:
        -Path=/user/**,/u/**

六、更多断言 (Predicate) 类型 ★

Spring Cloud Gateway 支持的断言类型目前有 12 种,包含以下这些:

  1. 根据时间匹配(包含 3 种类型)

a.After:请求在指定时间之后才匹配,

b.Before:请求在指定时间之前才匹配,

c.Between:请求在指定时间中间才匹配。

  1. Cookie:配置请求中的 Cookie 值。

  2. Header:配置请求中的 Header 值,

  1. Host:匹配请求头中的 Host 值,

  2. Method:匹配请求头中的 Method 的值。

  1. Path:匹配请求路径。

  2. Query:匹配请求参数。

  1. RemoteAddr:匹配请求的IP 地址,支持 IPV4 和IPV6

  2. Weight:根据权重来分发请求,权重根据 qroup 来计算,

  1. XForwardedRemoteAddr:根据X-Forwarded-For 所配

6.1 根据时间匹配

spring:
        cloud:
                gateway:
                        routes:
                        -id: userservice
                        uri: http://192.168.1.7:51627
                        predicates:
                        -Before=2023-11-02T19:05:08.020+08:00[Asia/shanghai]

八、过滤器

8.1 什么是过滤器?

过滤器通常用于拦截、处理或修改数据流或事件流,在数据流中执行特定的操作或转换。

8.2 为什么需要用过滤器?

  • 功能扩展和定制:过滤器可以用于对现有功能进行扩展和定制。通过拦截和处理数据流或事件流,可以修改数据,增加额外的功能逻辑,实现特定的业务需求。例如,可以使用过滤器在请求之前进行身份验证、权限控制,或者在响应之后进行日志记录、数据转换等操作。

  • 数据校验和过滤:过滤器可以用于对数据进行校验和过滤。在接收到数据之后,可以使用过滤器对数据进行检查,验证数据的合法性,过滤掉无效或不符合要求的数据。这有助于保证数据的准确性、完整性和安全性。

  • 安全保护:过滤器可以用于提供安全保护措施。可以使用过滤器对输入的请求进行检查和清洗,以防止潜在的安全漏洞,例如跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等攻击。过滤器还可以进行访问控制,验证权限和实施安全策略。

  • 性能优化:过滤器可以用于性能优化。例如,在数据处理流水线中,可以使用过滤器对数据进行转换、过滤或缓存,以提高处理速度和效率。过滤器还可以用于数据压缩、缓存预热等场景,减少数据传输和处理的成本。

  • 统一处理和逻辑复用:过滤器提供了一种统一的处理方式,可以在不同的组件或模块上应用相同的逻辑或处理方式。通过将处理逻辑抽象为过滤器,可以避免重复代码、统一错误处理和异常处理等,提高代码的复用性和可维护性。

8.3 Spring Cloud Gateway 过滤器

Spring Cloud Gateway 是一个基于 Spring WebFlux 的 API 网关,提供了路由和过滤器功能。过滤器在请求和响应的生命周期中起到重要作用。Spring Cloud Gateway 提供了三种类型的过滤器:内置过滤器、全局过滤器和自定义过滤器。

1. 内置过滤器 filters: ★

内置过滤器是 Spring Cloud Gateway 提供的预定义过滤器,常用于常见的网关功能,如鉴权、限流、重试等。

常见的内置过滤器有:

  • AddRequestHeader

  • AddRequestParameter

  • AddResponseHeader

  • DedupeResponseHeader

  • PrefixPath

  • RedirectTo

  • RemoveRequestHeader

  • RemoveResponseHeader

  • RewritePath

  • SetPath

  • SetRequestHeader

  • SetResponseHeader

  • StripPrefix

示例代码:

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: http://httpbin.org:80
        filters:
        - AddRequestHeader=X-Request-Example, ExampleValue
        predicates:
        - Path=/get

在这个示例中,AddRequestHeader 过滤器会在请求头中添加 X-Request-Example 头,值为 ExampleValue

2. 全局过滤器 implements GlobalFilter, Ordered ★

全局过滤器是应用于所有路由的过滤器。它们通常用于跨所有路由的通用功能,如日志记录、监控等。

示例代码:

java">import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.factory.rewrite.ModifyRequestBodyGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("Global Pre Filter executed");
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            System.out.println("Global Post Filter executed");
        }));
    }

    @Override
    public int getOrder() {
        return -1; // Order of the filter
    }
}

在这个示例中,CustomGlobalFilter 是一个全局过滤器,它会在每个请求前后打印日志。

3. 自定义过滤器 AbstractGatewayFilterFactory<CustomFilter.Config>

自定义过滤器是用户根据具体需求编写的过滤器,可以应用于特定路由或全局。

示例代码:

java">import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {

    public CustomFilter() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            System.out.println("Custom Pre Filter executed");
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                System.out.println("Custom Post Filter executed");
            }));
        };
    }

    public static class Config {
        // Configuration properties for the filter
    }
}

在这个示例中,CustomFilter 是一个自定义过滤器,它会在特定路由的请求前后打印日志。

配置自定义过滤器:
spring:
  cloud:
    gateway:
      routes:
      - id: custom_filter_route
        uri: http://httpbin.org:80
        filters:
        - name: CustomFilter
        predicates:
        - Path=/get

在这个配置中,CustomFilter 会应用于 /get 路径的请求。

总结

  • 内置过滤器:Spring Cloud Gateway 提供的预定义过滤器,适用于常见的网关功能。

  • 全局过滤器:应用于所有路由的过滤器,适用于跨所有路由的通用功能。

  • 自定义过滤器:用户根据具体需求编写的过滤器,可以应用于特定路由或全局。

通过这些过滤器,Spring Cloud Gateway 提供了灵活的请求和响应处理能力,满足各种网关需求。


http://www.niftyadmin.cn/n/5865134.html

相关文章

【个人开源】——从零开始在高通手机上部署sd(一)

代码:https://github.com/chenjun2hao/qualcomm.sd 从零基础开始&#xff0c;在自己的高通手机(骁龙8 gen1)上用NPU跑文生图stable diffusion模型。包含&#xff1a; 高通qnn下载安装sd模型浮点/量化导出在高通手机上用cpu跑浮点模型&#xff0c;htp跑量化模型 1. python依赖…

6.3 - UART串口数据发送之中断

文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验使用中断方式实现UART串口数据的连续发送。 2 系统框图 参见6.1。 3 软件设计 注意事项&#xff1a; 系统上电、程序下载后&#xff0c;此时TX FIFO虽然为空&#xff0c;但是并不会触发空中断&#xff1b;空中…

【高速公路——Tarjan】

题目 BFS暴力代码 60p #include <bits/stdc.h> using namespace std;const int N 1010; const int M 10010; int g[N][N]; int n, m; int h[N], e[M], ne[M], idx;void add(int a, int b) // 添加一条边a->b {e[idx] b, ne[idx] h[a], h[a] idx ; }void bfs(i…

vue2版本elementUI的table分页实现多选逻辑

1. 需求 我们需要在表格页上实现多选要求&#xff0c;该表格支持分页逻辑。 2. 认识属性 表格属性 参数说明类型可选值默认值data显示的数据array——row-key行数据的 Key&#xff0c;用来优化 Table 的渲染&#xff1b;在使用 reserve-selection 功能与显示树形数据时&…

UE5 Gameplay框架及继承关系详解

文章目录 前言一、核心类及其继承关系二、核心类的职责与协作2.1 Actor & Pawn2.2 Controller2.3 GameMode & GameState2.4 PlayerState2.5 HUD & UI 三、协作流程示例总结 前言 Unreal Engine 5&#xff08;UE5&#xff09;的 Gameplay 框架 是一个高度模块化的系…

OpenCV计算摄影学(1)图像修复(Inpainting)的函数inpaint()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用图像中选定区域的邻域来恢复该选定区域。 cv::inpaint 函数是 OpenCV 中用于图像修复&#xff08;Inpainting&#xff09;的一个重要函数。它…

Kafka面试题----Kafka是如何保证顺序消费的

在 Kafka 中&#xff0c;默认情况下消息是按分区进行顺序存储和读取的&#xff0c;但全局顺序消费&#xff08;即所有分区的消息按顺序消费&#xff09;较难实现。下面分别介绍 Kafka 按分区顺序消费以及实现全局顺序消费的相关内容。 按分区顺序消费 Kafka 本身可以保证单个…

机器人“战场”:创新、落地与未来

从1999年的机器管家&#xff0c;2001年的机器人小孩大卫&#xff0c;到2015年拥有自我意识的“查派”&#xff0c;在科幻电影里&#xff0c;人们赋予了对机器人的各种形象和想象。2018年&#xff0c;尽管只是实验室的试验品&#xff0c;但波士顿动力机器狗Spot的视频还是在国内…