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/> <!– lookup parent from repository –>-->
</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,代码如下: