系列十、Spring Cloud Gateway

2024-01-04

一、Spring Cloud Gateway

1.1、概述

Spring Cloud全家桶中有个很重要的组件就是网关,在1.x版本中采用的是Zuul网关,但是在2.x版本中,由于Zuul的升级一直跳票,Spring Cloud最后自己研发了一个网关替代Zuul,即:Spring Cloud Gateway。简单点讲Gateway就是原Zuul1.x版的替代品。

1.2、 Zuul1.x官网

https://github.com/Netflix/zuul/wiki

1.3、Gateway官网

https://spring.io/projects/spring-cloud-gateway/#overview

1.4、Gateway源码架构

1.5、已经有了Zuul为什么又出现了Gateway

(一)neflix不太靠谱,zuul2.0一直跳票,迟迟不发布;

一方面因为Zuul1.0已经进入了维护阶段,而Gateway是Spring Cloud团队研发的,是亲儿子产品,值得信赖。而且很多功能Zuul都没有Gateway使用起来简单便捷,Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心。虽然Netflix早就发布了最新的 Zuul 2.x,但 Spring Cloud 貌似没有整合计划。而且Netflix相关组件都宣布进入维护期;不知前景如何?
多方面综合考虑Gateway是很理想的网关选择。

(二)Spring Cloud Gateway具有如下特性:

(1)基于Spring Framework 6, Project Reactor 和 Spring Boot 3.0 进行构建;
(2)动态路由:能够匹配任何请求属性;
(3)可以对路由指定 Predicate(断言)和 Filter(过滤器);
(4)集成Hystrix的断路器功能;
(5)集成 Spring Cloud 服务发现功能;
(6)易于编写的 Predicate(断言)和 Filter(过滤器);
(7)请求限流功能;
(8)支持路径重写。

(三)Spring Cloud Gateway 与 Zuul的区别:

在SpringCloud Finchley 正式版之前,Spring Cloud 推荐的网关是 Netflix 提供的Zuul:
(1)Zuul 1.x,是一个基于阻塞 I/ O 的 API Gateway;
(2)Zuul 1.x 基于Servlet 2. 5使用阻塞架构,它不支持任何长连接(如 WebSocket) ,Zuul 的设计模式和Nginx较像,每次 I/ O 操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成,但是差别是Nginx 用C++ 实现,Zuul 用 Java 实现,而 JVM 本身会有第一次加载较慢的情况,使得Zuul 的性能相对较差;
(3)Zuul 2.x理念更先进,想基于Netty非阻塞和支持长连接,但Spring Cloud目前还没有整合。 Zuul 2.x的性能较 Zuul 1.x 有较大提升。在性能方面,根据官方提供的基准测试, Spring Cloud Gateway 的 RPS(每秒请求数)是Zuul 的 1. 6 倍。
(4)Spring Cloud Gateway 建立 在 Spring Framework 5、 Project Reactor 和 Spring Boot 2 之上, 使用非阻塞 API;

1.6、常用功能

反向代理、鉴权、流量控制、熔断、日志监控...

1.7、微服务架构中网关的位置

1.8、三大核心概念

1.8.1、路由(Route)

路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。

1.8.2、断言(Predicate)

断言参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。

1.8.3、过滤器(Filter)

指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

1.9、工作流程

1.9.1、核心逻辑

路由转发 + 执行过滤器链

1.9.2、工作流程

官网: How It Works :: Spring Cloud Gateway

客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

1.10、断言工厂配置(Route Predicate Factories)

1.10.1、概述

当请求Gateway的时候,使用断言对请求进行匹配,如果匹配成功就路由转发,如果匹配失败就返回404。Spring Cloud中的Gateway分为两大类,即: 内置的 自定义的, 下面详细介绍!

官网: Route Predicate Factories :: Spring Cloud Gateway

1.10.2、(内置)基于Datetime类型的断言工厂

Datetime类型的断言工厂用于断言时间,断言为真则路由,否则404,主要有3个,如下:

注意事项: 这里的时间是带时区的时间,可以通过ZonedDateTime.now()获取

案例:

1.10.3、(内置)基于远程地址的断言工厂

案例:

