gateway之断言的使用详解

文章目录

  • gateway产生的背景,为什么要是用gateway
    • 什么是网关
    • gateway 带来的好处
    • 功能特征
    • gateway在项目中使用的依赖
  • 什么是断言
    • 断言分类
    • 内置
    • 自定义
      • 示例
    • 断言和过滤器的不同

gateway产生的背景,为什么要是用gateway

一个系统会被拆分为多个微服务,作为客户端要如何去调用这么多的微服务?如果没有网关的存在,只能在客户端记录每个微服务的地址,然后分别去调用。
例如下图:
请添加图片描述
这样的架构,会存在着诸多的问题:
·每个业务都会需要鉴权、限流、权限校验、跨域等逻辑,如果每个业务都各自为战,自己造轮子实现一遍,完全可以抽出来,放到一个统一的地方去做。
·如果业务量比较简单的话,这种方式前期不会有什么问题,但随着业务越来越复杂,比如淘宝、亚马逊打开一个页面可能会涉及到数百个微服务协同工作,如果每一个微服务都分配一个域名的话,一方面客户端代码会很难维护,涉及到数百个域名,另一方面是连接数的瓶颈,通过抓包发现涉及到了数百个远程调用,这在移动端下会显得非常低效。
后期如果需要对微服务进行重构的话,也会变的非常麻烦,需要客户端配合你一起进行改造,比如商品服务,随着业务变的越来越复杂,后期需要进行拆分成多个微服务,这个时候对外提供
的服务也需要拆分成多个,同时需要客户端配合你进行改造

什么是网关

所谓的API网关,就是指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这甲实现,诸如认证、鉴权、监控、路由转发等等
添加上AP网关之后,系统的架构图变成了如下所示:
请添加图片描述

gateway 带来的好处

在这里插入图片描述
网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,定位于取代Netflix Zuul1.O。相比Zuul来说,Spring Cloud Gateway提供更优秀的性能,更强大的有功能
Spring Cloud Gateway是由WebFlux+Ney+Reactor实现的响应式的API网关。它不能在传统的servlet容器中工作,也不能构建成war包,
Spring Cloud Gateway旨在为微服务架构提供一种简单且有效的API路由的管理方式,并基于Filter方式提供网关的基本功能,例如说安全认证、监控、限流等等

功能特征

1、基于Spring Framework5,Project Reactor和Spring Boot2.0进行构建;
2、动态路由:能够匹配任何请求属性:
3、支持路径重写;
4、集成Spring Cloud服务发现功能(Nacos、Eruka);
5、可集成流控降级功能(Sentinel、.Hystrix);
6、可以对路由指定易于编写的Predicate(断言)和Filter(过滤器);## gateway是如何实现转发

gateway在项目中使用的依赖

父pom中使用的依赖:

<properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><spring-cloud.version>Hoxton.SR12</spring-cloud.version><spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency></dependencies><dependencyManagement><dependencies>
<!-- springcloud的版本依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

gateway模块使用的依赖

    <dependencies>
<!--        gateway依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies>

gateway的application.yml配置信息

server:port: 8088
spring:main:web-application-type: reactiveapplication:name: gateway
# gateway的配置cloud:gateway:#路由规则routes: #路由,数组[这里可以放置多个路由]#评分管理模块网关路由配置- id: shop_router #当前路由标识-要求唯一,默认是UUID;uri: http://localhost:8089 #请求最终要被转发的地址;order: 1 #路由的优先级——数字越小,代表路由的优先级越高predicates: #断言:(条件判断——转发请求要满足的条件)
#            - Path=/shop/** #当请求路径满族path指定的规则时,此路由信息才会正常转发;
#          filters: #过滤器,是在请求传递过程中对请求做一些手脚;
#            - StripPrefix=1 #在请求转发之前去掉一层路径- Path=/TestController/**- After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai]- CheckAuth=gys

什么是断言

Spring Cloud Gateway(简称Gateway)支持断言Predicate功能,该断言功能是基于Spring WebFlux的HandlerMapping实现的。Gateway包含了很多路由断言工厂,并且这些工厂对应着HTTP请求的很多属性进行了处理,当客户端HTTP请求时,HandlerMapping会获取请求参数,并与Gateway中配置的Predicates进行比对,若满足规则就按规则约定进行路由放行,否则拒绝访问或报404错误。

断言分类

官网地址

内置

在配置文件中断言标签下配置的Path,After,都是内置断言,也就是gateway自己给提供的断言
例如:
基于Datatime类型的断言工厂
此类型的断言根据时间做判断,主要有三个:
AfterRoutePredicateFactory:接收一个日期参数,判断请求日期是否晚于指定日期
BeforeRoutePredicateFactory:接收一个日期参数,判断请求日期是否早于指定日期
BetweenRoutePredicateFactory:接收两个日期参数,判断请求日期是否在指定时间段内

