【Gateway】统一网关Gateway学习记录

news/2024/4/28 4:36:13/文章来源:https://blog.csdn.net/m0_46628950/article/details/127521940

目录

网关能干什么

网关的技术实现

搭建网关服务

网关作用流程图

路由断言工厂(Route Predicate Factory)

gateway中有三种过滤器:

1. 默认过滤器(DefaultFiter)

2. 路由过滤器(GatewayFilter)

3. 全局过滤器(GlobalFilter)

当有多个全局过滤器时,如何决定过滤器的执行顺序呢?

三种过滤器执行的顺序

网关解决跨域问题


网关能干什么

  • 身份认证和权限校验
  • 服务路由、负载均衡
  • 请求限流

网关的技术实现

在SpringCloud中网关的实现包括两种:

  1. gateway
  2. zuul

Zuul是基于Servlet的实现,属于阻塞式编程。

SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,性能更好。

搭建网关服务

1. gateway pom文件

<!--        gateway 网关 pom--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

2. 配置yml

server :port: 10010 #gate网关端口(统一访问端口)
spring :application:name: gateway #网关服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: #网关路由配置- id: cloud-client       #路由id,自定义,只要唯- -即可uri: lb://cloud-client #路由的目标地址Lb就是负载均衡,后面跟服务名称predicates:            #路由断言,也就是判断请求是否符合路由规则的条件- Path=/hello/**     #这个是按照路径匹配,只要以/user/ 开头就符合要求

网关作用流程图

 

路由断言工厂(Route Predicate Factory)

我们在yml配置文件中写的断言规则只是字符串 ,这些字符串会被Predicate Factory读取并处理,转变为路由判断的PathRoutePredicateFactory类

例如Path=/user/**是按照路径匹配, 这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的
像这样的断言工厂在SpringCloudGateway还有十几个,

例如:

 


gateway中有三种过滤器:

  1. 默认过滤器
  2. 路由过滤器
  3. 全局过滤器

1. 默认过滤器(DefaultFiter)

对全部路由进行拦截

默认过滤器配置

server :port: 10010 #gate网关端口(统一访问端口)
spring :application:name: gateway #网关服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: #网关路由配置- id: cloud-client       #路由id,自定义,只要唯- -即可uri: lb://cloud-client #路由的目标地址Lb就是负载均衡,后面跟服务名称predicates:            #路由断言,也就是判断请求是否符合路由规则的条件- Path=/hello/**     #这个是按照路径匹配,只要以/user/ 开头就符合要求default-filters:- AddRequestHeader = Truth,this is demo #默认过滤器的配置

2. 路由过滤器(GatewayFilter)

只对指定路由进行拦截

路由过滤器配置

server :port: 10010 #gate网关端口(统一访问端口)
spring :application:name: gateway #网关服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: #网关路由配置- id: cloud-client       #路由id,自定义,只要唯- -即可uri: lb://cloud-client #路由的目标地址Lb就是负载均衡,后面跟服务名称predicates:            #路由断言,也就是判断请求是否符合路由规则的条件- Path=/hello/**     #这个是按照路径匹配,只要以/user/ 开头就符合要求filters:- AddRequestHeader = Truth,this is demo #路由过滤器的配置
  •  filters:是配置路由过滤器的过滤器
  •  AddRequestHeader:是 Spring提供写好的的路由过滤器工厂

3. 全局过滤器(GlobalFilter)

自定义逻辑的全部路由进行拦截

全局过滤器实现

1. 实现 GlobalFilter 接口

/*** @param  exchange:请求上下文,可以获得 Request,Response 等信息*          chain: 请求传递给下一个过滤器* @return $返回表示当前过滤器业务结束*/
@Order()
@Component
public class fiter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//获得请求参数MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();//获取参数中的authorization参数String auth = params.getFirst("authorization");//进行判断if("admin".equals(auth)){//正确,放行return chain.filter(exchange);}//错误,结束,返回错误码exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}
}

当有多个全局过滤器时,如何决定过滤器的执行顺序呢?

方法一:@Order()注解:当有多个全局过滤器时,决定过滤器的执行顺序,数字越小越先执行

方法二:实现 Ordered 接口,重写返回值

    @Overridepublic int getOrder() {return 0;}

三种过滤器执行的顺序

