【Spring Cloud】一个例程快速了解网关Gateway的使用

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

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

一. 版本说明

Spring Boot版本:2.2.5.RELEASE

Spring Cloud版本:Hoxton.SR3

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

二. 网关的使用

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

  1. 新建父项目

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

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

java 复制代码
<?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>

1.3. 删除src文件夹

  1. 创建网关子项目

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

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

java 复制代码
<?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>

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

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

java 复制代码
server:
  port: 9001

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

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

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

  1. 关闭网关

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

java 复制代码
server:
  port: 9001

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

浏览器访问,结果如下:

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

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

4.1 时间After路由匹配

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

java 复制代码
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日之前的请求都转发到我的博客,这个时间之后的不能转发

java 复制代码
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不会一起使用,以免重复设置。

java 复制代码
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 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。

java 复制代码
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.6 Header路由匹配

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

java 复制代码
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.7 Host路由匹配

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

java 复制代码
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.8 Method匹配路由

java 复制代码
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.9 IP地址匹配

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

java 复制代码
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

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

三. 下面开始将使网关服务化,并与注册中心、服务者、消费者进行关联

  1. 首先创建服务中心Eureka,代码如下:
相关推荐
wxin_VXbishe1 小时前
基于SpringBoot的天天商城管理系统的设计与现-计算机毕业设计源码79506
java·c++·spring boot·python·spring·django·php
曾令胜9 小时前
excel导出使用arthas动态追踪方法调用耗时后性能优化的过程
spring·性能优化·excel
多云几多9 小时前
Yudao单体项目 springboot Admin安全验证开启
java·spring boot·spring·springbootadmin
摇滚侠10 小时前
Spring Boot 3零基础教程,Spring Intializer,笔记05
spring boot·笔记·spring
兮动人11 小时前
Spring Bean耗时分析工具
java·后端·spring·bean耗时分析工具
MESSIR2211 小时前
Spring IOC(控制反转)中常用注解
java·spring
smilecold14 小时前
SpringCloud 入门 - Gateway 网关与 OpenFeign 服务调用
spring cloud·gateway
hello 早上好16 小时前
深入 Spring 条件化配置底层:从硬编码到通用注解的实现原理
java·后端·spring
亚林瓜子16 小时前
Spring中Date日期序列化与反序列化中格式设置
java·后端·spring·jackson·date
哞哞不熬夜20 小时前
JavaEE--Spring MVC
spring·java-ee·mvc