1.10.4、(内置)基于Cookie的断言工厂

案例:

1.10.5、(内置)基于Header的断言工厂

案例:

1.10.6、(内置)基于Host的断言工厂

案例:

1.10.7、(内置)基于Method请求方法的断言工厂

案例:

1.10.8、(内置)基于Path请求路径的断言工厂

案例:

1.10.9、(内置)基于Query请求参数的断言工厂

案例:

1.10.10、(内置)基于路由权重的断言工厂

案例:

1.10.11、(自定义)基于权限的断言工厂

概述:

上述内置的断言工厂已经能够满足我们日常工作的绝大部分场景,但是当内置的断言工厂不满足我们的需求时,那么我们可以通过自定义断言工厂的方式进行扩展,具体过程如下:

自定义断言工厂的步骤:

(1)创建一个类并纳入Spring管理,添加@Component注解;

(2)类必须以RoutePredicateFactory作为结尾,约定大于配置!

(3)类必须继承自AbstractRoutePredicateFactory;

(4)必须声明静态内部类、声明属性来接收配置文件中对应的断言信息;

(5)结合shortcutFieldOrder进行绑定;

(6)通过apply方法进行逻辑判断,如果为true则匹配成功,否则匹配失败;

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/4 9:38
 * @Description: 自定义断言工厂
 * 功能:校验用户的权限,如果用户是已授权用户则放行,否则失败!
 */
@Component
public class AuthRoutePredicateFactory extends AbstractRoutePredicateFactory<AuthRoutePredicateFactory.Config> {

    public static final String AUTHED_USER = "admin";

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

    public List<String> shortcutFieldOrder() {
        return Collections.singletonList("name");
    }

    public Predicate<ServerWebExchange> apply(final AuthRoutePredicateFactory.Config config) {
        return new GatewayPredicate() {
            public boolean test(ServerWebExchange serverWebExchange) {
                if (AUTHED_USER.equals(config.getName())) {
                    return true;
                }
                return false;
            }
        };
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Validated
    public static class Config {
        private String name;
    }
    
}

1.11、过滤器工厂配置(局部)

1.11.1、内置

https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/gatewayfilter-factories.html

1.11.2、自定义

概述:

1.7.1官网提供的内置过滤器已经能够满足我们日常工作的绝大部分场景,但是当内置的过滤器不满足我们的需求时,那么我们可以通过自定义过滤器的方式进行扩展,具体过程如下:

自定义过滤器的步骤:

(1)创建一个类并纳入Spring管理,添加@Component注解;

(2)类必须以GatewayFilterFactory作为结尾,约定大于配置!

(3)类必须继承自AbstractGatewayFilterFactory;

(4)必须声明静态内部类、声明属性来接收配置文件中对应的断言信息;

(5)结合shortcutFieldOrder进行绑定;

(6)通过apply方法进行逻辑判断,如果为true则匹配成功,否则匹配失败;

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/4 10:28
 * @Description: 自定义过滤器
 */
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config> {
    public AuthGatewayFilterFactory() {
        super(AuthGatewayFilterFactory.Config.class);
    }

    public List<String> shortcutFieldOrder() {
        return Arrays.asList("value");
    }

    public GatewayFilter apply(final AuthGatewayFilterFactory.Config config) {
        return new GatewayFilter(){
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                /**
                 * (1)name参数为空:成功
                 * (2)name参数不为空:获取name参数,值不等于value就失败,否则成功
                 */
                String name = exchange.getRequest().getQueryParams().getFirst("name");
                if (StringUtils.isNotBlank(name)) {
                    if (name.equals(config.getValue())) {
                        return chain.filter(exchange);
                    } else {
                        exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
                        return exchange.getResponse().setComplete();
                    }
                }
                return chain.filter(exchange);
            }
        };
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Config {
        private String value;
    }
}

1.12、全局过滤器(Global Filter)配置

1.12.1、概览

1.12.2、局部过滤器 vs 全局过滤器

局部过滤器: 针对某个路由,需要在路由中进行配置

全局过滤器: 针对所有路由请求,一旦定义就会投入使用,无需配置

GlobalFilter和GatewayFilter有着一样的定义,只不过前者会作用于所有的路由;

1.13、统一处理跨域

1.13.1、官网(配置方式)

https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/cors-configuration.html

1.13.2、代码方式

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/4 12:53
 * @Description:
 */
@Configuration
public class MyCorsConfig {

