Sentinel 限流框架
Posted 木兮同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sentinel 限流框架相关的知识,希望对你有一定的参考价值。
说在前面
本篇是 Sentinel 限流框架问题导向的引导文,不对框架做详细的介绍以及落地实战,具体请参考以下导向,如果完全没了解过的请先阅读 Sentinel 介绍。
Q & A
Q1:sentinel 限流的原理,sentinel 的高可用如何解决,如果单节点挂了,接入限流的系统还能用吗?
A1:限流原理参考:Sentinel 工作主流程、阿里 Sentinel 源码解析(其中后者相对详细的讲解了工作原理源码、应用和 sentinel-dashboard 的交互原理分析)。对于高可用:首先 Sentinel 提供了 集群流控,集群流控服务端有两种启动方式,一种是独立模式,一种是嵌入模式
- 对于独立模式,目测也可以做多节点部署,上面这个链接里面提到了生产环境使用集群限流时,应该关注以下问题(但是如何部署目前未详细提到):
- Token Server 自动管理、调度(分配/选举 Token Server)
- Token Server 高可用,在某个 server 不可用时自动 failover 到其它机器- 对于嵌入模式,因为是和应用部署在一起的,这个节点挂了就说明应用节点挂了,应用节点挂了不重启的话,也能退化到 local 模式的限流,即在本地按照单机阈值执行限流检查。
Q2:分布式系统多节点的统一限流(例如会员中心,3个节点)如何解决,如果各个节点根据权重限流(例如会员中心 1 机器好点,想支持100 并发,其它机器 50),能否支持?
A2:可以做到,集群模式下可以做到统一限流,统一限流又可以设置全局阈值或者单机均摊。参考 集群流控
Q3:无业务意义的限流,如何处理,例如只是针对某个下单接口做全量的拦截
A3:Sentinel 提供了注解和代码的方式,把下单接口看作一个资源,在其方法上加入注解 @SentinelResource,或者方法里面添加相关代码,参考 如何使用
Q4:有业务意义的限流,如何支持,例如针对到单个 client_id + 单个接口
A4:或许 ContextUtil#enter 方法的第二个参数能满足需求,参考:阿里 Sentinel 源码解析
- 第一个参数是 context name,它代表调用链的入口,作用是为了区分不同的调用链路,默认是 Constants.CONTEXT_DEFAULT_NAME 的常量值 “sentinel_default_context”。
- 第二个参数代表调用方标识 origin,目前它有两个作用,一是用于黑白名单的授权控制,二是可以用来统计诸如从应用 application-a 发起的对当前应用 interfaceXxx() 接口的调用,目前这个数据会被统计,但是 dashboard 中并不展示。
Q5:考虑控制层,facade 层的限流方案
A5:Sentinel 已经提供了 Dubbo 框架的适配,主要包括针对 Service Provider 和 Service Consumer 实现的 Filter,参考 主流框架的适配
Q6:考虑对外访问的限流方案,如果我们访问别人平台被限流了,我们有什么好的方法控制我们访问他们的频率不要太高。是不是 sentinel 解决的问题?
A6:首先 Sentinel 限流粒度是一个资源,而资源几乎是可以被开发人员随意定义的,所以我们完全可以在即将调用的方法定义为一个资源进行对外访问的限流处理。
Q7:考虑应用的接入方式,尽量减少代码改动,是否和权限框架整合在一起?职责上是否清晰?
A7:应用接入方式的话,要具体看我们自己的需求吧,比如想对请求做一个限流,可以参考 Dubbo 框架的适配,自己实现一个 Filter。或者使用 AOP 的方式针对一些特定的方法限流。关于和权限框架整合在一起,其实这个整不整合没有关系的,上次演示的只是将 Sentinel Filter 加入过滤器链而已,过滤器链最终也是需要加入 Sevlet 容器,我们也完全可以用其他方式将这个 Filter 直接加入 Sevlet 容器。
Q8:限流规则如何持久化?
A8:参考 动态规则扩展、在生产环境中使用 Sentinel
Q9:监控数据如何做持久化?
官方 Wiki 中的 FAQ
- 请参考:FAQ。该链接中列出关于 Sentinel 的常见问题以及相应的注意事项和解决方案。
以上是关于Sentinel 限流框架的主要内容,如果未能解决你的问题,请参考以下文章