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

news2024/10/8 13:26:53

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,代码如下:

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

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

相关文章

警惕:与ChatGPT共享业务数据可能十分危险

您已经在使用ChatGPT了吗&#xff1f;或者您正在考虑使用它来简化操作或改善客户服务&#xff1f;虽然ChatGPT提供了许多好处&#xff0c;但重要的是&#xff0c;您要意识到与ChatGPT这样的人工智能工具共享敏感业务数据相关的安全风险。下面&#xff0c;我们概述了一些关键问题…

什么是 C 语言中的代码优化技巧?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&…

Javaweb09-数据库连接池技术

数据库连接池 1.数据库连接池基本概念&#xff1a; JDBC连接池是一个管理数据库连接的重要工具&#xff0c;它能够显著提高应用程序与数据库之间的性能和效率。连接池通过预先创建和维护一组数据库连接&#xff0c;而不是每次请求都创建新的连接&#xff0c;从而避免了频繁的…

js字符串文字添加不同颜色,replace的妙用$1...$9

更改字符串第一个数字为红色显示&#xff0c;第二个数字为黄色显示 $1匹配的是正则第一个括号选中的字符串&#xff0c;可以使用正则不断用括号匹配然后更改样式 const testStr "剩余12个名额&#xff0c;截止时间12月25日" testStr this.testStr.replace(/(\d)(\D…

【Python】 已解决:Python编码问题导致的SyntaxError

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;Python编码问题导致的SyntaxError 一、分析问题背景 在使用Python进行编程时&#xff0c;有时会遇到编码相关的问题。特别是在处理包含非ASCII字符&#xff08;…

算法复杂度详解( 超详细!)

前言&#xff1a; 今天&#xff0c;小编正式开始学习了数据结构的正式内容&#xff0c;学习了算法复杂度相关的内容&#xff0c;为了加强对这个的了解&#xff0c;于是诞生了这一篇文章&#xff0c;下面废话不多说&#xff0c;开始进入复杂度的详解&#xff01; 目录&#xff1…

鸿蒙元服务API集全新呈现-开发更清晰高效

鸿蒙元服务API集全新呈现&#xff0c;开发更清晰高效&#xff0c;具体见如下截图&#xff0c;深黑色部分即本阶段公布支持的元服务API集。 本材料整理来源于HarmonyOS NEXT Developer Beta1官方公开的文档

银河麒麟(Kylin)KYSEC使用

1.推荐使用方法 *.临时禁用指令: setstatus disable--禁用 注&#xff1a;执行reboot后系统会自动启动 2.选用指令&#xff1a; *.永久禁用指令&#xff1a; setstatus disable -p *.重启后,KYSEC还是处理关闭关状态。 *.使用如下指令启用&#xff1a;setstatus enable …

慕尼黑电子展回顾:启明智显闪耀全场,多模态硬件智能体引领未来科技潮流

在刚刚落幕的慕尼黑电子展上&#xff0c;启明云端携启明智显与触觉智能两家子公司&#xff0c;共同为全球观众呈现了一场科技盛宴。本次展会&#xff0c;启明智显凭借其创新的多模态硬件智能体及一系列前沿产品&#xff0c;赢得了广泛关注与好评&#xff0c;展位现场人流如织&a…

基于java+springboot+vue实现的大学城水电管理系统(文末源码+Lw)106

基于SpringBootVue的实现的大学城水电管理系统&#xff08;源码数据库万字Lun文流程图ER图结构图演示视频软件包&#xff09; 系统功能&#xff1a; 本大学城水电管理系统 管理员功能有个人中心&#xff0c;用户管理&#xff0c;领用设备管理&#xff0c;消耗设备管理&#x…

基于Java+Vue的场馆预约系统源码体育馆羽毛球馆篮球馆预约

市场前景 市场需求持续增长&#xff1a;近年来&#xff0c;随着人们生活水平的提高和休闲娱乐需求的多样化&#xff0c;各类场馆&#xff08;如体育馆、图书馆、博物馆、剧院等&#xff09;的访问量不断增加。然而&#xff0c;传统的预约方式往往存在效率低下、信息不透明等问…

浅谈React

forwardRef和useImperativeHandle的联动使用 import React, { useImperativeHandle, useRef } from "react" import { forwardRef } from "react"const CustomInput forwardRef((props, ref) > {const inputRef useRef<HTMLInputElement>(null…

【以史为镜、以史明志,知史爱党、知史爱国】中华上下五千年之-宋朝(北宋)

宋朝&#xff08;960年—1279年&#xff09;是中国历史上承五代十国下启元朝的朝代&#xff0c;分北宋和南宋两个阶段&#xff0c;共历十八帝&#xff0c;享国三百一十九年。 北宋 赵匡胤&#xff08;宋太祖&#xff09;-赵光义&#xff08;宋太宗&#xff09;-赵恒&#xff08…

【MyBatis】——入门基础知识必会内容

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

【初阶数据结构】树与二叉树:从零开始的奇幻之旅

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

文华财经盘立方博易大师boll布林带指标公式源码

TT:TIME>850&&TIME<1150; MID:MA(CLOSE,26);//求N个周期的收盘价均线&#xff0c;称为布林通道中轨 TMP2:STD(CLOSE,26);//求M个周期内的收盘价的标准差 TOP:MID2*TMP2;//布林通道上轨 BOTTOM:MID-2*TMP2;//布林通道下轨 A:EVERY(ISDOWN,2)&&TT&&…

SQL职场必备:掌握数据库技能提升职场竞争力

&#x1f482; 个人网站:【 摸鱼游戏】【网址导航】【神级代码资源网站】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

Centos7下zabbix安装与部署

Centos7下zabbix安装与部署 一、Zabbix介绍 1、zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 2、zabbix能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各…

Android初学者书籍推荐

书单 1.《Android应用开发项目式教程》&#xff0c;机械工业出版社&#xff0c;2024年出版2.《第一行代码Android》第二版3.《第一行代码Android》第三版4.《疯狂Android讲义》第四版5.《Android移动应用基础教程&#xff08;Android Studio 第2版&#xff09;》 从学安卓到用安…

ICC2:no path与scenario status

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 有星球小伙伴提问为什么pt能报出来path而ICC2报告不出来&#xff0c;排除两边sdc约束不同的问题&#xff0c;那就是ICC2并没有设置好scenario status&#xff0c;最后发现是没有…