    @Bean
    public CorsWebFilter corsWebFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",corsConfiguration);

        return new CorsWebFilter(source);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

系列十、Spring Cloud Gateway 的相关文章

  • Jenkins + NACOS + GATEWAY 实现微服务不停机部署

    Nacos 版本
  • Apisix使用教程

    安装 推荐直接使用Docker来安装启动Apisix 安装docker 首先下载并安装docker https www docker com 下载之后 直接运行安装 安装后打开Docker Desktop 等它启动完 启动完之后 此时就是可
  • 全网最全的微服务+Outh2套餐,Gateway整合Oauth2!(入门到精通,附源码)满足你的味蕾需要(三)

    上篇文章主要讲解Oauth2模块 user service模块 feign模块 那么作为重中之重的gateway 我们将其做成资源服务器来进行开发 一 资源服务器的实现方式 资源服务器在实际开发有两种实现方式 1 gateway做网关转发
  • UWB自组网定位方案_基于UWB技术的消防应急救援定位解决方案

    目前国内应急救援市场都是基于被动定位应用 在特殊情况下救援也大多处于单兵作战的情况 并不能及时知道自己和自己组员的位置信息和状态 且没有场景感知和室内外一体位置信息结合 使相关救援人员处于更加危险境地 本篇就带大家详细了解一下微能信息针对消
  • Gateway网关

    搭建网关服务 1 创建新的moddule 引入SpringCloudGateway的依赖和nacos的服务发现依赖
  • Gateway网关-源码讲解从GatewayAutoConfiguration开始

    spring cloud gateway core 包 下 spring factories Auto Configure org springframework boot autoconfigure EnableAutoConfigura
  • 跨域问题以及在springcloud的gateway中解决跨域问题

    一 什么是跨域问题 跨域问题 当两个页面的域名不一致时 浏览器禁止请求的发起者与服务端发生跨域ajax请求 请求被浏览器拦截的问题 发生跨域问题需要满足的点有 1 两个页面的域名不一致 2 两个页面发生的是ajax请求 这里不允许跨域是浏览
  • 微服务内部服务调用@Inner

    1 外部从Gateway访问 需要鉴权 eg CURD操作 这种是最常使 的 户登录后正常访问接 不需要我们做什么处理 可能有的接 需要加权限字段 2 外部从Gateway访问 不需要鉴权 eg 短信验证码 需要我们将uri加 到secur
  • Nginx配置参数解释

    目录 worker processes work cpu affinity worker rlimit nofile events模块 1 use method 2 worker connections 3 multi accept htt
  • 统一网关Gateway

    Spring Cloud Gateway是Spring官方基于Spring 5 0 Spring Boot 2 0和Project Reactor等技术开发的网关 Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的
  • GateWay 服务网关

    介绍 Cloud全家桶中有个很重要的组件就是网关 在1 x版本中都是采用的Zuul网关 但在2 x版本中 zuul的升级一直跳票 SpringCloud最后自己研发了一个网关替代Zuul 那就是SpringCloud Gateway Gat
  • 微服务:gateway的使用,和解决跨域问题,用户认证与网关整合

    1 网关介绍 API网关出现的原因是微服务架构的出现 不同的微服务一般会有不同的网络地址 而外部客户端可能需要调用多个服务的接口才能完成一个业务需求 如果让客户端直接与各个微服务通信 会有以下的问题 1 客户端会多次请求不同的微服务 增加了
  • SpringCloud——网关Gateway

    文章目录 六 统一网关 Gateway 6 1 网关介绍 6 2 快速搭建网关 6 3 断言工厂 6 4 过滤器工厂 6 5 全局过滤器 GlobalFIlter 6 6 过滤器的执行顺序 6 7 跨域问题 六 统一网关 Gateway 6
  • 【AWS】API Gateway创建Rest API--从S3下载文件

