【Spring Cloud精英指南】深度探索与实战:网关Gateway的高级应用与最佳实践

1. 前言

Spring Cloud Gateway提供了一个在Spring生态系统之上构建的API网关,包括:Spring 5,Spring Boot 2和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的路由方式,并为它们提供一些网关基本功能,例如:安全,监控/指标和弹性。

下面我们分别以两个例子说明:

2. 版本说明

Spring Boot版本:2.2.5.RELEASE

Spring Cloud版本:Hoxton.SR3

如无特殊说明,Spring Cloud的所有例程都将采用上面的版本。

3. 网关的使用

建议:在本课程开始前,如果不懂Eureka创建的详细步骤,建议先看【一个实例学会 Spring Cloud 的注册中心 Eureka 的用法】,没有看过也没关系,按照下面步骤开始吧:

3.1 新建父项目

如果你没有父项目(如果已经完成注册中心的实例肯定有父项目啦),请使用简单Maven创建父项目:

创建好后,打开pom.xml文件,加入如下代码:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.cherry</groupId>
    <artifactId>springcloudproject</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>14</java.version>
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
        <springboot.version>2.2.5.RELEASE</springboot.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springboot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

删除src文件夹

3.2 创建网关子项目

在父项目下面,使用Spring Initializr新建网关子项目gateway,选择依赖Gateway,简略贴图如下:

建好后,修改pom.xml文件,修改后文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>springcloudproject</artifactId>
        <groupId>com.cherry</groupId>
        <version>1.0-SNAPSHOT</version>
       <!-- <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->
    </parent>
    <groupId>com.cherry</groupId>
    <artifactId>gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway</name>
    <description>Demo project for Spring Boot</description>

    <!--<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    </properties>-->

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

修改配置文件application.properties后缀为yml(即文件名改为application.yml),对网关进行配置

这里我们将csdn博客作为服务提供方

server:
  port: 9001

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://blog.csdn.net
          predicates:
            - Path=/huanzi833

执行run,springboot内置Tomcat启动,端口9001

浏览器输入地址http://localhost:9001/huanzi833

3.3 关闭网关

如果希望网关不可用,可在application.yml加入下面设置:

server:
  port: 9001

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://blog.csdn.net
          predicates:
            - Path=/huanzi833
      enabled: false

浏览器访问,结果如下:

4. 通过时间匹配路由规则

注意:属性文件修改后,请自行重启应用,后面就不每次重复说明了

4.1 时间 After 路由匹配

在After设置的时间之后路由生效,如:在2020年1月1日之后的请求都转发到我的博客,这个时间之前的不能转发

server:
  port: 9001

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://blog.csdn.net
          predicates:
            - Path=/huanzi833
            - After=2020-01-01T00:00:00+08:00[Asia/Shanghai]
      enabled: true

4.2  时间 Before 路由匹配

在Before设置的时间之前的路由生效,如:在2021年1月1日之前的请求都转发到我的博客,这个时间之后的不能转发

server:
  port: 9001

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://blog.csdn.net
          predicates:
            - Path=/huanzi833
            - After=2020-01-01T00:00:00+08:00[Asia/Shanghai]
            - Before=Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
      enabled: true

4.3  时间 Between 路由匹配

在Between设置的时间之间的路由生效,如:在2020年1月1日至2020年10月1日之间的请求都转发到我的博客,这个时间以外的不能转发,通常Between与After及Before不会一起使用,以免重复设置。

server:
  port: 9001

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://blog.csdn.net
          predicates:
            - Path=/huanzi833
#            - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
#            - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
            - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
      enabled: true

4.4 Cookie 路由匹配

对于Cookie,predicates可以接收两个参数,一个是 Cookie name ,一个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。

server:
  port: 9001

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://blog.csdn.net
          predicates:
            - Path=/huanzi833
#            - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
#            - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
            - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
            - Cookie=uid, cherry #通过cookie进行路由规则的匹配
      enabled: true

 使用Cookie路由匹配,我们可以进入cmd进行测试,cmd中输入如下语句:

 4.5 Header路由匹配

类似于Cookie路由匹配,也是2个参数,一个参数名称,一个正则表达式,如果匹配上就会执行路由,如果没有匹配上则不执行。

server:
  port: 9001

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://blog.csdn.net
          predicates:
            - Path=/huanzi833
#            - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
#            - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
            - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
            - Cookie=uid, cherry #通过cookie进行路由规则的匹配
            - Header=X-Request-Id, \d+ #Header路由规则
      enabled: true

 进入cmd进行测试,cmd中输入如下语句:

