一、spring-cloud-alibaba-gateway
1、pom.xml
<!-- gateway 路由网关依赖 webflux-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- gateway 结合 Redis 实现限流 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<!-- nacos 客户端 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、application.yml
server:
port: 6001
spring:
application:
name: gateway-server # 应用名
redis:
host: 172.21.25.56 # Redis服务器地址
port: 6379 # Redis服务器连接端口
# Redis 服务器连接密码(默认为空),注释放到上面来,不然控制台可能会一直打印日志
password:
cloud:
nacos:
discovery:
server-addr: 172.21.25.56:8848 # 注册中心地址
gateway:
discovery:
locator:
# true 开启以服务名称调用目标服务
enabled: true
routes:
# 路由唯一标识
- id: blog-article
# 目标服务地址
# uri: http://localhost:8001
# 目标微服务名称 lb://目标服务名
uri: lb://article-server
# 断言,路由条件
predicates:
# 匹配访问路由,以 /article开头的请求代理到
# 访问 http://localhost:6001/article/api/article/1 代理到 http://localhost:8001/article/api/article/1
- Path=/article/**
filters:
# 代理转发去掉路径, /article/** ,会将 每个 /article 在过滤器中截取掉
# - StripPrefix=1
# 开启限流
- name: RequestRateLimiter
args:
# 限制过滤器bean名称
key-resolver: '#{@uriKeyResolver}'
# 希望每个用户每秒执行多少个请求。令牌桶填充的速率
redis-rate-limiter.replenishRate: 2
# 允许用户在一秒种内完成最大请求数。令牌桶最多可以容纳的令牌数量 。如果设置为0将阻止所有请求
redis-rate-limiter.burstCapacity: 4
# 路由唯一标识
- id: blog-question
# 目标微服务名称 lb://目标服务名
uri: lb://question-server
# 断言,路由条件
predicates:
# 匹配访问路由,以 /question 开头的请求代理到
- Path=/question/**
filters:
# 开启限流
- name: RequestRateLimiter
args:
# 限制过滤器bean名称
key-resolver: '#{@uriKeyResolver}'
# 希望每个用户每秒执行多少个请求。令牌桶填充的速率
redis-rate-limiter.replenishRate: 2
# 允许用户在一秒种内完成最大请求数。令牌桶最多可以容纳的令牌数量 。如果设置为0将阻止所有请求
redis-rate-limiter.burstCapacity: 4
globalcors: # 网关cors跨域设置
cors-configurations:
'[/**]': # gateway网关上所有的uri都应用下面的跨域设置
allowed-credentials: true # 允许携带认证信息
allowed-origins:
- "*" # 允许所有来源进行跨域访问
allowed-headers: "*" # 允许跨域请求里的head字段,设置为*是全部
allowed-methods: # 允许跨域的方法
- GET
- POST
- PUT
- DELETE
- OPTIONS
max-age: 3600
3、网关限流(定义组件uriKeyResolver)
@Component("uriKeyResolver")
public class UriKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
// 针对微服务的每个请求进行限流
return Mono.just(exchange.getRequest().getURI().getPath());
}
}