    一 背景 在不给AK SK的前提下 用户查看s3上文件 从s3下载文件 二 创建API 1 打开API Gateway 点击创建API 选择REST API REST API和HTTP API区别 来自AWS官网 REST API 和 HT
  • .net 配置网关(使用Ocelot)

    本文演示一个最简单的demo 来模拟如何通过网关来访问服务 而不是直接访问服务 创建三个asp net core web api项目 一个作为网关 两个作为服务 分别配置项目的访问路径 网关的项目使用https localhost 5001
  • 当应用程序发送 401 时,Azure 应用程序网关抛出 502

    Azure 应用程序网关显示502 bad gateway error 当应用程序返回时401 or 500 errors 它应该发送应用程序发送的任何内容 但默认情况下它发送502 知道发生了什么以及有任何配置或代码更改建议吗 EDIT
  • 在无头模式下使用 Firefox 68.9.0esr 以及 GeckoDriver Selenium 和 Python 时出现 504 网关超时错误

    我用硒制作了一个容器图像 我用了一个ubi image来自 RedHat 作为基础镜像 我安装了以下版本的 geckodriver 和 Mozilla Firefox 壁虎驱动程序 0 26 0 e9783a644016 2019 10 1
  • 增加504超时错误

    有什么方法可以使错误 504 网关超时更长 如果可以的话 如何以及更改它的文件位于何处 我在centos 6上使用nginx 根据您拥有的网关类型 您应该使用类似以下内容的内容 proxy read timeout 600s 检查文档 ht
  • 系列十、Spring Cloud Gateway

    一 Spring Cloud Gateway 1 1 概述 Spring Cloud全家桶中有个很重要的组件就是网关 在1 x版本中采用的是Zuul网关 但是在2 x版本中 由于Zuul的升级一直跳票 Spring Cloud最后自己研发了
  • 在android中获取网关ip地址

    如何获取网关 IP 详细信息 可以选择使用 wifimanager 但是 如果没有 wify 当使用 USB 网络共享连接时 如何在 Android 设备中查找网关 DNS 和其他详细信息 我在android 2 3 4上使用cyanoge

随机推荐

  • 高德地图API

    首先注册高德地图API账户成为开发者用户 然后申请key与密钥 应用管理 我的应用 创建新应用 加载高德地图
  • 图像分割-Grabcut法

    版权声明 本文为博主原创文章 转载请在显著位置标明本文出处以及作者网名 未经作者允许不得用于商业目的 本文的C 版本请访问 图像分割 Grabcut法 C CSDN博客 GrabCut是一种基于图像分割的技术 它可以用于将图像中的前景和背景
  • 在线视频编辑大师视频画中画批量制作、批量添加背景图片的视频剪辑教程

    在数字媒体时代 创意与个性化的内容成为吸引观众的关键 媒体梦工厂软件以其独特的画中画功能 让您的视频剪辑更具创意与视觉冲击力 无论是制作图片与视频的画中画效果 还是批量添加背景图片效果 都能助您一臂之力 1 软件的画中画功能 允许您将图片与
  • 淘宝商品类目接口API:获取淘宝商品分类类目信息

    cat get 获得淘宝分类详情 响应参数 名称 类型 必须 示例值 描述 info Mix 0 cid 16 parent cid 0 name 其他女装 is parent true status normal sort order 0
  • 深入了解Python中的进程控制和监控技巧,提高系统稳定性

    概要 在计算机系统中 进程管理是一个重要的任务 它涉及创建 启动 监控 终止和管理运行中的进程 Python作为一门强大的编程语言 提供了丰富的库和模块 使得进程管理变得相对容易 本文将介绍如何使用Python来实现系统进程管理 包括创建和
  • stm32毕设分享 stm32单片机酒精浓度酒驾检测系统 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 MQ 3酒精乙醇传感器模块 SIM800C模块 5 软件说明 系统框图
  • 5年经验之谈 —— 为什么要做自动化测试?

    自动化测试是一种软件测试方法 通过编写和使用自动化脚本和工具 以自动执行测试用例并生成结果 自动化旨在替代手动测试过程 提高测试效率和准确性 自动化测试可以覆盖多种测试类型 包括功能测试 性能测试 安全测试等 以确保软件系统在各个方面的质量
  • 【史上最细教程】CentOS7 下载安装 RabbitMQ(两种方式:手动安装 / Docker安装)

