SpringCloudGateway — 网关路由

Spring Cloud Gateway 是 Spring 提供的一个高效、灵活的 API 网关解决方案,基于 Spring 5、Spring Boot 2 和 Project Reactor,具有高并发和低延迟的特点。它用于在微服务架构中对外提供统一的入口,处理请求的路由、过滤、负载均衡等功能。

由于每个微服务都有不同的地址或端口,入口不同,前后端联调会发现一些问题:

  • 请求不同数据时要访问不同的入口,需要维护多个入口地址,麻烦

  • 前端无法调用nacos,无法实时更新服务列表

官网:https://spring.io/projects/spring-cloud-gateway#learn

1. 网关简介

顾明思议,网关就是络的口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验

现在,微服务网关就起到同样的作用。前端请求不能直接访问微服务,而是要请求网关:

  • 网关可以做安全控制,也就是登录身份校验,校验通过才放行

  • 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去

2. Spring Cloud Gateway基本概念

Spring Cloud Gateway 的核心概念包括 Route(路由)、Predicate(断言)和 Filter(过滤器)。

  • Route(路由):Route 是 Gateway 的基本构建单元。每个 Route 都有一个唯一的 ID、一个匹配规则(Predicate)和一个目标 URL(URI)。

  • Predicate(断言):用于判断请求是否匹配当前路由规则。例如,可以根据请求路径、请求方法、请求头等信息进行匹配。

  • Filter(过滤器):用于在请求或响应中进行处理。过滤器可以用于权限认证、请求修改、响应修改等。

3. Spring Cloud Gateway 的优势

  • 路由控制:能够将请求转发到不同的微服务。

  • 请求过滤:提供强大的过滤机制,可以对请求进行验证、修改等处理。

  • 负载均衡:支持与 Spring Cloud LoadBalancer 集成,提供自动负载均衡。

  • 限流和熔断:支持对请求进行限流和熔断,保障服务的稳定性。

4. 快速入门

4.1 创建项目

由于网关本身也是一个独立的微服务,因此也需要创建一个独立的微服务项目开发功能。

4.2 引入依赖

        <!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--nacos discovery--><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-loadbalancer</artifactId></dependency>

4.3 配置路由

Spring Cloud Gateway 支持两种方式配置路由:基于配置文件(application.yaml)配置基于 Java 代码配置

4.2.1 基于配置文件的路由配置

application.yaml 中可以定义 Gateway 的路由规则。下面是一个示例配置:

