Spring Cloud GateWay(4.1.4)

news2024/11/27 7:29:42

介绍

该项目提供了一个建立在 Spring 生态系统之上的 API 网关,包括:Spring 6、Spring Boot 3 和 Project Reactor。Spring Cloud Gateway 旨在提供一种简单而有效的方法来路由到 API,并为其提供跨领域关注点,例如:安全性、监控/指标和弹性。

Spring Cloud Gateway 有两种不同的版本:服务器和代理交换。每种风格都提供 WebFlux 和 MVC 兼容性。

  • Server 变体是一个功能齐全的 API 网关,可以独立使用,也可以嵌入到 Spring Boot 应用程序中。
  • Proxy Exchange 变体专门用于基于注释的 WebFlux 或 MVC 应用程序,并允许使用特殊 ProxyExchange 对象作为 Web 处理程序方法的参数。

Spring Cloud Gateway Reactive Server

引入 Spring Cloud Gateway

若要在项目中包含 Spring Cloud Gateway,请使用组 ID 为 且 org.springframework.cloud 工件 ID 为 spring-cloud-starter-gateway 的启动器。有关使用当前 Spring Cloud 发布系列设置构建系统的详细信息,请参阅 Spring Cloud 项目页面。

如果包含启动器,但不希望启用网关,请设置 spring.cloud.gateway.enabled=false 。

Spring Cloud Gateway 基于 Spring Boot、Spring WebFlux 和 Project Reactor 构建。因此,当您使用 Spring Cloud Gateway 时,许多熟悉的同步库(例如 Spring Data 和 Spring Security)和模式可能不适用。如果你不熟悉这些项目,我们建议你在使用 Spring Cloud Gateway 之前先阅读他们的文档,以熟悉一些新概念。

Spring Cloud Gateway 需要 Spring Boot 和 Spring Webflux 提供的 Netty 运行时。它不能在传统的 Servlet 容器中工作,也不能在作为 WAR 构建时工作。

Glossary(核心)

  • 路由:网关的基本构建块。它由 ID、目标 URI、谓词集合和筛选器集合定义。如果聚合断言为 true,则匹配路由。
  • 断言:这是一个 Java 8 函数断言。输入类型是 Spring Framework ServerWebExchange 。这使您可以匹配 HTTP 请求中的任何内容,例如标头或参数。
  • 筛选器:这些是使用特定工厂构建的 GatewayFilter 实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。

总结

web前端请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。

predicate就是我们的匹配条件;

filter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由

如何工作

下图提供了 Spring Cloud Gateway 工作原理的高级概述:

客户端向 Spring Cloud Gateway 发出请求。如果网关处理程序映射确定请求与路由匹配,则该请求将发送到网关 Web 处理程序。此处理程序通过特定于请求的筛选器链运行请求。筛选器被虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。执行所有“pre”过滤器逻辑。然后发出代理请求。发出代理请求后,将运行“post”筛选器逻辑。

配置路由断言工厂和网关筛选器工厂

快捷方式配置

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

前面的示例使用两个参数定义 Cookie 路由断言工厂:cookie 名称 mycookie 和要匹配 mycookievalue 的值。

完全展开的参数

完全扩展的参数看起来更像是具有名称/值对的标准 yaml 配置。通常,会有一个 name 密钥和一个 args 密钥。 args 键是键值对的映射,用于配置断言或筛选器。

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue

路由断言工厂

Spring Cloud Gateway 将路由作为 Spring WebFlux HandlerMapping 基础结构的一部分进行匹配。Spring Cloud Gateway 包含许多内置的路由断言工厂。所有这些断言都与 HTTP 请求的不同属性匹配。您可以将多个路由断言工厂与逻辑 and 语句组合在一起。

After/Before Route 断言工厂

After 路由断言工厂采用一个参数 a datetime (即 java ZonedDateTime )。此断言匹配在指定日期时间之后发生的请求。

Before 路由断言 工厂采用一个参数 a datetime (即 java ZonedDateTime )。此断言匹配在指定的 datetime .以下示例配置 before route 断言:

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

此路线符合 2017 年 1 月 20 日 17:42 Mountain Time (Denver) 之前提出的任何请求。

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

此路线符合 2017 年 1 月 20 日 17:42 Mountain Time (Denver) 之前提出的任何请求。

