当前位置: 首页 > news >正文

SpringCloud微服务网关Gateway:gateway基本实现、断言工厂、过滤器工厂、浏览器同源策略、跨域问题解决方案

Gateway网关

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0和Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API路由管理方式

为什么需要网关

Gateway网关就是我们服务的守门神,所有微服务的统一入口

网关的核心功能

  1. 请求路由
  2. 权限控制
  3. 限流

网关架构图:

在这里插入图片描述

**权限控制:**网关作为微服务入口,需要校验用户是否有请求资格,如果没有则进行拦截。

**路由和负载均衡:**一切请求都必须先经过ateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。

**限流:**当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。在SpringCloud中网关的实现包括两种:

  • gateway
  • zuul

Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

Gateway基本实现

实现步骤:

  1. 创建SpringBoot项目,引入网关依赖
  2. 编写基础配置和路由规则
  3. 启动网关服务进行测试
  • 创建gateway服务,引入依赖

    创建服务,创建一个api-gateway的版块,导入相关依赖

    <dependencies><!--gateway网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--nacos客户端--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
    </dependencies>
    
  • 编写基础配置和路由规则

    编写api-gateway的application.yaml配置文件

    基本版本:

    server:port: 7000
    spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: true # 让gateway可以发现nacos中的微服务routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route # 当前路由的标识, 要求唯一uri: http://localhost:8081/ # 请求要转发到的地址order: 1 # 路由的优先级,数字越小级别越高predicates: # 断言(就是路由转发要满足的条件)- Path=/product-serv/** # 当请求路径满足Path指定的规则时,才进行路由转发filters: # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 # 转发之前去掉1层路径
    

    高级版本:

    server:port: 7000
    spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: true # 让gateway可以发现nacos中的微服务routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route # 当前路由的标识, 要求唯一uri: lb://service-product # lb指的是从nacos中按照名称获取微服务,并遵循负载均 衡策略order: 1 # 路由的优先级,数字越小级别越高predicates: # 断言(就是路由转发要满足的条件)- Path=/product-serv/** # 当请求路径满足Path指定的规则时,才进行路由转发filters: # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 # 转发之前去掉1层路径
    

    将符合Path规则的一切请求,都带力道uri参数指定的地址

  • 启动网关服务进行测试

总结:

网关搭建步骤:

  1. 创建项目,引入nacos服务发现和gateway依赖
  2. 配置application.yaml,包括服务基本信息,nacos地址,路由

路由配置包括:

  1. 路由id:路由的唯一标识
  2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
  3. 路由断言(predicates):判断路由规则
  4. 路由过滤器(filters):对请求或响应做处理

断言工厂

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