自定义

自定义路由断言工厂需要继承AbstractRoutePredicateFactory类,重写apply方法的逻辑。在apply方法中可以通过exchange…getRequest()拿到ServerHttpRequest对象,从而可以获取到情求的参数、清求方式、清求头等信息,

注意点:
1、必须spring组件(必须是bean)
2.类必须加上RoutePredicateFactory作为结尾(约定大于配置)
3.必须继承AbstractRoutePredicateFactory
4.必须声明静态内部类(config)声明属性来接收配置文件中对应的断言的信息

通过shoutcutFieldOrder集合去返回输入内容的信息

5.需要结合shortcutFieldOrderi进行绑定
6,通过apply进行逻辑判断tue就是匹配成功false匹配失败

示例

@Component
public class CheckAuthRoutePredicateFactorya extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactorya.Config> {public CheckAuthRoutePredicateFactorya() {super(Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("name");}@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return new GatewayPredicate() {@Overridepublic boolean test(ServerWebExchange serverWebExchange) {if (config.getName().equals("gys")){return true;}return false;}};}/*** @description: 用于接收配置文件中断言的信息* @author: * @date: 2023/9/19 19:52* @param:* @return:**/@Validatedpublic static class Config {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}
}

断言和过滤器的不同

1、功能不同:断言用于匹配请求的某些条件,例如请求路径、请求头、请求参数等,它决定了请求是否应该被路由到特定的目标服务。而过滤器用于对请求进行处理和转换,例如添加请求头、修改请求体、记录日志、实现认证授权等。
2、工作原理不同:断言通常用于路由选择的阶段,在接收请求时进行匹配,如果匹配成功,则将请求路由到相应的目标服务。而过滤器则是在请求路由之前或之后应用的,用于对请求进行预处理或后处理,它不会影响路由的选择。
3、使用场景不同:断言通常用于根据请求的某些属性进行路由选择,因此它更贴近网关的底层实现。而过滤器则更加灵活,可用于实现业务逻辑,例如认证授权、请求重试、流量控制等。

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

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

相关文章

软考 -- 计算机学习(2)

文章目录 一、安全性知识1.1 信息安全和信息系统安全1.2 信息安全技术1.3 网络安全技术 二、多媒体技术三、软件工程基础知识3.1 信息系统生命周期3.2 软件过程模型3.3 信息系统开发方法3.4 系统分析和设计概述3.5 结构化开发方法3.6 系统运行与维护 四、项目管理4.1 进度管理4…

说说hashCode() 和 equals() 之间的关系?

每天一道面试题&#xff0c;陪你突击金九银十&#xff01; 上一篇关于介绍Object类下的几种方法时面试题时&#xff0c;提到equals()和hashCode()方法可能引出关于“hashCode() 和 equals() 之间的关系&#xff1f;”的面试题&#xff0c;本篇来解析一下这道基础面试题。 先祭一…

ESP-IDF学习——1.环境安装与hello-world

ESP-IDF学习——1.环境安装与hello-world 0.前言一、环境搭建1.官方IDE工具2.vscode图形化配置 二、示例工程三、自定义工程四、点灯五、总结 0.前言 最近在学习freertos&#xff0c;但由于买的书还没到&#xff0c;所以先捣鼓捣鼓ESP-IDF&#xff0c;因为这个比Arduino更接近底…

『贪吃蛇』AI 算法简易实现(中秋特别版)

前言 一年一度的中秋节就快到了&#xff0c;平台也有各种各样的中秋发文活动&#xff0c;正在翻阅时偶然间我看到了这篇文章&#xff1a;《兔饼大作战》&#xff1a;吃月饼、见月亮&#xff0c;还能咬自己&#xff1f;| 欢庆中秋特制版 - 掘金 (juejin.cn) 大家肯定比较熟悉了…

python处理CSV文件

CSV库还有其他处理CSV的方法&#xff0c;这里只是介绍几个常用的&#xff0c;后面如果用到别的会进行更新 目录 1 生成一个新的csv文件&#xff0c;并向其中写一点东西 2 单纯往里面写几行 3 读取csv文件 1 生成一个新的csv文件&#xff0c;并向其中写一点东西 import…

Mybatis学习笔记11 缓存相关

Mybatis学习笔记10 高级映射及延迟加载_biubiubiu0706的博客-CSDN博客 缓存:cache 缓存的作用:通过减少IO的方式,来提高程序的执行效率 Mybatis的缓存:将select语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直接从缓存中取,不再查数据库.一方面是减少了I…