4.6 Host 路由匹配

以下配置通过主机地址进行匹配,如www.csdn.net,或者www.baidu.com,或者blog.csdn.net等地址

server:
  port: 9001

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://blog.csdn.net
          predicates:
            - Path=/huanzi833
#            - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
#            - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
            - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
            - Cookie=uid, cherry #通过cookie进行路由规则的匹配
            - Header=X-Request-Id, \d+ #Header路由规则
            - Host=**.csdn.net, **.baidu.com #Host路由规则
      enabled: true

进入cmd进行测试,cmd中输入如下语句:

4.7 Method 匹配路由

server:
  port: 9001

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://blog.csdn.net
          predicates:
            - Path=/huanzi833
#            - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
#            - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
            - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
            - Cookie=uid, cherry #通过cookie进行路由规则的匹配
            - Header=X-Request-Id, \d+ #Header路由规则
            - Host=**.csdn.net, **.baidu.com #Host路由规则
            - Method=GET, POST #Method路由规则
      enabled: true

 进入cmd进行Get测试,cmd中输入如下语句:

进入cmd进行POST测试,cmd中输入如下语句: (注:如果服务提供者controller中路径使用GetMapping,调用时这里使用-X POST会出404)

4.8 IP地址匹配

predicate 也支持通过设置某个 ip 区间号段的请求进行路由,例如 192.168.1.1/24 (其中 192.168.1.1 是 IP 地址,24 是子网掩码,这里的24表示子网掩码是255.255.255.0)。可以将此地址设置为本机的 ip 地址进行测试。

server:
  port: 9001

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: gateway-service
          uri: https://blog.csdn.net
          predicates:
            - Path=/huanzi833
#            - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
#            - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
            - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
            - Cookie=uid, cherry #通过cookie进行路由规则的匹配
            - Header=X-Request-Id, \d+ #Header路由规则
            - Host=**.csdn.net, **.baidu.com #Host路由规则
            - Method=GET, POST #Method路由规则
            - RemoteAddr=192.168.1.1/24
      enabled: true

路径路由匹配/参数匹配/权重匹配将在下面与注册中心的集成中完成。

5. 使网关服务化,并与注册中心、服务者、消费者进行关联

1. 首先创建服务中心Eureka,代码如下:

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

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

相关文章

IntelliJ IDEA 2024.1.4最新教程!!直接2099!!爽到飞起!!

IntelliJ IDEA 2024.1.4最新破解教程&#xff01;&#xff01;直接2099&#xff01;&#xff01;爽到飞起&#xff01;&#xff01;【资源在末尾】安装馆长为各位看官准备了多个版本&#xff0c;看官可根据自己的需求进行下载和选择安装。https://mp.weixin.qq.com/s/Tic1iR_Xc…

C语言-顺序表

&#x1f3af;引言 欢迎来到HanLop博客的C语言数据结构初阶系列。在这个系列中&#xff0c;我们将深入探讨各种基本的数据结构和算法&#xff0c;帮助您打下坚实的编程基础。本次我将为你讲解。顺序表&#xff08;也称为数组&#xff09;是一种线性表&#xff0c;因其简单易用…

常用录屏软件,分享这四款宝藏软件!

在数字化时代&#xff0c;录屏软件已经成为我们日常工作、学习和娱乐中不可或缺的工具。无论你是需要录制教学视频、游戏过程&#xff0c;还是进行产品演示&#xff0c;一款高效、易用的录屏软件都能让你的工作事半功倍。今天&#xff0c;就为大家揭秘四款宝藏级录屏软件&#…

Ajax从零到实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

性价比高充电宝有哪些?充电宝十大最佳品牌大盘点!

在如今这个高度数字化的时代&#xff0c;我们的生活离不开各种电子设备&#xff0c;而充电宝作为保障电子设备续航的重要工具&#xff0c;其地位日益凸显。然而&#xff0c;面对市场上琳琅满目的充电宝品牌和产品&#xff0c;要挑选到一款性价比高的充电宝并非易事。在这篇盘点…

java使用easypoi模版导出word详细步骤

文章目录 第一步、引入pom依赖第二步、新建导出工具类WordUtil第三步、创建模版word4.编写接口代码5.导出结果示例 第一步、引入pom依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><…

element-ui操作表格行内容如何获取当前行索引?

