背景

当遇到如下场景需要考虑限流以保护整个系统不发生宕机

  • 暴露给品牌方接口,可能存在突发流量
  • 大促时,暴露给平台端的接口,可以由于品牌或者平台的活动,接收到大量的c端流量

设计

要求

  • 关键接口尽可能高性能
  • 当发生高频请求时,告警通知
  • 限流组件
  • 支持动态限流

实现

  • 实例环境隔离,区分开平台流量和品牌流量,通过请求头方式隔离大查询(慢sql风险)
  • 统计网关层的tp99并对接钉钉告警,业务日志需要包含请求耗时
  • 限流组件使用sentinel
  • 结合guava封装限流注解实现单机限流

扩展

常见限流算法

  • 漏桶
  • 令牌桶,guava的rateLimiter,应对突发流量
  • 滑动窗口,sentinel

sentinel使用

  1. 配置规则,指定流控规则(qps或并发线程数),指定限流参数,指定按照参数独立限流
  2. 加载规则
  3. 添加注解和降级规则

限流注解封装

  1. 定义限流注解,包含令牌数,限流key可以直接采用方法名字,返回结果json
  2. 编写限流切面,按照注解切入,获取令牌,获取失败返回特定错误码
  3. 编写自动配置类
  4. 编写spring.factories
  5. 引入starter并使用