Spring Cloud之Gateway网关学习【详细】

目录

统一网关Gateway

网关的实现

搭建网关

编写配置文件

路由断言工程

路由的过滤器

全局过滤器

网关过滤器执行顺序

网关的cors跨域配置

问题及解决


统一网关Gateway

网关的实现

SpringCloud中存在两种网关

  1. gateway:基于Spring5中提供的WebFlux实现,属于响应式编程,性能更好
  2. zuul:基于Servlet实现,阻塞式编程

搭建网关

首先网关也属于微服务的一个模块,也需要注册到Nacos与拉去Nacos的信息,创建gateway模块并引入以下两个依赖。

    <dependencies><!--nacos服务发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--网关依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>2.2.1.RELEASE</version></dependency></dependencies>

Gateway也是一个服务,需要一个启动类

@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class,args);}
}

编写配置文件

server:port: 10010
spring:application:name: gatewaycloud:nacos:server-addr: localhost:8848 # nacos的地址gateway:routes: # 路由地址- id: user-server # 路由唯一标识(自定义,只要唯一)uri: lb://user-server #路由目标地址predicates: # 路由断言。判断请求是否符合规则- Path=/user/**- id: order-service # 路由唯一标识uri: lb://order-service #路由目标地址predicates: # 路由断言。判断请求是否符合规则- Path=/order/**

启动网关服务,访问网关地址观察结果

具体流程如下

路由断言工程

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

例如Path=从user/**是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handlerpredicate.PathRoutePredicateFactory类来处理的。

Spring提供了11种基本的Predicate工厂

名称

说明

示例

After

是某个时间点后的请求

-After=2037-01-20T17:42:47.789-07:00[America/Denver]

Before

是某个时间点前的请求

-Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

Between

是某两个时间点之前的请求

-Between=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

权重处理

路由的过滤器

Spring提供了31种不同的路由过滤器工厂,具体可以去看SpringCloud文档,下面案例实现一个最基本的添加请求头过滤器。我们向/order所有请求添加一个gateway=hello world的请求头

首先添加配置

spring:cloud:nacos:server-addr: localhost:8848 # nacos的地址gateway:routes: # 路由地址- id: order-service # 路由唯一标识uri: lb://order-service #路由目标地址predicates: # 路由断言。判断请求是否符合规则- Path=/order/**filters:- AddRequestHeader=gateway,hello world

在OrderController中添加参数,并打印

@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId,@RequestHeader(value = "gateway",required = false) String str) {System.out.println("---------"+str);// 根据id查询订单并返回return orderService.queryOrderById(orderId);
}

访问观察控制台输出。

成功打印信息。

刚刚是针对某个路由生效,如果想要每个路由都生效,应该选择默认过滤器配置

spring:cloud:nacos:server-addr: localhost:8848 # nacos的地址gateway:routes: # 路由地址- id: order-service # 路由唯一标识uri: lb://order-service #路由目标地址predicates: # 路由断言。判断请求是否符合规则- Path=/order/**default-filters:- AddRequestHeader=gateway,hello world

全局过滤器

与Gateway的默认过滤器一样,处理一切进入网关请求和微服务响应。区别在于GatewayFilter通过配置定义,处理逻辑固定,而全局过滤器可以自己实现处理逻辑,实现方式就是实现GlobalFilter接口。下面写一个简单的登录拦截功能

/*** 登录认证过滤器*/
@Order(-1)
@Component
public class authorizeFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//第一步获取请求参数ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> params = request.getQueryParams();//获取参数中的authorize参数String authorize = params.getFirst("authorize");//判断参数是否等于adminif (authorize.equals("admin")){//等于,放行return chain.filter(exchange);}//设置状态码exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}
}

启动,并不添加验证访问测试

添加验证参数再次访问

网关过滤器执行顺序

请求进入网关会碰到3种过滤器:当前路由过滤器、DefaultFilter、GlobalFilter。

请求路由后,会将这三种过滤器合并到一个过滤器链(集合)中,排序后依次执行每个过滤器

首先比较order值,越小越先执行。GlobalFilter的order由我们指定,其他两种过滤器如果没有指定则由Spring指定order值,默认根据声明顺序来从1递增,当order值相同时,会按照defaultFilter>路由过滤器>GlobalFilter的顺序执行。