例如Path=/user/**是按照路径匹配,这个规则是由

org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactoyt类来处理的,像这样的断言工厂在SpringCloudGateway还有十几个

名称说明示例
After某个时间点后的请求- After=2037-01-20T17:42:47.789-07:00[America/Denver]
Before某个时间点前的请求- Before=2037-01-20T17:42:47.789-07:00[America/Denver]
Between某两个时间点之间的请求- Before=2037-01-20T17:42:47.789-07:00[America/Denver],2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie请求必须包含某些cookie- Cookie=chocolate, ch.p
Header请求必须包含某些header- Header=X-Request-ld, d+
Host请求必须是访问某个host(域名)- Host=.somehost.org,.anotherhost.org
Method请求方式必须是指定方式- Method=GET,POST
Path请求路径必须复合指定规则- Path=/red/{segment;,/blue/**
Query请求参数必须包含指定参数- Query=name,Jack或者 - Query=name
RemoteAddr请求者的ip必须是指定范围- RemoteAddr=192.168.1.1/24
Weight权重处理

过滤器工厂

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的相应处理

在这里插入图片描述

路由过滤器的种类

Spring提供了31中不同的路由过滤工厂

名称说明
AddRequestHeader给当前请求添加一个请求头
RemoveRequestHeader移除请求中的一个请求头
AddResponseHeader给响应结果中添加一个响应头
RemoveResponseHeader从响应结果中移除一个响应头
RequestRateLimiter限流请求的流量

请求头过滤器

以AddRequestHeader为例演示:

只需要修改gateway服务的application.yaml文件,添加路由过滤即可:

server:port: 7000
spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enable: true  # 让gateway可以发现nacos中的微服务routes:- id: product_routeuri: lb://service-productorder: 1predicates:- Path=/product-serv/**filters:- AddRequestHeader=msg,GGBond!  #添加请求头

默认过滤器

如果要对所有的路由都生效,则可以将过滤工厂写道default下。格式如下:

server:port: 7000
spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enable: true  # 让gateway可以发现nacos中的微服务routes:- id: product_routeuri: lb://service-productorder: 1predicates:- Path=/product-serv/**default-filters:   #默认过滤器,会对所有的路由请求都生效- AddRequestHeader=msg,GGBond! #添加请求头 

全局过滤器

网关提供了31种,但每一种过滤器的作用都是固定的。如果我们希望拦截请求,做自己的业务逻辑则没办法实现

全局过滤器作用

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。

定义方式是实现GlobalFilter接口

public interface GlobalFilter{/*处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理@param exchange 请求上下文,里面可以获取Request、Response等信息@param chain 用来把请求委托给下一个过滤器@return {@code Mono<Void>} 返回标示当前过滤器业务结束*/Mono<void> filter(ServerWebExchange exchange,GatewayFilterChain chain)
}

在filter中编写自定义逻辑,可以实现下列功能

  • 登陆状态判断
  • 权限校验
  • 请求限流等

自定义全局过滤器

需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:

  • 参数中是否authorization
  • authorization参数值是否为admin

如果同时满足则放行,否则拦截

实现:在gateway中定义一个过滤器

@Order(-1)
@Component
public class AuthorizeFilter implements GlovalFilter{@Overridepublic Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain){// 1.获取请求参数MultiValueMap<String,String> params = exchange.getRequest().getQueryParams();String auth = params.getFirst("authorization");// 2.校验if("admin".equals(auth)){return chain.filter(exchange);}// 拦截// 禁止访问exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 结束处理return exchange.getResponse().setComplete();}
}
// 发送请求测试
// http://localhost:7000/product-serv/product/6?authorization=admin

过滤器执行顺序

请求进入网关会碰到三类过滤器: 当前路由的过滤器、DefaultFilter、GlobalFilter请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中排序后依次执行每个过滤器:

在这里插入图片描述

排序的规则:

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

浏览器同源策略

1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策

最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源”。所谓"同源"指的是"三个相同”。

  • 协议相同
  • 域名相同
  • 端口相同

举例:

http://www.example.com/dir/page.html网址

  • 协议是http://
  • 域名是www.example.com
  • 端口是80(默认端口可以省略)

它的同源情况如下

http://www.example.com/dir2/other.html: 同源
http://example.com/dir/other.html: 不同源(域名不同)
http://v2.www.example.com/dir/other.html: 不同源(域名不同)
http://www.example.com:81/dir/other.html: 不同源(端口不同)

同源目的

同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。

设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?

很显然,如果 Cookie 包含隐私(比如存款总额) ,这些信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。

由此可见,"同源政策"是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了

跨域问题解决方案

跨域:域名不一致就是跨域 ,主要包括:

  • 域名不同:www.taobao.com和www.taobao.org和www.jd.com和shouji.jd.com
  • 域名相同:端口不同:localhost:8080和localhost:8081

跨域问题:浏览器进制请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

CORS

CORS是跨源资源分享(Cross-Origin Resource Sharing)的缩写。它是W3C标准,是跨源AJAX请求的根本解决方法。相比JSONP只能发GET请求,CORS允许任何类型的请求

在gateway服务的application.yaml文件中,添加下面的配置