需求&#xff1a; 根据每个用户的提交次数、撤回次数&#xff0c;动态计算出实际次数&#xff0c;并且提交次数不能小于撤回次数 <template><div><el-table:data"tableData"style"width: 80%"border><el-table-columnprop"date&…

【IOS】React Native之HelloWorld

RN搭建开发环境 rvm 安装3.2.2 brew install node18 brew install watchman# 使用nrm工具切换淘宝源 npx nrm use taobao# 如果之后需要切换回官方源可使用 npx nrm use npmnpm install -g yarnbrew install cocoapodsnpm uninstall -g react-native-cli react-native-communi…

(c#实现)决策树算法原理和案例

一、引言 决策树&#xff08;Decision Tree&#xff09;是一种常用的监督学习算法&#xff0c;广泛应用于分类和回归任务。它的直观性和可解释性使其成为机器学习和数据挖掘领域的重要工具。本文将详细介绍决策树的原理&#xff0c;并通过一个实际案例展示如何使用C#实现决策树…

【MindSpore学习打卡】应用实践-LLM原理和实践-基于MindSpore实现BERT对话情绪识别

在当今的自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;情绪识别是一个非常重要的应用场景。无论是在智能客服、社交媒体分析&#xff0c;还是在情感计算领域&#xff0c;准确地识别用户的情绪都能够极大地提升用户体验和系统的智能化水平。BERT&#xff08;Bidirec…

C++类和对象学习笔记

1.类的定义 1.1类定义的格式 class是定义类的关键字&#xff0c;Date为类的名字&#xff0c;{ }中为类的主体&#xff0c;注意定义类结束时后面的分号不能省略。类中的内容称为类的成员&#xff1b;类中的变量称为类的属性或成员变量&#xff1b;类中的函数称为类的方法或者成…

jdk1.8安装教程及环境变量配置(含jdk8,11,13安装文件)

目录 友情提醒第一章、JVM、JRE、JDK介绍第二章、下载和安装JDK2.1&#xff09;百度网盘直接下载免安装2.2&#xff09;官网下载安装JDK&#xff08;需要收费&#xff09; 第三章、环境变量配置3.1&#xff09;windows环境变量配置3.2&#xff09;验证环境变量是否配置成功 友情…

类和对象——【运算符重载】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件iostream的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;Yan. yan.                        …

PDA:Prompt-based Distribution Alignment for Unsupervised Domain Adaptation

文章汇总 式中&#xff0c; y s y^s ys表示源域数据的one-hot ground-truth&#xff0c; K K K为类数&#xff0c; w i w_i wi​和 z ~ s \tilde{z}_s z~s​分别表示源域经过提示调优的最终文本表示和最终图像表示的第 i i i类。 同理&#xff0c;为了进一步利用目标领域的数据…

ARMV8安全特性:Pointer Authentication

文章目录 前言一、Introduction二、Problem Definition三、Pointer Authentication3.1 Instructions3.2 Cryptography3.3 Key Management 四、Sample Use Cases4.1 Software Stack Protection4.2 Control Flow Integrity (CFI)4.3 Binding Pointers to Addresses 五、Security …

B2B领域的客户裂变策略:打造行业内的共赢生态

在日益竞争激烈的B2B市场中&#xff0c;客户裂变作为一种高效的增长策略&#xff0c;不仅能够帮助企业快速扩大客户基础&#xff0c;还能促进行业内资源共享与合作&#xff0c;共同构建一个健康、可持续的共赢生态。本文将探讨B2B领域实施客户裂变策略的关键要素&#xff0c;以…

【数据结构】排序——快速排序

前言 本篇博客我们继续介绍一种排序——快速排序&#xff0c;让我们看看快速排序是怎么实现的 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 …

“学习Pandas中时间序列的基本操作“

目录 # 开篇 1. 创建和操作时间序列对象 2. 时间序列数据的读取和存储 3. 时间序列数据的索引和切片 4. 时间序列数据的操作和转换 5. 时间序列数据的可视化 6. 处理时间序列中的缺失值 7. 时间序列数据的聚合和分组 8. 时间序列的时间区间和偏移量操作 示例代码&…

重要文件放u盘还是硬盘?硬盘和u盘哪个适合长期存储

在数字时代&#xff0c;我们每天都会处理大量的文件。其中&#xff0c;不乏一些对我们而言至关重要的文件&#xff0c;如家庭照片、工作文档、财务记录等。面对这些重要文件的存储问题&#xff0c;我们通常会面临&#xff1a;“重要文件放U盘还是硬盘”、“硬盘和U盘哪个适合长…