全局路由器通过适配器模式将默认过滤器和路由过滤器统一为GatewayFilter

 

  • 每一个过滤器都必须指定一个int类型的order值, order值越小,执行优先级越高。
  • GlobalFilter通过实现Ordered接口, 或者添加@Order注解来指定order值,由我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定, 默认是按照声明顺序从1递增
  • 当过滤器的order值一样时,会按照defaultFilter >路由过滤器> GlobalFilter的顺序执行
     

网关解决跨域问题

跨域问题:浏览器(前端)禁止请求的发起者与服务器(后端)发送跨域ajax请求,不接收服务器的响应,请求被拦截器拦截的问题

什么是ajax请求:简单来说就是,局部更新前端页面

spring:cloud:gateway:# 开启网关的跨域功能,具体微服务上的跨域需要进行关闭,否则无效globalcors:add-to-simple-url-handler-mapping: true     #解决options 请求被拦截问题corsConfigurations:'[/**]':                  # 匹配所有请求allowedOrigins: "*"     # 跨域处理 允许所有的域(前端的值)allowedMethods:         # 支持的方法- GET- POST- PUT- DELETEallowedHeaders: "*"        #允许在请求中携带的头信息allowCredentials: true     #是否允许携带cookiemaxAge: 360000             #这次跨域检测的有效期

配置Copy

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

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

相关文章

3. Longest Substring Without Repeating Characters (无重复字符的最长子串)滑动窗口

文章目录问题英文中文代码小白的码大佬的码知识点unordered_set 容器具有以下几个特性&#xff1a;总结问题 英文 3. Longest Substring Without Repeating Characters (无重复字符的最长子串) 中文 代码 小白的码 #include <iostream> #include <string> #…

Terraform 基础 申请阿里云资源

之前&#xff0c;资源都定义好了&#xff0c;现在就是去申请资源了。 申请这些资源就需要使用terraform的命令行了&#xff0c;开始初始化后端&#xff0c;后端是有存储文件的&#xff0c;默认情况下是在本地存储的&#xff0c;然后会多一些文件。 &#xff08;下载插件&#x…

在python中安装gensim包(为了使用LDA)

LDA是英文“Latent Dirichlet Allocation”的缩写&#xff0c;意思是隐含狄利克雷分布&#xff0c;是一种主题模型&#xff08;topic model&#xff09;&#xff0c;它可以将文档集中每篇文档的主题以概率分布的形式给出。 gensim包中有LDA的一种实现。 本文介绍gensim包的安…

神经网络中的算法-梯度下降算法

目录 一、概述 二、算法思想 1、一维 2、多维 三、梯度下降类型 1、批量梯度下降算法 2、随机梯度下降算法 3、小批量梯度下降算法 一、概述 梯度下降法&#xff08;Gradient descent &#xff09;是一个一阶最优化算法&#xff0c;通常也称为最陡下降法 &am…

NetworkManager nmcli ipv4 静态ip 笔记221025

nmcli connection modify 可以修改现有连接 con 可以写成 c 到 connection 之间的字段mod 可以写成 m 到 modify 之间的字段nmcli connection modify nmcli connec modify nmcli conne modif nmcii conn modi nmcli con mod nmcli co mo nmcli c m nmcli c modify nmcli conne…

购物中心智能管理系统该如何选择

快鲸智慧楼宇系统作为新一代数智化商管系统&#xff0c;以实际业务场景出发构建产品逻辑&#xff0c;并在传统商管系统基础上&#xff0c;拥有独家的商业大数据加持&#xff0c;同时嵌入了BI智能分析工具&#xff0c;打造了一个招商营运场景的数智化系统&#xff0c;将“人的经…

[C++] 初接触 泛型编程—— C++ 模板分析

泛型编程 C中引入了重载的概念&#xff0c;使得可以编写多个函数名相同但参数、返回值不同的函数&#xff0c;例如&#xff1a; 相同的函数名可以传入不同的参宿&#xff0c;进而调用不同的函数 但&#xff0c;即使有了重载&#xff0c;相同功能的函数 还要分别对不同的类型进…

Python之numpy数组篇(下)

目录 一、数组排序 1、概念 2、升序&#xff0c;最大、最小值 3、原地、横向排序 二、数组内积运算 1、概念 2、代码例子 三、访问数组元素 1、使用介绍 2、行列直接访问 3、切片 4、行列访问扩展 四、数组对函数运算的支持 1、概念 2、例子 五、改变数组形状 1…

1.3.3系统调用

