SpringCloudGateway — 网关路由

news2024/11/6 6:48:40

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 # 配置网关服务的启动端口为8080

spring:
  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 # 路由规则的唯一ID
          uri: lb://cart-service # 指定目标服务为 "cart-service",同样通过负载均衡从注册中心获取实例
          predicates:
            - Path=/carts/** # 路径断言,匹配以 "/carts/" 开头的请求,将其路由到 "cart-service"
        - id: user # 路由规则的唯一ID
          uri: lb://user-service # 指定目标服务为 "user-service"
          predicates:
            - Path=/users/**,/addresses/** # 路径断言,匹配以 "/users/" 或 "/addresses/" 开头的请求,将其路由到 "user-service"
        - id: trade # 路由规则的唯一ID
          uri: lb://trade-service # 指定目标服务为 "trade-service"
          predicates:
            - Path=/orders/** # 路径断言,匹配以 "/orders/" 开头的请求,将其路由到 "trade-service"
        - id: pay # 路由规则的唯一ID
          uri: 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: item
          uri: lb://item-service
          predicates:
            - 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-route
          uri: lb://service-name
          predicates:
            - Header=X-Request-Id # 请求头断言
        - id: method-route
          uri: lb://service-name
          predicates:
            - Method=GET # 请求方法断言
        - id: query-route
          uri: lb://service-name
          predicates:
            - Query=token # 查询参数断言

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

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

相关文章

C语言不同基本数据类型占用字节大小和取值范围

具体请前往&#xff1a;C语言各种基本数据类型字节大小和取值范围

Vue3:新特性详解

本文目录&#xff1a; 1.特性函数setup2.Ref 语法3.Reactive 函数4.Vue3 生命周期5.侦测变化 - watch6.Vue3的模块化开发7.弹窗类组件优化&#xff1a;Teleport8.异步组件优化&#xff1a;Suspense9.全局API优化 1.特性函数setup 1、setup函数是处于 生命周期函数 beforeCreate…

Linux scp命令 | 菜鸟教程-从本地复制到远程/从远程复制到本地

目录 Linux scp命令 语法 实例 1、从本地复制到远程 2、从远程复制到本地 说明 文章来源&#xff1a;Linux scp命令 | 菜鸟教程 Linux scp命令 nux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远…

计算机毕业设计Python+大模型膳食推荐系统 知识图谱 面向慢性病群体的膳食推荐系统 健康食谱推荐系统 机器学习 深度学习 Python爬虫 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

大数据集群中实用的三个脚本文件解析与应用

目录 一、jps - cluster.sh 脚本文件 &#xff08;一&#xff09;背景与功能 &#xff08;二&#xff09;使用方法 二、集群文件分发脚本 xsync.sh &#xff08;一&#xff09;背景与问题 &#xff08;二&#xff09;功能与实现原理 &#xff08;三&#xff09;脚本编写…

【数据分享】1981-2024年我国逐日平均气温栅格数据(免费获取)

气象数据一直是一个价值很高的数据&#xff0c;它被广泛用于各个领域的研究当中。这其中&#xff0c;又以平均气温数据最为常用&#xff01;之前我们分享过来源于美国国家海洋和大气管理局&#xff08;NOAA&#xff09;下设的国家环境信息中心(NCEI)发布的1929-2024年全球站点的…

多模态PaliGemma——Google推出的基于SigLIP和Gemma的视觉语言模型

前言 本文怎么来的呢&#xff1f;其实很简单&#xff0c;源于上一篇文章《π0——用于通用机器人控制的流匹配VLA模型&#xff1a;一套框架控制7种机械臂(改造了PaliGemma和ACT的3B模型)》中的π0用到了PaliGemma 故本文便来解读下这个PaliGemma 第一部分 PaliGemma 1.1 Pal…

开源模型应用落地-glm模型小试-glm-4-9b-chat-Gradio集成(三)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型&#xff0c;旨在自动理解和规划用户的复杂指令&#xff0c;并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等&#xff0c;支持128K的上下文窗口&#xff0c;使其在长文本处理和精度召回方面表现优异&a…

ABAP开发学习——OLE

目录 1.概览 2.OEL的实现方式 3.OLE的配置 4.OLE的实现 4.1 OLE Demo 4.2 OLE实现的步骤 5.OLE实现样例 5.1 OLE中的的类型转换 5.2 变量定义 5.3 创建对象 5.4 表单页的操作 5.5 设置文件保存路径 5.6 文件是否可见 5.7 单元格操作 5.7.1 给单元格赋值 5.7.2…

在Java中,实现数据库连接通常使用JDBC

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

单臂路由实现不同VLAN之间设备通信

转载请注明出处 本实验为单臂路由配置&#xff0c;目的为让不同VLAN之间的设备能够互相通信。 1.首先&#xff0c;按照要求配置两个pc的ip地址&#xff0c;以pc0为例子&#xff1a; 2在交换机创建vlan10和vlan20 3.划分vlan&#xff0c;pc0为vlan10的设备&#xff0c;pc1为vla…

前后端交互通用排序策略

目录 排序场景 排序实现思路 1. 静态代码排序实现 2.数据库驱动排序实现 3. 基于Java反射的动态排序实现 通用排序工具 SortListUtil 结语 排序场景 在面向前端数据展示的应用场景中&#xff0c;我们旨在实现一个更加灵活的排序机制&#xff0c;该机制能够支持对从后端传递…

【华为云-云驻共创】UCS跨云多活容灾:让业务高可用不再是难题

【摘要】云原生应用深入到企业各个业务场景&#xff0c;云原生正在走向分布式化&#xff0c;跨云跨域统一协同治理&#xff0c;保证一致应用体验&#xff0c;这些新的需求日益凸显。而容灾是确保服务高可用的保障&#xff0c;但即使应用部署在云上&#xff0c;也无法避免市政方…

Linux内核编程(十九)SPI子系统的应用与驱动编写

本文目录 一、 SPI驱动框架图二、编写SPI驱动device框架三、编写SPI驱动driver框架四、实验一编写mcp2515驱动1. 注册字符设备或杂项设备框架2. SPI写数据3. SPI读寄存器数据 4. MCP2515相关配置 对于SPI基础知识这里不做过多讲解&#xff0c;详情查看&#xff1a;SPI基础知识实…

谍影重重5.0

打开流量包可以发现&#xff0c;流量中含有大量的smb加密通信&#xff0c;并且使用了ntlm v2加密协议进行身份认证 包过滤ntlmssp 认证后smb协议进行了大量的数据传输 取出tom的包内数据 得到以下数据 username:tomdomain: .NTProofStr: ca32f9b5b48c04ccfa96f35213d63d75NT…

qt QAbstractItemModel详解

1. 概述 QAbstractItemModel是Qt框架中的一个核心抽象基类&#xff0c;在Qt的模型/视图架构中扮演着至关重要的角色。这个类提供了一个接口&#xff0c;用于表示和管理数据&#xff0c;但不直接处理数据的存储。它的主要功能是为视图组件&#xff08;如QListView、QTableView和…

华为OD机试 - 无重复字符的元素长度乘积的最大值(Python/JS/C/C++ 2024 C卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

【C++之STL】一文学会使用 string

文章目录 1. STL导读1. 1 什么是STL1. 2 STL的版本1. 3 STL六大组件1. 4 STL的重要性1. 5 STL的学习1. 6 STL系列博客的规划 2. string2. 1 为什么学习string类?2. 2 标准库中的string2. 3 基本构造2. 4 尾插与输出运算符重载2. 5 构造函数2. 6 赋值运算符重载2. 7 容量操作2.…

【分布式】分布式锁设计与Redisson源码解析

分布式锁 分布式锁是一种在分布式计算环境中用于控制多个节点&#xff08;或多个进程&#xff09;对共享资源的访问的机制。在分布式系统中&#xff0c;多个节点可能需要协调对共享资源的访问&#xff0c;以防止数据的不一致性或冲突。分布式锁允许多个节点在竞争访问共享资源…

【实测有效】两个Ubuntu系统通过网线传输文件

基本思路是&#xff1a;连接网线后&#xff0c;通过设置静态IP&#xff0c;将两台电脑配置在同一个局域网内&#xff0c;再进行文件传输。 一、物理连接 使用网线将两台电脑的网口连接起来。 二、静态IP设置 两台电脑均需要对各自的静态IP进行设置。 1、查看电脑的IP地址 1&a…