背景
当遇到如下场景需要考虑限流以保护整个系统不发生宕机
- 暴露给品牌方接口,可能存在突发流量
- 大促时,暴露给平台端的接口,可以由于品牌或者平台的活动,接收到大量的c端流量
设计
要求
- 关键接口尽可能高性能
- 当发生高频请求时,告警通知
- 限流组件
- 支持动态限流
实现
- 实例环境隔离,区分开平台流量和品牌流量,通过请求头方式隔离大查询(慢sql风险)
- 统计网关层的tp99并对接钉钉告警,业务日志需要包含请求耗时
- 限流组件使用sentinel
- 结合guava封装限流注解实现单机限流
扩展
常见限流算法
- 漏桶
- 令牌桶,guava的rateLimiter,应对突发流量
- 滑动窗口,sentinel
sentinel使用
- 配置规则,指定流控规则(qps或并发线程数),指定限流参数,指定按照参数独立限流
- 加载规则
- 添加注解和降级规则
限流注解封装
- 定义限流注解,包含令牌数,限流key可以直接采用方法名字,返回结果json
- 编写限流切面,按照注解切入,获取令牌,获取失败返回特定错误码
- 编写自动配置类
- 编写spring.factories
- 引入starter并使用