文章目录为什么引入系统调用什么是系统调用系统调用和库函数的区别系统调用的背后为什么引入系统调用 为了防止这样情况的发生&#xff0c;就是防止进程能够随意的去调用我们的系统资源&#xff0c;操作系统提供了系统调用的功能&#xff0c;用户进程想要使用打印机这种共享资源…

12_Vue事件总结

事件总结 事件修饰符连携 准备工作 html <!-- 定义一个容器 --><div class="app"><!-- 事件修饰符连携 --><div class="box" @click="toBaidu"><a href="https://www.baidu.com" @click.stop="toBaid…

Java代码审计前置知识——SpringMVC基础

目录 (一&#xff09;回顾MVC 1.1 什么是MVC Model&#xff08;模型&#xff09; View&#xff08;视图&#xff09; Controller&#xff08;控制器&#xff09; 1.2 Model1时代 1.3 Model2时代 总结 1.4 回顾Servlet 0x01 新建一个Maven工程当做父工程,pom依赖 0x0…

1.1.2操作系统的特征

操作系统是一个系统软件&#xff0c;但与其他系统软件和应用软件有很大的不同&#xff0c;就是它拥有自己的特殊性&#xff0c;及基本特征 首先共享和并发是相互存在的条件共享和并发是虚拟和异步的前提&#xff0c;是操作系统的两个最基本的特征 1并发 拿餐厅吃饭举例子&…

3.3.3JavaScript网页编程——WebAPI(JS之BOM含正则)

目录BOMwindow对象定时器-延时函数setTimeoutJS执行机制&#xff08;执行栈、任务队列&#xff09;面试要问location对象location.href (获取完整url或者赋值)location.search (获取?后面的)location.hash(获取#号后面的)location.reloadnavigator对象&#xff08;检测浏览器移…

10_事件处理阶段

v-on指令 语法 v-on:xxx 这里的xxx指代的是各类事件类型,例如单击,双击,鼠标悬停,键盘监听等等...... 准备工作 准备一个容器,两个按钮,一个按钮不传递参数,另一个按钮传递参数 <body><!-- 创建一个容器 --><div class="subject"><!-- 标…

having where的区别,SQL70 返回更多的产品

返回更多的产品_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/dc91b7d2de3c4603a55995e83210f605?tpId298&tqId2368029&ru/exam/oj&qru/ta/sql-teach-yourself/question-ranking&sourceUrl%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%25E7%25A…

MMSegmentation V0.27.0训练与推理自己的数据集(二)

1、官方模型转换MMSegmentation风格 如果你想自己转换关键字使用官方存储库的预训练模型&#xff0c;我们还提供了一个脚本swin2mmseg.py在tools directory &#xff0c;将模型的关键字从官方的repo转换为MMSegmentation风格。 python tools/model_converters/swin2mmseg.py …

一篇文章带你了解服务器操作系统——Linux简单入门

一篇文章带你了解服务器操作系统——Linux简单入门 Linux作为服务器的常用操作系统,身为工作人员自然是要有所了解的 在本篇中我们会简单介绍Linux的特点,安装,相关指令使用以及内部程序的安装等本篇内容属于《瑞吉外卖》的知识科普部分,有兴趣可以查看一下《瑞吉外卖》的相…

欧拉路径(欧拉环游、欧拉回路)

一个流行的游戏是用铅笔画这些图&#xff0c;但是图中的每一条边都只能被画一次&#xff0c;在画图过程中铅笔不能离开纸面。难度更高的问题是&#xff0c;不光要一笔画完图&#xff0c;并且起点和终点还要落在同一处。如果我们将上面的三个图形都看作图数据结构&#xff0c;那…

flash动画设计并发布、嵌入到网页

【创意内容】 Flash动画设计,二维动画自己选择了动画主题,有三个板块:bubbles动画、蝴蝶飞动画、全球游线图动画,都是自己做的,使用了场景运用动画、图片的滚动、形状遮罩等功能。 【程序运行截图】 bubbles butterflies global

ICCV 2021 | Y-Net:轨迹-场景信息的真正融合

今天没有多余的解释&#xff0c;直接开始吧~ 1. Y-Net网络结构 Y-Net的网络结构长什么样子呢&#xff1f;Y-Net的网络结构就长下图这样子。看上去我好像在自言自语&#xff0c;其实你仔细揣摩就会发现&#xff0c;我真的是在自言自语。可以看到说&#xff0c;Y-Net网络输入的是…