上一篇我们说了本地限流的几种算法跟实现方式,文章最后我们发现目前框架存在的问题如下:
1.不支持分布式的限流算法
2.不支持用户自定义限流算法
分布式的限流我们可以借助redis实现,如果用户使用数据库或者Zookeper或者sentinel**,我们需要支持这些别的组件所定义的限流算法。
接口制定了规范,tryAcquire方法抽象出是否可以仿写。由于不同的组件需要内置的参数是不同的,所以我们新增一个顶级的方法init暴露给用户自定义。
例如我们使用redis实现了固定窗口算法的实现
注意,用户自定义的策略跟内置策略不同内置策略没有借助Spring的对象管理,考虑到用户自定义的类会托管给Spring,所一我们不会创建用户自定义的策略对象而是从Bean工厂里面获取。
AOP中,利用模板方法固定获取限流策略类的流程。定义StrategyManager类用来管理策略对象类,RateLimiterFactory类创建策略对象。
通过修改参数达到切换限流策略的目的。
额外拓展:
爱码士在抽象类**中预留了key,这样还可以提供接口根据key去查询限流的情况。可以将单位窗口里的成功,失败总数记录,设置阀值,当超过多少阀值可以人工告警,还可以提供接口动态修改限流参数。 如何实现小伙伴们可以开动脑筋
获取方式 扫码,关注后,
发送:002
**Springboot3
Springboot · 目录**
上一篇Springboot技术专家 从0到1基于责任链模式实现自己的服务编排框架下一篇Springboot技术专家 从0到1基于模板模式实现自己的服务限流框架(上)