SpringCloud API网关
文章目录
- SpringCloud API网关
- 1. 概念
- 2. Spring Cloud Gateway
- 2.1 介绍
- 2.2 操作方式
- 3.Route Predicate Factories
- 3.1 介绍
- 3.2 使用方式
1. 概念
API网关,简称网关,本身是一个服务,通常作为后端服务的唯一入口,类似于整个微服务框架的门面,所有的外部客户端访问都需要经过它来进行调度和过滤:
它有以下核心功能:
- 权限控制:作为微服务的入口,对用户进行权限校验,如果检验失败则进行拦截
- 动态路由:一切请求先经过网关,但网关本身不处理业务,而是根据某种规则吧请求转发到某个微服务
- 负载均衡:当路由的目标服务有多个时,还需要作负载均衡
- 限流:请求流量过高时,按照网关中配置微服务能够接受的流量进行放行,避免服务压力过大
常用的网关方式有很多,而在SpringCloud中我们使用的网关方案是 Spring Cloud Gateway
2. Spring Cloud Gateway
2.1 介绍
Spring Cloud Gateway 是Spring Cloud的一个全新的API网关项目,基于Spring + SpringBoot等技术,为微服务架构提供一种简单而有效的途径来转发请求
2.2 操作方式
它的操作方式如下:
-
创建网关项目,API网关本身也是一个服务
-
引入网关依赖
<!--⽹关--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--基于nacos实现服务发现依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--负载均衡--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
-
编写启动类
@SpringBootApplication public class GateWayApplication { public static void main(String[] args) { SpringApplication.run(GateWayApplication.class, args); } }
-
创建配置文件,添加Gateway路由配置
server: port: 10030 spring: application: name: gateway cloud: nacos: discovery: server-addr: 主机号:8848 cluster-name: SH namespace: c567e423-b52b-4797-a33b-734ee78882f8 gateway: routes: - id: product-service-route uri: lb://product-service # 目标服务地址,当predicates路由条件满足时转接到该地址 predicates: # 路由条件 - Path=/product/** - id: order-service-route uri: lb://order-service predicates: - Path=/order/**,/feign/**
配置字段说明:
- id:可自行定义,保持唯一即可
- uri:目标服务地址,支持
普通的URI
和lb://应用注册服务名称
,lb表示负载均衡,使用lb://
方式表示从注册中心获取服务地址 - predicates:路由条件,将符合条件的请求都代理到uri参数指定的地址,如上述代码中服务请求路径为/product/**的请求都会被代理到lb://product-service 中
配置完上述内容后,我们来进行测试,启动API网关服务,并通过网关服务10030端口访问product-service:
127.0.0.1:10030/product/1001
可以看到,我们的请求符合路由条件
Path=/product/**
,所以网关服务将我们的请求代理到了127.0.0.1:9090/product/1001
这个服务路径中了:此时访问order-service服务也可成功:
注:若显示请求时间超时可能与自己本身的服务器性能有关,我们这里开启了多个服务对此请求时比较吃服务器性能
3.Route Predicate Factories
3.1 介绍
Route Predicate Factories(路由断言工厂),在Spring Cloud Gateway中,Predicate提供了路由规则的匹配机制。比如上述代码中的 Path=/product/**
,就是通过Path属性来匹配URL前缀是/product
的请求。
Spring Cloud Gateway默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请求的不同属性,并且
多个Predicate可以通过and逻辑进行组合
官网链接:Route Predicate Factories :: Spring Cloud Gateway
常见的predicate如下:
名称 | 说明 | 示例 |
---|---|---|
After | 只匹配指定日期之后的请求 | predicates: - After=2023-01-20T17:42:47.789- 07:00[America/Denver] |
Before | 只匹配指定日期之前的请求 | predicates: - Before=2023-01-20T17:42:47.789- 07:00[America/Denver] |
Between | 只匹配两个指定时间之间的请求,早的在前,晚的在后 | predicates: - Between=2017-01-20T17:42:47.789- 07:00[America/Denver], 2017-01- 21T17:42:47.789-07:00[America/Denver] |
Method | 只匹配指定的请求方式 | predicates: - Method=GET,POST |
Path | 只匹配指定规则的路径 | predicates: - Path=/red/{segment},/blue/{segment} |
RemoteAddr | 请求者的IP必须为指定范围 | predicates: - RemoteAddr=192.168.1.1/24 |
Cookie | 请求中包含指定Cookie,且该Cookie的值符合指定的正则表达式 | predicates: - Cookie=chocolate, ch.p |
Header | 请求中包含指定Header,且该Header的值符合指定的正则表达式 | predicates: - Header=X-Request-Id, \d+ |
Host | 请求必须是访问某个host(根据请求中的Host字段进行匹配) | predicates: - Host=** .somehost.org, **.anotherhost.org |
3.2 使用方式
Predicate的使用方式很简单,只需要在配置文件中添加规则即可,如下:
gateway:
routes:
- id:
product-service-route
uri:
lb://product-service # 目标服务地址,当predicates路由条件满足时转接到该地址
predicates: # 路由条件
- Path=/product/**
- After=2025-07-31T12:39:55.113010600+08:00[Asia/Shanghai] # 只接受指定时间之后的请求
此时再重启服务,重新访问127.0.0.1:10030/product/1001
,可以查询不到该接口:
将条件注释掉或修改时间条件即可重新访问!
注:这里使用到的时间是ZonedDateTime
类型的格式,可以通过ZonedDateTime.now()
获取:
import org.junit.Test;
import java.time.ZonedDateTime;
public class GateWayTest {
@Test
public void test1() {
System.out.println(ZonedDateTime.now());
}
}
以上便是对API网关的使用介绍了!!如果内容对大家有帮助的话请给这篇文章一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