路由间断言工厂(between)

Between 路由断言工厂采用两个参数, datetime1 datetime2 它们是 java ZonedDateTime 对象。此断言匹配在 datetime1 之后和之前 datetime2 发生的请求。该 datetime2 参数必须位于 datetime1 之后。以下示例配置 between route 断言:

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

此路线符合 2017 年 1 月 20 日 17:42 山地时间(丹佛)之后和 2017 年 1 月 21 日 17:42 山地时间(丹佛)之前提出的任何请求。这对于维护时段可能很有用。

Cookie 路由断言工厂采用两个参数,cookie name 和 a regexp (Java 正则表达式)。此断言匹配具有给定名称且其值与正则表达式匹配的 cookie。以下示例配置 cookie 路由断言工厂:

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=chocolate, ch.p

此路由匹配具有名为 chocolate cookie 的请求,其值与 ch.p 正则表达式匹配。

标头路由断言工厂

Header 路由断言工厂采用两个参数,即 和 header a regexp (这是一个 Java 正则表达式)。此断言与具有给定名称的标头匹配,其值与正则表达式匹配。以下示例配置标头路由断言:

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+

如果请求具有名为 X-Request-Id 其值与 \d+ 正则表达式匹配的标头(即,它的值为一位或多位),则此路由匹配。

主机路由断言工厂

Host 路由断言工厂采用一个参数:主机名 patterns 列表。该图案是蚂 . 蚁风格的图案,作为分隔符。此断言与 Host 与模式匹配的标头匹配。以下示例配置主机路由断言:

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org

还支持 URI 模板变量(如 {sub}.myhost.org )。


如果请求的 Host 标头值为 www.somehost.org or beta.somehost.org 或 www.anotherhost.org ,则此路由匹配。


此谓词将 URI 模板变量(如 sub 前面示例中定义的 )提取为名称和值的映射,并将其 ServerWebExchange.getAttributes() 放在 中,并使用 中 ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE 定义的键。然后, GatewayFilter 这些值可供工厂使用

方法路由断言工厂

The Method Route Predicate Factory takes a methods argument which is one or more parameters: the HTTP methods to match. The following example configures a method route predicate:
Method 路由断言工厂采用一个 methods 参数,该参数是一个或多个参数:要匹配的 HTTP 方法。下面的示例配置方法路由断言:

application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST
Copied!
如果请求方法是 a GET 或 . POST


路径路由断言工厂

Path 路由断言工厂采用两个参数:Spring PathMatcher patterns 列表和名为 matchTrailingSlash (默认为 true ) 的可选标志。以下示例配置路径路由断言:

application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}
Copied!


如果请求路径为,则此路由匹配,例如: /red/1 或 /red/1/ 或 /red/blue /blue/green 或。


如果 matchTrailingSlash 设置为 false ,则请求路径 /red/1/ 将不匹配。


此谓词将 URI 模板变量(如 segment 前面示例中定义的 )提取为名称和值的映射,并将其 ServerWebExchange.getAttributes() 放在 中,并使用 中 ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE 定义的键。然后, GatewayFilter 这些值可供工厂使用


可以使用实用程序方法(称为 get )来更轻松地访问这些变量。下面的示例演示如何使用该 get 方法:

Map<String, String> uriVariables = ServerWebExchangeUtils.getUriTemplateVariables(exchange);

String segment = uriVariables.get("segment");
Copied!
查询路由谓词工厂


Query 路由断言工厂采用两个参数:必需 param 参数和可选参数 regexp (Java 正则表达式)。以下示例配置查询路由断言:

application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=green
Copied!
如果请求包含 green 查询参数,则上述路由匹配。
application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=red, gree.

如果请求包含的 red 查询参数的值与 gree. 正则表达式匹配,则上述路由匹配,因此 green 和 greet 将匹配。


RemoteAddr 路由断言工厂

RemoteAddr 路由断言工厂采用 sources 的列表(最小大小为 1),这些列表是 CIDR 表示法(IPv4 或 IPv6)字符串,例如 192.168.0.1/16 (where 192.168.0.1 是 IP 地址, 16 是子网掩码)。以下示例配置 RemoteAddr 路由断言:

application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: https://example.org
        predicates:
        - RemoteAddr=192.168.1.1/24
