如何使用gateway进行api网关配置
前置条件
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
注意: 这里不需要引入spring-boot-starter-web依赖因为gateway使用了 webflux而不是springmvc
开启注解
@SpringBootApplication
// 开启nacos服务发现
@EnableDiscoveryClient
public class CloudGateWayMain {
public static void main(String[] args) {
SpringApplication.run(CloudGateWayMain.class, args);
}
}
实践
配置yml文件
因为我这里使用了配置中心,所以要先配置boostrap.yml文件。这里我们先不讲配置中心,只关注于配置。
spring:
cloud:
// 配置gateway
gateway:
discovery:
locator:
enabled: true
// [0]
routes:
// [1]
- id: after_route
// [2]
uri: lb://cloud-consumer-feign
// [3]
predicates:
- Path=/api/**
- After=2021-07-13T14:11:00.123+08:00[Asia/Shanghai]
nacos:
discovery:
server-addr: localhost:8848
application:
name: cloud-gateway
management:
endpoints:
web:
exposure:
include: refresh
server:
port: 2001
解释
-
[0]routes: 标识路由配置开始
-
[1] -id: "-"符号是yml里面数组的标识方法,标识这里可以配置多项路由。id为自定义的名字,因为我这里使用了after route所以定义为after router
-
[2] uri: 以lb://cloud-consumer-feign 为例,lb标识开启负载均衡,实际上还能使用http和https。cloud-consumer-feign为其他服务的服务名。
-
[3] predicates: 翻译过来是谓词逻辑来自java中,通俗点讲就是在这里配置路由规则。
- path: 匹配请求路径
- After: 当前请求在指定时间
之后
才匹配。After=2021-07-13T14:11:00.123+08:00[Asia/Shanghai] 以此为例,表示只有只有在2021-07-13 14:11:00之后才能访问上面path匹配的url。
tips:这里只介绍了after,path 路由谓词。实际上有很多种路由谓词并且支持自定义路由谓词。简单列出一下几项:
谓词逻辑 | 作用 |
---|---|
After route predicate | 当前请求在指定时间**之后 **才匹配 |
Before route predicate | 当前请求在指定时间**之前 **才匹配 |
Between route predicate | 当前请求在指定时间**之间 **才匹配 |
Header route predicate | 当前请求中的header值匹配配置的header参数值时生效 |
Method Route Predicate | 只有指定方式(put,post,get....)才能访问 |
Path Route Predicate | 匹配请求路径 |
Query route predicate | 匹配请求参数 |
RemoteAddr route predicate | 匹配请求的ip地址,支持ipv4和ipv6 |
Weight route predicate | 根据权重 来分发请求,权重是根据group 来计算的 |
路由的接口
@GetMapping("/api/testAfterRoute")
public String testGateWayAfterRoute() {
return "testAfterRoute time:" + LocalDateTime.now() + " port:" + port;
}
效果
改变时间尝试路由
After=2021-07-16T14:11:00.123+08:00[Asia/Shanghai]
结果
总结
- 在gateway种我们通过简单的配置即可达到api网关的目的。
- 利用官方自带的谓词逻辑,我们可以实现限时开放接口,负载均衡,身份验证等等。
- 通过自定义谓词逻辑,可以高度定制api网关逻辑
- 配和nacos的配置中心可以实现动态更改路由谓词规则,不用重启服务即可生效新的路由谓词规则。
- 低代码,yaml文件配置可满足大部分需求