网关的cors跨域配置

跨域:是指域名不同。比如说:

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

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

解决跨域问题:配置如下信息

spring:cloud:gateway:globalcors:add-to-simple-url-handler-mapping: true #一定要配置,主要解决options请求被拦截问题cors-configurations:'[/**]': #拦截路径allowedOrigins: #允许哪些网站跨域请求- "http://localhost:5500"- "http://www.域名.com"allowedMethods: #允许的跨域ajax请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" #允许在请求中携带的头信息allowCredentials: true #是否允许携带CookiemaxAge: 360000 #本次跨域检测的有效期

编写一个简单的html页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>测试</title>
</head>
<body>
</body>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>axios.get("http://localhost:10010/user/1?authorize=admin").then(res=> console.log(res.data)).catch(err=>console.log(err))
</script>
</html>

使用VSCode启动该页面

问题及解决

如果出现此类错误

说明该请求没有被放行,可以尝试将配置文件中的localhost修改成127.0.0.1。或者修改C:\Windows\System32\drivers\etc\hosts文件添加如下信息即可

127.0.0.1 localhost

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

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

相关文章

Unity 粒子特效-第三集-星星闪烁特效

一、特效预览 二、制作原理 星星素材资源 链接&#xff1a;https://pan.baidu.com/s/17D-9sC-ErtqmUxl81Ln1Mw?pwdndm9 提取码&#xff1a;ndm9 1.素材介绍 仔细看&#xff0c;我们的粒子贴图是&#xff08;如下&#xff09;&#xff0c;一颗星星 2.步骤介绍 1.星星动画的…

【如何写论文】硕博学位论文的结构框架、过程与大纲分析

硕士论文可以说是毕业前最重要的一部分&#xff0c;也可以说是展示和检验你3年研究生学习的成果的一个考试。硕士论文答辩和检验合格&#xff0c;才能够顺利拿到毕业生和学位证&#xff0c;可见其重要性。 目录 一、基础框架1.1、摘要&#xff08;Abstract&#xff09;1.2、绪论…

【多线程面试题十五】、synchronized可以修饰静态方法和静态代码块吗?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;synchronized可以修饰静…

灯串上亚马逊加拿大合规标准CSA认证如何办理?

灯串 灯串和配件都是插头连接的便携式、临时性商品&#xff0c;最大额定输入电压为 120 伏。 本政策适用于季节性照明、装饰性灯具以及灯串。 亚马逊灯串政策 根据亚马逊的要求&#xff0c;所有季节性和装饰性灯串均应经过检测&#xff0c;并且遵守下列法规、标准和要求&…

AUTOSAR CAN协议栈架构总览介绍

Classic AUTOSAR层级架构简介 如下图是Classic AUTOSAR层级架构图,每个层主要功能如下 微控制器抽象层:使上层软件和微处理器型号无关,包含MCU中内部外设的驱动以及MCU内存映射的外部设备的驱动ECU抽象层:使上层软件和ECU硬件设计无关,包含ECU板上外部设备的驱动以及内部…

Hi3516DV500部署paddle版型分析模型记录

原版模型测试并导出onnx paddle 版面分析-> https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/ppstructure/layout/README_ch.md 测试 python3 deploy/python/infer.py \ --model_dirmodel/picodet_lcnet_x1_0_fgd_layout_cdla_infer/ \ --image_fil…

Apache Dolphinscheduler如何不重启解决Master服务死循环

个人建议 Apache Dolphinscheduler作为一个开源的调度平台&#xff0c;目前已经更新到了3.X版本&#xff0c;4.0版本也已经呼之欲出。3.0版本作为尝鲜版本&#xff0c;新添加了许多的功能&#xff0c;同时也存在非常多的隐患&#xff0c;本人使用3.0版本作为生产调度也踩了很多…

Android开发知识学习——TCP / IP 协议族

文章目录 学习资源来自&#xff1a;扔物线TCP / IP 协议族TCP连接TCP 连接的建立与关闭TCP 连接的建立为什么要三次握手&#xff1f; TCP 连接的关闭为什么要四次挥手&#xff1f; 为什么要⻓连接&#xff1f; 常见面试题课后题 学习资源来自&#xff1a;扔物线 TCP / IP 协议…