spring:cloud:gateway:globalcors: #全局的跨域处理add-to-simple-url-handler-mapping: true #解决options请求被拦截问题corsConfigurations:'[/**]':allowedOrigins: #语序哪些网站的跨域请求- "http://localhost:8090"allowedMethods: #语序的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowerHeaders: "*" 	  # 允许在请求中携带的头信息allowCredentials: true  # 是否允许携带cookiemaxAge: 360000 				  # 这次跨域检验的有效期

相关文章:

SpringCloud微服务网关Gateway:gateway基本实现、断言工厂、过滤器工厂、浏览器同源策略、跨域问题解决方案

Gateway网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0和Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API路由管理方式 为什么…...

ArcGIS中如何建立土地利用规划数据库

一、建库步骤 - 收集土地利用规划资料,包括图件资料、数据资料和文本资料。 - 将收集到的数据进行整理和格式转换,使其符合ArcGIS 的数据格式要求。 - 在ArcGIS 中创建新的土地利用规划数据库,并定义相应的数据结构和字段。 - 将转换后的数据导入到新的土地利用规划数据库中…...

微信小程序 服务端返回富文本,图片无法显示

场景&#xff1a;   微信小程序开发中&#xff0c;需要从服务端拿取数据渲染到页面上&#xff0c;后台返回的富文本里&#xff0c;图片路径有时是没有带域名前缀的&#xff0c;导致图片无法正常显示。 解决方案&#xff1a;   在富文本返回时&#xff0c;用正则匹配&#…...

谈谈Redis持久化

目录 前言 RDB AOF 总结 前言 我们都知道Redis 是基于内存的数据库&#xff0c;一旦服务器的进程退出&#xff0c;数据库数据就会随之丢失&#xff0c;这不是我们想看到的&#xff0c;为了避免这个问题&#xff0c;Redis 为我们提供了俩种持久化方案&#xff0c;将数据保存…...

CentOS7中升级OpenSSL详细教程

文章目录 一. 引言二. 升级前的准备1.备份现有配置2. 检查系统版本3. 安装依赖 三. OpenSSL安装四. 验证 一. 引言 OpenSSL: 是用于保护数据安全的重要工具。它能提供加密&#xff0c;解密等多项功能。 然而&#xff0c;随着技术的发展和新的安全漏洞的出现&#xff0c;使用最…...

人工智能基础_机器学习050_对比sigmoid函数和softmax函数的区别_两种分类器算法的区别---人工智能工作笔记0090

可以看到最上面是softmax的函数对吧,但是如果当k = 2 那么这个时候softmax的函数就可以退化为sigmoid函数,也就是 逻辑斯蒂回归了对吧 我们来看一下推导过程,可以看到上面是softmax的函数 可以看到k=2 表示,只有两个类别对吧,两个类别的分类不就是sigmoid函数嘛对吧,所以说 …...

第十九章 解读利用pytorch可视化特征图以及卷积核参数(工具)

介绍一种可视化feaature maps以及kernel weights的方法 推荐可视化工具TensorBoard&#xff1a;可以查看整个计算图的数据流向&#xff0c;保存再训练过程中的损失信息&#xff0c;准确率信息等 学习视频&#xff1a; 使用pytorch查看中间层特征矩阵以及卷积核参数_哔哩哔哩…...

【React】Memo

组件重新渲染时缓存计算的结果。 实例&#xff1a;count1计算斐波那契数列&#xff0c;count2和count1可以触发数值变化。使用memo可以使只有在count1变化时触发斐波那契数列计算函数&#xff0c;而count2变化时不触发斐波那契数列计算函数。 import { useMemo } from "r…...

宣传技能培训1——《新闻摄影技巧》光影魔法:理解不同光线、角度、构图的摄影效果,以及相机实战操作 + 新闻摄影实例讲解

新闻摄影技巧 写在最前面摘要 构图与拍摄角度景别人物表情与叙事远景与特写 构图与拍摄角度案例 主体、陪体、前景、背景强调主体利用前景和背景层次感的创造 探索新闻摄影中的构图技巧基本构图技巧构图技巧的应用实例实例分析1. 黄金分割和九宫格2. 三角型构图3. 引导线构图4.…...