vision transformer

一、网络构建 import torch from torch import nn from functools import partial# --------------------------------------- # # &#xff08;1&#xff09;patch embeddingimg_size224 : 输入图像的宽高 patch_size16 &#xff1a; 每个patch的宽高&#xff0c;也是卷积核的…

zabbix监控nginx

目录 一、实验准备 二、监控nginx 一、实验准备 zabbix-sever&#xff08;192.168.115.4&#xff09; zabbix-agent&#xff08;192.168.115.5&#xff09; 添加监控对象 二、监控nginx 安装NGINX在192.168.115.5上安装NGINX&#xff0c;开启status模块 yum -y install ep…

uniapp:OCR识别身份证上传原图失败,问题解决

1、上传普通图片成功 2、上传>4M | >5M图片失败检查&#xff1a;1、uni.uploadFile自身没有文件大小限制。然而&#xff0c;这仍然取决于你的应用程序所在的平台和存储空间容量。 2、上传照片后不在fail&#xff0c;在sucess 提交照片-3 {"data": "<h…

yolov5自动训练/预测-小白教程

文章目录 引言一、配置参数设置1、数据参数配置2、模型训练参数配置3、模型预测参数配置 二、一键训练/预测的sh介绍1、训练sh文件(train.sh)介绍2、预测sh文件(detect.sh)介绍 三、本文训练main代码解读1、训练main函数解读2、数据加工与参数替换 四、本文预测main代码解读1、…

单片机内存管理

源码说明 源码包含memory.h 和 memory.c 两个文件&#xff08;嵌入式C/C代码的“标配”&#xff09;&#xff0c;其源码中包含重要的注释。 memory.h文件包含结构体等定义&#xff0c;函数API申明等&#xff1b; memory.c文件是实现内存管理相关API函数的原型。 memory.h …

相机HAL

相机HAL 1、概览实现 HAL2、相机 HAL2.1 AIDL 相机 HAL2.2 相机 HAL3 功能2.3 Camera HAL1 概览 相机 HAL 相机 实现 HAL android12-release 1、概览实现 HAL HAL 位于 相机驱动程序 和 更高级别的 Android 框架 之间&#xff0c;它定义您必须实现的接口&#xff0c;以便应用…

城市管网污水监测方案,科技助力污水排放管理!

根据《国务院办公厅关于加强入河入海排污口监督管理工作的实施意见》各地要明确“水污染&#xff0c;谁治理”和政府兜底的原则&#xff0c;明确排污主体责任。根据排污口类型集中整治&#xff0c;划分主体。加大私设暗管借道排污的监察力度溯源主体责任。加强科技研发&#xf…

Java实现添加文字水印、图片水印功能实战

Java实现添加文字水印、图片水印功能实战 本文介绍java实现在图片上加文字水印的方法&#xff0c;水印可以是图片或者文字&#xff0c;操作方便。 java实现给图片添加水印实现步骤&#xff1a; 获取原图片对象信息&#xff08;本地图片或网络图片&#xff09;添加水印&#…

9月20日作业

时钟代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QPaintEvent> #include <QTime> #include <QTimer> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class W…

初识canvas

对于一个前端人员来说&#xff0c;canvas是必须掌握的技能之一。如果你想像画画一样在浏览器上作画&#xff0c;那么canvas就可以做你的画布。 接下啦我们就以画画的标准来初步认识下canvas 1.画布 画画的第一步你得有一张画纸或者画布&#xff0c;canvas标签就是我们的画布…

中华崛起,科技强国!这三款充满科技风的科技模板,一起来探索吧

最近是不是都被华为mate60和苹果15刷屏了啊 &#xff0c;在我们的生活中&#xff0c;科技有着千变万化的面貌。它让我们的世界变得越来越小&#xff0c;让我们的生活越来越便捷。它使我们的梦想成为现实&#xff0c;使我们的思想得以落地。它打开了新的视野&#xff0c;为我们提…

grafana对指标进行组合计算

在使用Grafana配置图表看板时&#xff0c;我们可能需要对多个查询条件筛选出来的结果进行计算&#xff0c;把计算结果生成最终的图表。此时需要用到transform功能【add field from calculation】&#xff1a;

keytool工具生成JKS证书

生成证书 使用jdk keytool生成证书 自建证书不受CA信任&#xff0c;仅适合学习使用&#xff0c;如果需要用到服务中&#xff0c;建议使用由CA颁发的可信证书。如果仅是内部使用&#xff0c;也可以安装自己生成的证书到本机。 生成证书 keytool -genkey -alias jwt -keyalg RS…

【linux基础(七)】Linux中的开发工具(下)--make/makefile和git

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux中的开发工具 1. 前言2.…