server:port: 8080 # 配置网关服务的启动端口为8080spring:application:name: gateway # 指定应用名称为 "gateway"cloud:nacos:server-addr: 192.168.1.101:8848 # Nacos服务器地址,用于服务注册与发现gateway:routes: # 配置网关路由- id: item # 路由规则的唯一ID,用于标识此路由规则uri: lb://item-service # 指定路由的目标服务地址,这里使用负载均衡 (lb://) 前缀,表示从Nacos注册中心拉取 "item-service" 服务的实例predicates: # 路由断言,定义规则,决定哪些请求可以匹配到该路由- Path=/items/**,/search/** # 路径断言,表示匹配请求路径以 "/items/" 或 "/search/" 开头的请求,符合则路由到 item-service- id: cart # 路由规则的唯一IDuri: lb://cart-service # 指定目标服务为 "cart-service",同样通过负载均衡从注册中心获取实例predicates:- Path=/carts/** # 路径断言,匹配以 "/carts/" 开头的请求,将其路由到 "cart-service"- id: user # 路由规则的唯一IDuri: lb://user-service # 指定目标服务为 "user-service"predicates:- Path=/users/**,/addresses/** # 路径断言,匹配以 "/users/" 或 "/addresses/" 开头的请求,将其路由到 "user-service"- id: trade # 路由规则的唯一IDuri: lb://trade-service # 指定目标服务为 "trade-service"predicates:- Path=/orders/** # 路径断言,匹配以 "/orders/" 开头的请求,将其路由到 "trade-service"- id: pay # 路由规则的唯一IDuri: lb://pay-service # 指定目标服务为 "pay-service"predicates:- Path=/pay-orders/** # 路径断言,匹配以 "/pay-orders/" 开头的请求,将其路由到 "pay-service"
  • id:路由的唯一标识。

  • uri:目标服务的地址。如果注册中心集成了负载均衡,可以使用 lb://service-name 的形式来配置服务。

  • predicates:断言规则,用于匹配请求。这里使用 Path 来匹配请求路径,/user/** 表示所有以 /user/ 开头的请求都将匹配该路由。

4.2.2 路由过滤讲解

路由规则的定义语法如下:

spring:cloud:gateway:routes:- id: itemuri: lb://item-servicepredicates:- Path=/items/**,/search/**

4.2.3 断言配置讲解

Spring Cloud Gateway 提供了多种断言来匹配请求。常用的断言包括:

  • Path 路径匹配:匹配请求路径。例如,Path=/user/** 匹配所有以 /user/ 开头的路径。

  • Method 请求方法:匹配请求方法。例如,Method=GET 匹配所有 GET 请求。

  • Header 请求头:匹配请求头。例如,Header=X-Request-Id 匹配包含 X-Request-Id 请求头的请求。

  • Query 参数匹配:匹配查询参数。例如,Query=token 匹配包含 token 参数的请求。

spring:cloud:gateway:routes:- id: header-routeuri: lb://service-namepredicates:- Header=X-Request-Id # 请求头断言- id: method-routeuri: lb://service-namepredicates:- Method=GET # 请求方法断言- id: query-routeuri: lb://service-namepredicates:- Query=token # 查询参数断言

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter常用配置元件介绍总结之用linux服务器压测

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之用linux服务器压测 1.编写测试脚本2.执行测试脚本 1.编写测试脚本 在linux服务器上进行压测&#xff0c;由于是没有界面的&#xff0c;因此我们可以先在界面上把压测脚本写好&#xff1a; 如图&#xff1a;我这里简单的写…

Ubuntu 的 ROS 操作系统安装与测试

引言 机器人操作系统&#xff08;ROS, Robot Operating System&#xff09;是一个用于开发机器人应用的开源框架&#xff0c;它提供了一系列功能丰富的库和工具&#xff0c;能够帮助开发者构建和控制机器人。 当前&#xff0c;ROS1的最新版本为Noetic Ninjemys&#xff0c;专为…

计算机组成原理——编码与纠错(汉明编码)

校验码放在2^x次方的位置——即1&#xff0c;2&#xff0c;4——将检测位按序排列p3p2p1 汉明编码从左到右数某个位置位1&#xff08;位数&#xff09;&#xff0c;就表示第几组 奇偶校验 例题 纠错过程 汉明编码的最小距离是3

fabric操作canvas绘图(1)共32节

对于前端而言&#xff0c;离不开canvas就像鱼离不开水&#xff0c;前端canvas神器fabric你值得拥有&#xff01;接下来我们就来一步步揭开她的面纱。 一、fabric的理解 用原生的canvas来实现&#xff0c;代码量会比较大&#xff0c;而且还要处理很多细节&#xff0c;而Fabric…

C++ 内存分布及 new , delete 分配问题( ~~~ 面试重要 ~~~)

文章目录 前言一、内存分布二、new 、delete 分配问题总结 前言 本篇文章笔者将会对 C 中的内存问题简单的讲解 , 同时对 new , delete 的面试题进行重点讲解. 一、内存分布 ● C语言和C 分布情况是一样的, 如下 : ● 栈 ○ 栈 的管理是由编译器自动管理 , 不需要我们人为做…

数据结构-哈夫曼树

一.什么是哈夫曼树 不同搜索树的效率是不一样的,根据不同的频率构造效率比较好或者最好的搜索树就是哈夫曼树 二.哈夫曼树的定义 将带权路径的长度降低最低 每个叶子节点到根节点的距离乘权值&#xff0c;再全都加起来就得到了WPL值 第一颗二叉树:从上到下计算 5x14x23x32x41…

双11精选网络安全书单:打造数字世界的钢铁长城!

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 &#x1f31f;双11火热来袭&#xff0c;网络安全书单推荐&#x1f680; 随着数字化浪潮的汹涌澎湃&#xff0c;网络安全已经成为了每个从业者不可回避的重要议…

WebGUI之Gradio:Gradio 5的简介、安装和使用方法、案例应用之详细攻略

WebGUI之Gradio&#xff1a;Gradio 5的简介、安装和使用方法、案例应用之详细攻略 目录 Gradio 5的简介 1、Gradio的适用场景 2、Gradio 5 的主要改进包括&#xff1a; Gradio 5的安装和使用方法 1、安装和使用方法 2、使用方法 2.1、文本内容 (1)、简单的输入/输出组件…

初始Python篇(5)—— 集合

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 集合 相关概念 集合的创建与删除 集合的操作符 集合的相关操作方法 集合的遍历 集合生成式 列表、元组、字典、集合的…

探索Python的Shell力量:Plumbum库揭秘

文章目录 探索Python的Shell力量&#xff1a;Plumbum库揭秘第一部分&#xff1a;背景介绍第二部分&#xff1a;Plumbum是什么&#xff1f;第三部分&#xff1a;如何安装Plumbum&#xff1f;2. 创建管道3. 重定向4. 工作目录操作5. 前台和后台执行 第五部分&#xff1a;场景应用…

大模型时代,算法岗到底哪个最有前景?什么样的算法工程师更吃香?

毫无疑问&#xff0c;全栈型的算法工程师将更为抢手&#xff0c;如果你精通大模型从训练到应用的整个流程&#xff0c;你走到哪里都不怕。 但往往人的精力有限&#xff0c;如果从数据、预训练、微调、对齐、推理、应用几个方面来看的话&#xff0c;个人觉得 “预训练>数据&…

Linux系统之sleep命令的基本使用

Linux系统之sleep命令的基本使用 一、sleep命令介绍二、sleep的使用帮助2.1 查看帮助信息2.2 基本语法 三、sleep命令的基本使用3.1 指定暂停时间长度3.2 结合多个时间单位 四、在脚本中应用五、注意事项 一、sleep命令介绍 sleep命令是一个在Unix和类Unix操作系统中常见的命令…

《Java核心技术 卷I》Swing处理2D图形

处理2D图形 Java1.0开始&#xff0c;Graphics类就包含绘制直线、矩形和椭圆等方法&#xff0c;但是绘制图形的操作能力有限&#xff0c;我们将使用Java2D的图形库。想绘制需要获得Graphics2D类的一个对象&#xff0c;是Graphics的子类。paintCompoent方法接收一个2D类对象&…

MySQL:客户端工具创建数据库

MySQL 是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;用于存储、管理和检索数据。MySQL是基于SQL语言的&#xff0c;它具有高效、可靠、易用的特点。 客户端工具 这个mysqld.exe就在计算机安装的数据可服务&#xff0c;启动之后&#xff0c;mys…

【Python】计算机视觉应用:OpenCV库图像处理入门

计算机视觉应用&#xff1a;OpenCV库图像处理入门 在当今的数字化时代&#xff0c;计算机视觉&#xff08;Computer Vision&#xff09;已经渗透到各行各业&#xff0c;比如自动驾驶、智能监控、医疗影像分析等。而 Python 的 OpenCV 库&#xff08;Open Source Computer Visi…

万字长文详解JavaScript基础语法--前端--前端样式--JavaWeb

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天毛毛张带来的前端教程的第三期&#xff1a;JavaScript 文章目录 4.JavaScript4.1 JS简介4.1.1 JS起源4.1.2 JS 组成部分4.1.3 JS的引入方式 4.2 JS的数据类型和运…

医学图像算法之基于Unet的视网膜血管分割

第一步&#xff1a;准备数据 视网膜血管分割数据比较少&#xff0c;但效果好&#xff0c;总共40张 第二步&#xff1a;搭建模型 UNet主要贡献是在U型结构上&#xff0c;该结构可以使它使用更少的训练图片的同时&#xff0c;且分割的准确度也不会差&#xff0c;UNet的网络结构…

深度剖析JUC中LongAdder类源码

文章目录 1.诞生背景2.LongAdder核心思想3.底层实现&#xff1a;4.额外补充 1.诞生背景 LongAdder是JDK8新增的一个原子操作类&#xff0c;和AtomicLong扮演者同样的角色&#xff0c;由于采用AtomicLong 保证多线程数据同步&#xff0c;高并发场景下会导致大量线程同时竞争更新…

Python(PySimpleGUI 库)

PySimpleGUI 是一个用于简化 GUI 编程的 Python 包&#xff0c;它封装了多种底层 GUI 框架&#xff08;如 tkinter、Qt、WxPython 等&#xff09;&#xff0c;提供了简单易用的 API。PySimpleGUI 包含了大量的控件&#xff08;也称为小部件或组件&#xff09;&#xff0c;这些控…

LangChain学习心得总结

大模型开发遇到的问题及langchain框架学习 背景&#xff1a; 1、微场景间跳转问题&#xff0c;无法实现微场景随意穿插 2、大模型幻读&#xff08;推荐不存在的产品、自己发挥&#xff09; 3、知识库检索&#xff0c;语义匹配效果较差&#xff0c;匹配出的结果和客户表述的…