系列十、Spring Cloud Gateway

一、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@Validatedpublic 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(){@Overridepublic 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@NoArgsConstructorpublic 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 {@Beanpublic CorsWebFilter corsWebFilter() {CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedMethod("*");corsConfiguration.addAllowedOrigin("*");corsConfiguration.addAllowedHeader("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**",corsConfiguration);return new CorsWebFilter(source);}}

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

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

相关文章

ASP.NET Core基础之图片文件(一)-WebApi图片文件上传到文件夹

阅读本文你的收获&#xff1a; 了解WebApi项目保存上传图片的三种方式学习在WebApi项目中如何上传图片到指定文件夹中 在ASP.NET Core基础之图片文件(一)-WebApi访问静态图片文章中&#xff0c;学习了如何获取WebApi中的静态图片&#xff0c;本文继续分享如何上传图片。 那么…

详谈电商网站建设的四大流程!

在21世纪的互联网时代&#xff0c;电商网站的建设是每个企业发展不可缺少的一次机遇。企业商城网站建设成功也许会获得更大的了利润&#xff1b;如果网站建设不成功&#xff0c;那么也会带来一定的损失。所以建设电商网站不是那么一件简单的事情。那么电商网站制作流程是怎样的…

C++_find 统计一个单词 在一段文中出现的次数

注解: 使用y.find(x, n)从位置n开始在字符串y中查找子串x首次出现的位置。如果找到了子串x&#xff0c;则find()函数会返回该子串在y中的起始索引&#xff08;位置&#xff09;&#xff0c;否则返回-1&#xff08;或npos&#xff09;表示未找到。当find()函数返回非-1值时&…

我开发了一个聚合网盘资源搜索引擎-支持阿里云盘与夸克网盘资源

还在为找不到电子书资源而发愁&#xff1f;还在愁没有高清影视剧观看&#xff1f; 来试试我开发的云盘资源搜索引擎吧&#xff01; 公众号回复关键词: 搜索 ! 就可以获取到网站网址。 这里还有资源分享微信群&#xff0c;不定期分享资源。 关于界面 怎么使用这个引擎&#x…

ubuntu远程桌面连接之novnc

一、前言 该操作是为了实现vnc桌面连接为url连接方式&#xff0c;且在浏览器中可以对ubuntu进行操作。在使用novnc进行操作前&#xff0c;需要先安装vnc才可。ubuntu下如何安装vnc&#xff0c;可看博主前面写的一篇文&#xff0c;ubuntu远程桌面连接之vnc-CSDN博客&#xff0c;…

[雷池WAF]长亭雷池WAF配置基于健康监测的负载均衡,实现故障自动切换上游服务器

为了进一步加强内网安全&#xff0c;在原有硬WAF的基础上&#xff0c;又在内网使用的社区版的雷池WAF&#xff0c;作为应用上层的软WAF。从而实现多WAF防护的架构。 经过进一步了解&#xff0c;发现雷池WAF的上游转发代理是基于Tengine的&#xff0c;所以萌生出了一个想法&…

低代码平台在自动驾驶系统开发中的应用

自动驾驶技术的发展正在为交通领域带来革命性的变化。其中关键的一环是自动驾驶系统的开发&#xff0c;该过程通常需要大量的编程工作和复杂的算法。然而&#xff0c;随着低代码技术的崛起&#xff0c;开发者能够大幅简化自动驾驶系统的开发过程&#xff0c;为了降低开发难度和…

算法与数据结构之链表<一>(Java)

目录 1、链表的定义 2、链表的特点 3、为何要使用链表 4、数组与链表的区别 5、链表的增删查 5.1、在头部插入链表 5.2、在中间插入链表 5.3、删除头节点 5.4、删除中间节点 5.5、查询某个值 6、链表的应用 6.1 如何设计一个LRU缓存算法&#xff1f; 6.2 约瑟夫问题 1、链表的定…

计算机毕业设计-----SSM自习室图书馆座位预约管理系统

项目介绍 一款由jspssmmysql实现的图书馆预约占座管理系统&#xff0c;前端采用的是当下最流行的easyui框架&#xff0c;后台用的ssm&#xff08;spring、springMVC、mybaits&#xff09;框架.添加学生和教师时会自动在用户表中注册&#xff0c;定时任务会定时生成座位信息&am…

马蹄集oj赛(双周赛第十八次)

目录 幸运的3 打靶 照亮街道 九次九日九重色 寻找串 竹鼠的白色季节 捉迷藏 好的三连 三角数 买马 可怜的小码哥 花园浇水 高次方程 幸运的3 难度:黄金时间限制: 1秒四占用内存:128M 你有 n 个数&#xff0c;可以将它们两两匹配(即将两数首尾相连)&#xff0c;每个…

YOLOv8融合改进 更换检测头为Detect_DyHead同时添加C2f-EMSC和C2f-EMSCP模块

一、Detect_DyHead检测头和C2f-EMSC&#xff0c;C2f-EMSCP模块 详细介绍和代码在往期的博客里&#xff1a; Detect_DyHead&#xff1a; &#xff08;YOLOv8改进检测头Detect为Detect_Dyhead-CSDN博客&#xff09; C2f-EMSC和C2f-EMSCP&#xff1a; &#xff08;YOLOv8改进…

leetcode2487.从链表中移除节点

文章目录 题目思路复杂度Code 题目 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输入&#xff1a;head [5,2,13,3,8] 输出&#xff1a;[13,8] 解释&#xff1a;需要移除的节点是 5 &#xff0…

云盘扩容、云盘缩容

天翼云文档地址&#xff1a;https://www.ctyun.cn/document/10027696/10169558 1、输入 growpart命令&#xff0c;检查此云主机是否已安装growpart扩容工具。若出现图中回显信息&#xff0c;则说明已经安装&#xff0c;无需手动安装。 注意 若没有图示信息&#xff0c;请执行…

《PySpark大数据分析实战》-24.数据可视化图表介绍

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

prometheus基本介绍

官网&#xff1a;https://prometheus.io/docs/introduction/overview/ 中文&#xff1a; https://www.prometheus.wang/ Prometheus 选择 Prometheus 并不是偶然&#xff0c;因为&#xff1a; • Prometheus 是按照 《Google SRE 运维之道》的理念构建的&#xff0c;具有实用…

WSL2-Ubuntu22.04子系统图形化界面搭建与远程桌面连接

提示&#xff1a;文中不提供WSL2子系统搭建步骤&#xff0c;假定子系统已建立好&#xff1a; 文章目录 检查WSL子系统状态图形化界面安装远程桌面连接可能遇到的相关问题xrdp状态异常远程桌面黑屏 检查WSL子系统状态 wsl -l -v如下图所示为正常 图形化界面安装 以此执行如下…

【管理篇 / 登录】❀ 06. macOS下使用USB配置线登录 ❀ FortiGate 防火墙

【简介】飞塔防火墙上都会配有CONSOLE接口&#xff0c;包装里都会配置一根USB配置线&#xff0c;通过这个接口和这根线&#xff0c;我们可以用命令的方式登录飞塔防火墙。随着苹果电脑的普及&#xff0c;我们来学习如何在macOS中使用USB配置线登录飞塔防火墙。 早期飞塔防火墙包…

Java学习路线第六篇:互联网生态(1)

这篇则分享Java学习路线第六part&#xff1a;互联网生态 恭喜你已经成功追到第六章节啦&#xff0c;要被自己的努力感动到了吧&#xff0c;而这节将承担起学完互联网生态的使命&#xff0c;本使命为单向契约&#xff0c;你可选择YES或者选择YES。 Linux Linux从入门到精通视…

淘宝商品类目接口API:获取淘宝商品分类类目信息

cat_get-获得淘宝分类详情 响应参数 名称类型必须示例值描述 info Mix0{"cid": 16, "parent_cid": 0, "name": "其他女装", "is_parent": "true", "status": "normal", "sort_order&q…

【UnityShader入门精要学习笔记】(3)章节答疑

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 复习&#xff08;阶段性总结…