    文章目录 史上最细教程 CentOS7 下载安装 RabbitMQ 方式一 手动安装 1 下载安装Erlang RabbitMQ 2 防火墙 安全组端口放行 3 启动RabbitMQ服务 4 浏览器用户登录
  • Win32 文件分割合并

    CFileSplitUtils h pragma once include
  • Mybatis插件介绍与基本使用

    文章目录 Mybatis插件 四大接口介绍 所需要的注解 Interceptor接口介绍 Executor接口 Executor接口介绍 Executor 接口的一些关键方法
  • 教育场景数字化中音视频小程序的发展

    教育场景数字化逐步成为刚需 2018年以来 国家对在线教育行业的监管收紧 以及受益于 5G 技术的发展 教育科技逐步走向成熟化和规范化 教育行业的本质是人与人 老师与学生 老师与家长 以及更多角色直接的沟通与互动 而仅仅是古早式的在线文字已
  • 网络对讲终端 网络音频终端 网络广播终端SV-7011V使用说明

    高速路sip广播对讲求助 隧道sip对讲调度SIP 7011 网络广播终端SV 7011 壁挂式对讲终端网络监听终端SIP广播终端 sip语音对讲终端SIP 7011 SV 7011网络对讲终端网络对讲 网络厂播 监听 SV 7101网络解
  • 如何用Java实现自动化测试和质量控制?

    使用 Java 实现 自动化测试 和质量控制是现代 软件开发 中的重要环节 下面将详细介绍如何使用Java实现自动化测试和质量控制 一 自动化测试概述 自动化测试是指使用软件工具和脚本来执行测试任务 以代替人工操作并提高测试效率 以下是一些
  • 如何使用 Python+selenium 进行 web 自动化测试?

    Selenium是一个自动化测试工具 它可以模拟用户在浏览器中的操作 比如点击 输入 选择等等 它支持多种浏览器 包括Chrome Firefox Safari等等 并且可以在多个平台上运行 安装和配置Selenium 在使用Seleniu
  • 民安智库(第三方市场调研公司):餐饮企业顾客满意度调查,赢得口碑的关键

    在餐饮行业 顾客满意度调查是至关重要的一环 通过对顾客的反馈进行调查和分析 可以了解顾客的需求和期望 从而针对性地改进产品和服务 提升顾客满意度和忠诚度 本文将分享民安智库在餐饮企业顾客满意度调查方面的实践经验 在开展顾客满意度调查之前 要
  • 数据库基础知识

    关系模型的程序员不需熟悉数据库的存取路径 在3层模式结构中 I 是数据库的核心和关键 通常是模式的子集 数据库模式的描述提供给用户 的描述存储在硬盘上 模式 外模式 内模式 数据库中 数据的物理独立性是指用户的应用程序与存储在磁盘上数据库中
  • [linux] from megatron import报错no moudle

    sys path insert地址 sys path insert 0 xx megablocks Megatron LM
  • 基于深度学习的停车位关键点检测系统(代码+原理)

    摘要 DMPR PS是一种基于深度学习的停车位检测系统 旨在实时监测和识别停车场中的停车位 该系统利用图像处理和分析技术 通过摄像头获取停车场的实时图像 并自动检测停车位的位置和状态 本文详细介绍了DMPR PS系统的算法原理 创新点和实验
  • 电商API的探索之旅:从请求示例到高并发挑战

    在数字化时代 电商系统已成为商业领域不可或缺的一环 电商API作为电商系统的重要组成部分 承担着连接前端和后端的桥梁角色 其重要性不言而喻 本文将深入探讨电商API的核心技术 从请求示例到高并发处理 为您揭示电商API的探索之旅 一 电商A
  • 系列十、Spring Cloud Gateway

    一 Spring Cloud Gateway 1 1 概述 Spring Cloud全家桶中有个很重要的组件就是网关 在1 x版本中采用的是Zuul网关 但是在2 x版本中 由于Zuul的升级一直跳票 Spring Cloud最后自己研发了