OpenCV学习(一)——图像读取

1. 图像入门 读取图像显示图像写入图像 import cv2# 读取图像 img cv2.imread(lena.jpg) print(img.shape)# 显示图像 cv2.imshow(image, img) cv2.waitKey(0) cv2.destroyAllWindows()# 写入图像 cv2.imwrite(image.jpg, img)1.1 读取图像 读取图像cv.imread(filename, fl…

人工智能-softmax回归

回归可以用于预测多少的问题。 比如预测房屋被售出价格&#xff0c;或者棒球队可能获得的胜场数&#xff0c;又或者患者住院的天数。 事实上&#xff0c;我们也对分类问题感兴趣&#xff1a;不是问“多少”&#xff0c;而是问“哪一个”&#xff1a; 某个电子邮件是否属于垃圾…

最新版本QGIS 开始支持cesium 3D TILE 数据源了

最新版本QGIS 也开始支持3D TILE 数据源了!加载和运行速度也是慢&#xff0c;不过都这样&#xff0c;也不是qgis的问题!这东西对网络和性能要求比较高!据说这是cesium社区提供基金让qgis团队开发的&#xff0c;cesium社区真是很有钱啊&#x1f601;&#xff0c;不过也不奇怪&am…

分享8个分布式Kafka的使用场景

Kafka 最初是为海量日志处理而构建的。它保留消息直到过期&#xff0c;并让消费者按照自己的节奏提取消息。与它的前辈不同&#xff0c;Kafka 不仅仅是一个消息队列&#xff0c;它还是一个适用于各种情况的开源事件流平台。 1. 日志处理与分析 下图显示了典型的 ELK&#xff0…

Matlab中的app设计

1.窗口焦点问题&#xff1a; 窗口焦点问题&#xff1a;确保你的应用程序窗口正常处于焦点状态。有时&#xff0c;其他窗口的弹出或焦点切换可能导致应用程序最小化。点击应用程序窗口以确保它处于焦点状态。 窗口管理&#xff1a;确保你的 MATLAB 或操作系统没有未处理的错误或…

​测绘人注意,你可能会改变历史!

你也许想不到&#xff0c;曾经有一个测绘人员在进行实地测量作业时&#xff0c;在地图上就这么随手一标注&#xff0c;却让这个地方成为了如今的网红打卡地。 这个地方就是外地游客慕名而来的“宽窄巷子”&#xff0c;如果连这个地方都不知道的成都人&#xff0c;就应该不能算…

CSS3表格和表单样式

在传统网页中&#xff0c;表格主要用于网页布局&#xff0c;因此也成为网页编辑的主要工具&#xff1b;在标准化网页设计中&#xff0c;表格的主要功能是显示数据&#xff0c;也可适当辅助结构设计。本章主要介绍如何使用CSS控制表格和表单的显示效果&#xff0c;如表格和表单的…

快速入门:使用 Spring Boot 构建 Web 应用程序

前言 本文将讨论以下主题&#xff1a; 安装 Java JDK、Gradle 或 Maven 和 Eclipse 或 IntelliJ IDEA创建一个新的 Spring Boot 项目运行 Spring Boot 应用程序编写一个简单的 Web 应用程序打包应用程序以用于生产环境 通过这些主题&#xff0c;您将能够开始使用 Spring Boo…

oracle (9)Storage Relationship Strut

Storage & Relationship Strut 存储和关系支柱 目标&#xff1a; 描述数据库的逻辑结构列出段类型其用途列出控制块空间使用的关键字获取存储结构信息 一、基础知识 1、数据库逻辑结构图 2、Types of Segments 段的类型 3、Storage Clause Precedence 存储条款的优先顺序 …

Spring Cloud之Docker的学习【详细】

目录 Docker 项目部署问题 总结 镜像与容器 Docker的安装 Docker基本操作 镜像相关命令 拉取镜像 镜像保存 删除镜像 镜像加载 容器相关命令 删除容器 数据卷 数据卷命令 数据挂载 自定义镜像 Dockerfile 案例 Docker-Compose Compose文件 Docker-Compos…

Termux SFTP如何实现远程文件传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…