Copied
如果请求的远程地址为 ,则此路由匹配 192.168.1.10 ,例如 。

GatewayFilter 工厂

路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由筛选器的作用域为特定路由。Spring Cloud Gateway 包含许多内置的 GatewayFilter 工厂。

AddRequestHeader

AddRequestHeader GatewayFilter 工厂采用 name - value 参数。以下示例配置: AddRequestHeader GatewayFilter

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        - AddRequestHeader=X-Request-red, blue

此列表将标头添加到 X-Request-red:blue 所有匹配请求的下游请求的标头中。

AddRequestHeader 知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用,并在运行时展开。以下示例配置一个 AddRequestHeader GatewayFilter 使用变量的变量:

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment}
        filters:
        - AddRequestHeader=X-Request-Red, Blue-{segment}

RemoveRequestHeader GatewayFilter 工厂

RemoveRequestHeader GatewayFilter 工厂采用一个 name 参数。它是要删除的标头的名称。以下列表配置: RemoveRequestHeader GatewayFilter

spring:
  cloud:
    gateway:
      routes:
      - id: removerequestheader_route
        uri: https://example.org
        filters:
        - RemoveRequestHeader=X-Request-Foo

这将在标 X-Request-Foo 头发送到下游之前将其删除。

AddRequestHeadersIfNotPresent

AddRequestHeadersIfNotPresent GatewayFilter Factory :: Spring Cloud Gateway

此列表为所有匹配请求添加 2 个标头 X-Request-Color-1:blue 和 X-Request-Color-2:green 下游请求的标头。这与工作方式 AddRequestHeader 类似,但与它不同的 AddRequestHeader 是,只有在标头不存在时才会这样做。否则,将发送客户端请求中的原始值。

AddRequestParameter

AddRequestParameter GatewayFilter Factory :: Spring Cloud Gateway

AddResponseHeader

AddResponseHeader GatewayFilter Factory :: Spring Cloud Gateway

其余参考 官网:GatewayFilter Factories :: Spring Cloud Gateway

全局筛选器

该 GlobalFilter 接口具有与 GatewayFilter 相同的签名。这些是有条件地应用于所有路由的特殊过滤器。

组合全局筛选和 GatewayFilter 排序

当请求与路由匹配时,筛选 Web 处理程序会 GatewayFilter 将 的所有 GlobalFilter 实例和所有特定于路由的实例添加到筛选器链中。此组合筛选器链按 org.springframework.core.Ordered 接口排序,您可以通过实现 getOrder() 该方法进行设置。

由于Spring Cloud Gateway区分了过滤器逻辑执行的“pre”和“post”阶段(请参阅工作原理),因此优先级最高的过滤器是“pre”阶段的第一个,最后一个是“post”阶段的最后一个。

@Bean
public GlobalFilter customFilter() {
    return new CustomGlobalFilter();
}

public class CustomGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("custom global filter");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

网关指标筛选器(查看网关运行情况)

要启用网关指标,请添加 spring-boot-starter-actuator 为项目依赖项。然后,默认情况下, spring.cloud.gateway.metrics.enabled 该属性为 true ,网关指标筛选器就会运行。此筛选器添加一个以以下标签命名 spring.cloud.gateway.requests 的计时器指标:

  • routeId :路由 ID。

  • routeUri :API 路由到的 URI。

  • outcome :按 HttpStatus.Series 分类的结果。

  • status :返回客户端的请求的 HTTP 状态。

  • httpStatusCode :返回给客户端的请求的 HTTP 状态。

  • httpMethod :用于请求的 HTTP 方法。

然后,可以从中抓取这些指标, /actuator/metrics/spring.cloud.gateway.requests 并可以轻松地与 Prometheus 集成以创建 Grafana 仪表板。

本地缓存过滤器

如果启用了关联属性,则 LocalResponseCache 运行:

  • spring.cloud.gateway.global-filter.local-response-cache.enabled :激活所有路由的全局缓存

  • spring.cloud.gateway.filter.local-response-cache.enabled :激活关联的过滤器以在路由级别使用

