本篇文章使用一个简单的示例来演示Spring Cloud Gateway的使用方法。
网关是所有微服务的门户,我总结了一些网关的常用应用场景。

断言是Java 8提供的一个函数式接口,它允许接收一个参数并返回一个布尔值,可以用于条件过滤、请求参数的校验。
Spring Cloud Gateway 默认提供了许多断言,这些断言的源码在 org.springframework.cloud.gateway.handler.predicate 包中。这些断言会分别匹配 HTTP 请求的不同属性,并且多个断言可以通过 and 逻辑进行组合。

过滤器分为Pre类型的过滤器和Post类型的过滤器。
在 Spring Cloud Gateway 中内置了很多过滤器,过滤器有两种实现,分别是 GatewayFilter 和 GlobalFilter 。 GlobalFilter 会应用到所有的路由上,而 GatewayFilter 只会应用到单个路由或者一个分组的路由上。
搭建项目前需要先启动 Nacos 服务。我比较喜欢使用 Docker 安装、启动 Nacos 。如果你对这种方式感兴趣,可以参考我之前写的一篇文章传送门。
项目结构
| 项目名称 | 端口号 | 说明 |
|---|---|---|
| jasmine-cloud | -- | 父工程 |
| jasmine-gateway | 9010 | 网关服务,服务注册到nacos |
| jasmine-auth | 9012 | 权限服务,服务注册到nacos |
jasmine-cloud 是一个父工程,没有代码,只有一个 pom.xml 文件。 pom.xml 文件的具体内容如下:
- <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.0modelVersion>
-
- <parent>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-parentartifactId>
- <version>2.2.5.RELEASEversion>
- parent>
-
- <groupId>org.jasmine.cloudgroupId>
- <artifactId>jasmine-cloudartifactId>
- <version>1.0-SNAPSHOTversion>
- <packaging>pompackaging>
-
- <properties>
- <maven.compiler.source>8maven.compiler.source>
- <maven.compiler.target>8maven.compiler.target>
- properties>
-
- <dependencies>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- dependency>
- dependencies>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-dependenciesartifactId>
- <version>Hoxton.SR3version>
- <type>pomtype>
- <scope>importscope>
- dependency>
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-alibaba-dependenciesartifactId>
- <version>2.2.1.RELEASEversion>
- <type>pomtype>
- <scope>importscope>
- dependency>
- dependencies>
- dependencyManagement>
-
- project>
Spring Cloud 、 Spring Cloud Alibaba 、 Spring Boot 三者的版本需要注意下, Spring Cloud 、 Spring Cloud Alibaba 、 Spring Boot 三者的版本应该是有对应关系的,如果版本对应不上,可能会有意想不到的BUG。我只尝试了如下两套版本。
| Spring Cloud | Spring Cloud Alibaba | Spring Boot | 是否可行 | |
|---|---|---|---|---|
| 第一套 | 2020.0.0 | 2021.1 | 2.4.2 | 报错 |
| 第二套 | Hoxton.SR3 | 2.2.1.RELEASE | 2.2.5.RELEASE | 可行 |
最初的时候,我使用的是第一套版本。执行 curl 命令报错。我没有深究错误原因,然后就尝试了第二套版本,没有再报错。
- curl http://127.0.0.1:9010/auth/hello
- {"timestamp":"2022-07-30T00:51:40.182+00:00","path":"/auth/hello","status":503,"error":"Service Unavailable","message":"","requestId":"ef67c669-1"}
jasmine-gateway 是网关服务,服务注册到 Nacos ,使用 Nacos 的配置管理功能实现了配置信息动态变更。如果不了解与 Nacos 整合,可以参考我之前写的一篇文章传送门。
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
- dependency>
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-gatewayartifactId>
- dependency>
- server:
- port: 9010
- spring:
- profiles:
- active: dev
- application:
- name: jasmine-gateway
- cloud:
- nacos:
- config:
- file-extension: yaml
- group: ${spring.profiles.active}
- prefix: ${spring.application.name}
- server-addr: 127.0.0.1:8848
- gateway:
- discovery:
- locator:
- enabled: true
- # 是否使用service-id的小写,默认是大写
- lower-case-service-id: true
Data Id:jasmine-gateway.yaml
Group:dev
配置内容:
- spring:
- cloud:
- gateway:
- ## 路由
- routes:
- - id: jasmine-auth
- uri: lb://jasmine-auth
- predicates:
- - Path=/auth/**
上面配置中字段的含义简单说明下。
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
- dependency>
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
- server:
- port: 9012
- spring:
- profiles:
- active: dev
- application:
- name: jasmine-auth
- cloud:
- nacos:
- config:
- file-extension: yaml
- group: ${spring.profiles.active}
- prefix: ${spring.application.name}
- server-addr: 127.0.0.1:8848
- gateway:
- discovery:
- locator:
- enabled: true
- # 是否使用service-id的小写,默认是大写
- lower-case-service-id: true
一个简单的用于测试接口的控制器类。
- @RestController
- @RequestMapping("/auth")
- public class HelloController {
-
- @GetMapping("/hello")
- public String index() {
- return "hello world.";
- }
- }
jasmine-gateway 、 jasmine-auth 项目;cmder ),输入命令: curl http://127.0.0.1:9010/auth/hello 。