# 《Seckill秒杀系统》第90章:业务网关使用自带流控
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
- 本章难度:★★☆☆☆
- 本章重点:了解业务网关自带的限流功能,秒杀系统业务网关使用自带限流器进行流控,掌握业务网关自带的限流器,并能够将其灵活应用到自身实际项目中。
大家好,我是冰河~~
业务网关能够整合Sentinel实现流控,也可以整合Guava实现流控,并且在前面的文章中,我们一起实现了业务网关整合Sentinal实现流控,也为大家提供了业务网关整合Guava实现流控的核心源码。其实,对于我们选择的业务网关来说,其本身就自带了限流器可以实现流控功能。
# 一、前言
在前面的文章中,秒杀系统整合了业务网关,并且对业务网关整合了Nacos,实现了业务网关对微服务的动态感知功能,后续只要有微服务注册到Nacos,业务网关都会动态感知到,并且会根据一定的负载均衡策略正确的将请求路由到对应的微服务,业务网关也整合Sentinel实现了流控。并且为大家提供了业务网关整合Guava的核心源码。
# 二、本章诉求
使用业务网关自带的限流功能对秒杀系统进行流控,掌握业务网关自带的限流功能,并且重点理解限流的原理与落地方案。通过秒杀系统的实践案例,能够将业务网关自带的限流器灵活应用到自身实际项目中。
注意:本章为大家提供网关使用自带限流功能的方案代码,但是不会真正整合到秒杀系统中,大家拿到代码后可自行整合到秒杀系统中。
# 三、业务网关自带限流
其实,在SpringCloud Gateway中,提供了一个自实现的限流过滤器,全类名为org.springframework.cloud.gateway.filter.factory.RequestRateLimiterGatewayFilterFactory
,主要也是使用令牌桶算法实现的限流功能。
在秒杀系统中使用业务网关自带的限流功能的步骤如下所示。
(1)添加Maven依赖
在网关工程的pom.xml中添加如下Maven依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
2
3
4
(2)创建HostAddrKeyResolver类
HostAddrKeyResolver类主要是指定限流的Key为访问接口的IP地址,如下所示。
@Component
public class HostAddrKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(Objects.requireNonNull(exchange.getRequest().getRemoteAddress()).getAddress().getHostAddress());
}
}
2
3
4
5
6
7
(3)修改配置文件
在配置文件中添加如下配置。
redis:
host: 127.0.0.1
port: 6379
- id: user-gateway
uri: lb://seckill-user
predicates:
- Path=/seckill-user/**
filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@hostAddrKeyResolver}"
redis-rate-limiter.replenishRate: 1 # 令牌桶填充的速率 秒为单位
redis-rate-limiter.burstCapacity: 1 # 令牌桶总容量
redis-rate-limiter.requestedTokens: 1 # 每次请求获取的令牌数
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看完整文章
加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码