# 《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>
1
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());
    }
}
1
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 # 每次请求获取的令牌数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码