
在微服务架构中,一个系统往往由多个微服务组成,每个服务都只会完成特定领域的功能,在这种情况下就产生了一些问题

API网关就是为了解决上述问题, 在客户端与服务端增肌了一个API网关。

API网关有如下几个作用
Spring Cloud Gateway 旨在提供一种简单而有效的途径来发送 API,并为它们提供横切关注点,例如:安全性,监控/指标和弹性。
Spring Cloud Gateway功能:

创建一个springboot 工程增加如下依赖
采用nacos为注册中心,配置中心,sentinel进行流控
<!-- SpringCloud Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--Nacos Config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--SpringBoot Test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
创建一个rest服务增加 如下接口 和配置
```java
@RestController
@RequestMapping("/order")
@RequiredArgsConstructor
public class OrderController {
@GetMapping
public ResponseEntity # Tomcat
server:
port: 9002
# Spring
spring:
application:
# 应用名称
name: zcct-rest
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
namespace: zcctConfig
group: zcct
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
namespace: zcctConfig
group: zcct
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
gateway配置文件 增加如下配置
spring:
redis:
host: localhost
port: 6379
password:
cloud:
gateway:
discovery:
locator:
lowerCaseServiceId: true
enabled: true
routes:
- id: zcct-rest
uri: lb://zcct-rest
predicates:
- Path=/rest/**
filters:
- StripPrefix=1
启动项目访问网关

Predicate 是 java8 提供的一个函数式接口,它允许接收一个参数并返回一个布尔值,可以用于条件过滤、请求参数的校验/
在gateway中 Perdicate 提供了路由规则匹配机制。简单点说,Predicate 是路由转发的判断条件,请求只有满足了 Predicate 的条件,才会被转发到指定的服务上进行处理。

Spring Cloud Gateway中默认提供了很多 Route Predicate Factory.
图片引用

常见的 Predicate 断言
| 断言 | 示例 |
|---|---|
| Path | - Path=/dept/list/** |
| Before | - Before=2021-10-20T11:47:34.255+08:00[Asia/Shanghai] |
| After | - After=2021-10-20T11:47:34.255+08:00[Asia/Shanghai] |
| Between | - Between=2021-10-20T15:18:33.226+08:00[Asia/Shanghai],2021-10-20T15:23:33.226+08:00[Asia/Shanghai] |
| Cookie | - Cookie=name,c.biancheng.net |
| Header | - Header=X-Request-Id,\d+ |
| Method | - Method=GET |
Filter分为Pre类型的过滤器和Post类型的过滤器
在Spring Cloud Gateway中内置了很多Filter,Filter有两种实现,分别是GatewayFilter和GlobalFilter。
GlobalFilter会应用在所有路由上,而GatewayFilter会应用在单个或者一个分组路由上

GlobalFilter 是一种作用于所有的路由上的全局过滤器,通过它,我们可以实现一些统一化的业务功能,例如权限认证、IP 访问限制等。当某个请求被路由匹配时,那么所有的 GlobalFilter 会和该路由自身配置的 GatewayFilter 组合成一个过滤器链。