此功能为满足以下条件的所有响应启用使用 Caffeine 的本地缓存:

  • 该请求是无体 GET。

  • 响应具有以下状态代码之一:HTTP 200(确定)、HTTP 206(部分内容)或 HTTP 301(永久移动)。

  • HTTP Cache-Control 标头允许缓存(这意味着它不具有以下任何值: no-store 存在于请求中和 no-store /或 private 存在于响应中)。

它接受两个配置参数:

  • spring.cloud.gateway.filter.local-response-cache.size :设置缓存的最大大小以逐出此路由的条目(以 KB、MB 和 GB 为单位)。

  • spring.cloud.gateway.filter.local-response-cache.time-to-live 设置缓存条目的过期时间(以 s 表示秒,m 表示分钟,h 表示小时)。

如果未配置这些参数,但启用了全局筛选器,则默认情况下,它会为缓存的响应配置 5 分钟的生存时间。

此筛选器还实现 HTTP Cache-Control 标头中值 max-age 的自动计算。如果 max-age 原始响应中存在该值,则使用 timeToLive 配置参数中设置的秒数重写该值。在后续调用中,此值将使用响应过期前的剩余秒数重新计算。
spring.cloud.gateway.global-filter.local-response-cache.enabled 设置为 false 停用所有路由的本地响应缓存,LocalResponseCache 筛选器允许在路由级别使用此功能。

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

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

相关文章

华清数据结构day3 24-7-18

基于昨天代码增加增删改查功能 zy.h #ifndef ZY_H #define ZY_H #define MAX 100 //最大容量 //定义学生类型 struct Stu {char name[20];int age;double score; }; //定义班级类型 struct Class {struct Stu student[MAX]; //存放学生的容器int size; //实际…

【Git】(基础篇五)—— Git进阶

Git进阶 之前关于本地和远程仓库的各种操作都已经非常基础了&#xff0c;本文介绍git的一些进阶使用和设置 用户名和邮箱 之前介绍的每一次提交(commit) 都会产生一条日志(log) 信息&#xff0c;这条日志信息不仅会记录提交信息&#xff0c;还会记录执行提交操作的这个用户的…

【QAC】分布式部署下其他机器如何连接RLM

1、 文档目标 解决分布式部署下其他机器如何连接RLMLicense管理器。 2、 问题场景 分布式部署下QAC要在其他机器上单独运行扫描&#xff0c;必须先连接RLMLicense管理器&#xff0c;如何连接&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2、机器环境…

ClusterIP、NodePort、LoadBalancer 和 ExternalName

Service 定义 在 Kubernetes 中&#xff0c;由于Pod 是有生命周期的&#xff0c;如果 Pod 重启它的 IP 可能会发生变化以及升级的时候会重建 Pod&#xff0c;我们需要 Service 服务去动态的关联这些 Pod 的 IP 和端口&#xff0c;从而使我们前端用户访问不受后端变更的干扰。 …

SpringBoot Security OAuth2实现单点登录SSO(附源码)

文章目录 基础概念1. 用户认证2. 单点登录&#xff08;SSO&#xff09;3. 授权管理4. 安全性和配置 逻辑实现配置认证服务器配置Spring Security两个客户端 页面展示本篇小结 更多相关内容可查看 附源码地址&#xff1a;https://gitee.com/its-a-little-bad/SSO.git 基础概念 …

HarmonyOS 状态管理(一)

1. HarmonyOS 状态管理 1.1. 说明 官方文档&#xff08;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-state-management-V5&#xff09; 1.1.1. 状态管理&#xff08;V1稳定版&#xff09; 状态管理&#xff08;V1稳定版&#xff09;提供了多种…

90+ Python 面试问答(2024 版)

90+ Python 面试问答(2024 版) 一、介绍 欢迎来到准备数据科学工作面试的第一步。这里有一个全面而广泛的 Python 面试问题和答案列表,可帮助您在面试中取得好成绩并获得理想的工作!Python 是一种解释型通用编程语言,由于其在人工智能 (AI) 中的使用,如今需求量很大。…

python大小写转换、驼峰大小写转换

一 大小写转换 1第1个单词的首字母大写 capitalize() 2每个单词的首字母大写 title() 3所有字母大小写转换 swapcase() 代码示例 texttoday is sundaYprint(text.capitalize()) # 仅第1个单词的首字母大写 print(text.title()) # 每个单词的首字母大写 print(text.swapcase…