3 时间序列预测入门:TCN

0 引言 TCN&#xff08;全称Temporal Convolutional Network&#xff09;&#xff0c;时序卷积网络&#xff0c;是在2018年提出的一个卷积模型&#xff0c;但是可以用来处理时间序列。 论文&#xff1a;https://arxiv.org/pdf/1803.01271.pdf 一维卷积&#xff1a;在时间步长方…...

Linux学习笔记-芯片性能检测

文章目录 概述Dhrystone&#xff08;单核性能测试工具&#xff09;简介&#xff1a;源码下载&#xff1a;源码编译&#xff1a;使用及输出结果 coremark&#xff08;多核性能测试工具&#xff09;简介&#xff1a;源码下载&#xff1a;源码编译&#xff1a;使用及输出结果&…...

2023年网络安全比赛--综合渗透测试②(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.通过 PC 中的渗透测试平台 Kali 对服务器场景进行渗透测试,将扫描开放的所有端口当作flag提交(例:21,22,23); 2.通过 PC 中的渗透测试平台 Kali 对服务器场景进行渗透测试,将初…...

关于8位图像buffer显示到picturebox上

最终版本&#xff1a; void showbuffer2pictmod4(byte[] buffer, int ww, int hh, PictureBox destImg) { int mod ww % 4;//解决四位对齐问题20150716 int temproiw ww (4 - mod) % 4;//其实这都是和显示相关&#xff0c;处理图像其实不必…...

cocos游戏引擎制作的滚动框地图防止误点操作的简单方法

本篇文章主要讲解&#xff0c;使用cocos creator 来解决在我们日常滚动框开发中&#xff0c;滚动和触摸存在冲突的情况&#xff0c;导致的误触行为的解决办法。 日期&#xff1a;2023年11月25日 具体事项 说明&#xff1a;在我们滚动滚动框时&#xff0c;会出现误点的情况&…...

vue 使用vuex中的data数据引用问题

先上代码&#xff1a; this.userRoleInfo2 this.$store.state.userInfo this.userRoleInfo2.name 111 this.userRoleInfo2.orgName 222 this.userRoleInfo2.orgId 4444问题描述&#xff1a; 博主&#xff0c;定义了一个变量userRoleInfo2来接收了 从vuex中获取了userInfo…...

日志配置的一些思考

日志配置的一些思考 背景说明基础配置抽取子服务扩展配置 背景 基本所有的系统都需要完善的日志配置, 这里是一些常用的配置. 但是没有本地验证, 只能提供一份配置思路. 说明 不可直接用, 会报错, 提供一种配置思路. 不可直接用, 会报错, 提供一种配置思路. 不可直接用, 会报…...

阶梯排列硬币

题意&#xff1a; 你总共有 n 枚硬币&#xff0c;并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯&#xff0c;其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。 给你一个数字 n &#xff0c;计算并返回可形成 完整阶梯行 的总行数。 示例 1&#xff…...

HarmonyOS应用开发者高级认证【题库答案】

HarmonyOS应用开发者基础认证【题库答案】 一、判断题 云函数打包完成后&#xff0c;需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用&#xff08;错&#xff09;在column和Row容器组件中&#xff0c;aligntems用于设置子组件在主轴方向上的对齐格式&#xf…...

【解答】关于Linux内核的一些疑问

GNU计划是什么 GNU计划是由理查德斯托曼在1983年9月27日公开发起的自由软件集体协作计划&#xff0c;其目标是创建一套完全自由的操作系统GNU。这个操作系统的内容软件完全以GPL方式发布&#xff0c;意味着用户拥有运行、复制、分发、学习、修改和改进该软件的自由。 GNU的命名…...

状态设计模式是什么?什么是 State 状态设计模式?Python 状态设计模式示例代码

什么是 State 状态设计模式&#xff1f; 状态设计模式是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态发生改变时改变其行为&#xff0c;使其看起来好像改变了其类。状态模式主要解决的问题是&#xff1a;当一个对象的行为取决于它的状态&#xff0c;并且在运行时…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...