Vue 多选下拉框+下拉框列表中增加标签

1、效果图 2、代码部分 &#xff08;1&#xff09;代码 <el-select class"common-dialog-multiple multipleSelectStyle" change"clusterListChange" v-model"form.clusterId" placeholder"请先选择" multiple filterable defaul…

【BUG】已解决:AttributeError: ‘str‘ object has no attribute ‘read‘

AttributeError: ‘str‘ object has no attribute ‘read‘ 目录 AttributeError: ‘str‘ object has no attribute ‘read‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998https://bbs.csdn.net/topics/617804998 欢迎来到我的主…

(7) cmake 编译C++程序(二)

文章目录 概要整体代码结构整体代码小结 概要 在ubuntu下&#xff0c;通过cmake编译一个稍微复杂的管理程序 整体代码结构 整体代码 boss.cpp #include "boss.h"Boss::Boss(int id, string name, int dId) {this->Id id;this->Name name;this->DeptId …

error C2011: “sockaddr_in”:“struct”类型重定义的修改办法

问题 windows.h和winsock2.h存在有类型重定义,往往体现在头文件包含winsock2.h和windows.h时出现编译错误: error C2011: “sockaddr_in”:“struct”类型重定义 2>D:\Windows Kits\10\Include\10.0.22000.0\shared\ws2def.h(442,5): error C2143: 语法错误: 缺少“}”(…

为什么大家都想学大模型?一文揭秘!

小编只是普通的汽车软件工程师&#xff0c;想了解人工智能&#xff0c;又感觉好遥远&#xff0c;仔细的看了半天&#xff0c;就一个想法 好好拥抱AI吧。真的好强。 相比之下&#xff0c;Autosar 是个 der 啊。。。。 人工智能基础概念全景图 AI -> 机器学习 机器学习 ->…

探索 Python 的新视界:ttkbootstrap 库

探索 Python 的新视界&#xff1a;ttkbootstrap 库 背景与简介 在 Python 的世界中&#xff0c;库的丰富性是其强大功能的重要体现之一。今天&#xff0c;我们将一起探索一个令人兴奋的库——ttkbootstrap。这个库不仅提供了丰富的界面组件&#xff0c;还使得界面设计变得简单…

Python脚本批量下载ECWMF免费数据教程

前情提要 最近需要使用EC的一些数据&#xff0c;摸索下载过程中顺便记录下来&#xff0c;综合了EC上免费数据集的两个数据集的下载方式&#xff0c;使用python脚本下载 相比在网站上操作下载&#xff0c;个人更推荐脚本下载&#xff0c;官方已经封装好了两个库直接可以方便使…

HTML5实现好看的天气预报网站源码

文章目录 1.设计来源1.1 获取天气接口1.2 PC端页面设计1.3 手机端页面设计 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_4…

Django+vue自动化测试平台(27)-- 封装websocket测试

websocket概述&#xff1a; WebSocket 是一种在单个 TCP 连接上进行全双工通信(Full Duplex 是通讯传输的一个术语。通信允许数 据在两个方向上同时传输&#xff0c;它在能力上相当于两个单工通信方式的结合。全双工指可以同时&#xff08;瞬时&#xff09;进 行信号的双向传输…

Linux第四节课(指令与权限)

1、date指令(时间) 程序运行到自己的每一个关键时刻&#xff0c;都要自己打日志&#xff01; 日志包括时间、日志等级、日志具体信息、其他信息等&#xff0c;然后按照行为单位写入文件中&#xff0c;这个文件被称为日志文件&#xff01; 在日志文件中筛选信息时&#xff0c…

idea springBoot启动时覆盖apollo配置中心的参数

vm options -Dorder.stat.corn“0/1 * * * * ?” 只有vm options, -D参数才能覆盖apollo参数 program arguments –key01val01 --key02val02 environment varibales envFAT;key02val02;key03val03

视觉巡线小车——STM32+OpenMV(四)

目录 前言 一、整体控制思路 二、代码实现 1.主函数 2.定时器回调函数 总结 前言 通过以上三篇文章已将基本条件实现&#xff0c;本文将结合以上内容&#xff0c;进行综合控制&#xff0c;实现小车的视觉巡线功能。 系列文章请查看&#xff1a;视觉巡线小车——STM32OpenMV系列…