sentinel
简介
主要分为核心库和dashboard
核心库不依赖dashboard
使用步骤
- 1.定义资源
- 2.定义规则
- 3.验证规则是否生效
定义资源的方式
-
1.主流框架支持
-
2.自定义方式支持
// 1.5.0 版本开始可以利用 try-with-resources 特性 // 资源名可使用任意有业务语义的字符串,比如方法名、接口名或其它可唯一标识的字符串。 try (Entry entry = SphU.entry("resourceName")) { // 被保护的业务逻辑 // do something here... } catch (BlockException ex) { // 资源访问阻止,被限流或被降级 // 在此处进行相应的处理操作 }
-
3.返回布尔值方式定义资源
// 资源名可使用任意有业务语义的字符串 if (SphO.entry("自定义资源名")) { // 务必保证finally会被执行 try { /** * 被保护的业务逻辑 */ } finally { SphO.exit(); } } else { // 资源访问阻止,被限流或被降级 // 进行相应的处理操作 }
-
4.注解方式定义
// 原本的业务方法. @SentinelResource(blockHandler = "blockHandlerForGetUser") public User getUserById(String id) { throw new RuntimeException("getUserById command failed"); } // blockHandler 函数,原方法调用被限流/降级/系统保护的时候调用 public User blockHandlerForGetUser(String id, BlockException ex) { return new User("admin"); }
-
5.异步调用支持
try { AsyncEntry entry = SphU.asyncEntry(resourceName); // 异步调用. doAsync(userId, result -> { try { // 在此处处理异步调用的结果. } finally { // 在回调结束后 exit. entry.exit(); } });
} catch (BlockException ex) {
// Request blocked.
// Handle the exception (e.g. retry or fallback).
}
```
规则的种类
- 1.流量控制规则 (FlowRule)
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,资源名是限流规则的作用对象 | |
count | 限流阈值 | |
grade | 限流阈值类型,QPS 或线程数模式 | QPS 模式 |
limitApp | 流控针对的调用来源 default,代表不区分调用来源 | |
strategy | 判断的根据是资源自身,还是根据其它关联资源 (refResource),还是根据链路入口 | 根据资源本身 |
controlBehavior | 流控效果(直接拒绝 / 排队等待 / 慢启动模式) | 直接拒绝 |
一个资源可以有多种流控类型
相关的重要类 FlowRuleManager FlowRule
- 2.熔断降级规则(degradeRule)
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,即限流规则的作用对象 | |
count | 阈值 | |
grade | 降级模式,根据 RT 降级还是根据异常比例降级 | RT |
timeWindow | 降级的时间,单位为 s |
重要的类 DegradeRuleManager DegradeRule
- 3.系统保护规则(systemRule)
重要的类 SystemRuleManager
- 4.访问控制规则(AuthorityRule)
黑白名单功能
- 5.热点规则(paramFlowRule)
热点数据的限流
持久化规则 定制
- 动态配置系统
- 结合rdbms nosql vcs
实现原理及概念
资源对应资源名 resourceName
每次资源调用会创建 entry对象,可以自动创建和手动创建
entry创建的同时会创建一系列的功能插槽(slot chain)
slot 包括
- nodeSelectorSlot 收集资源路径,树形结构,机器有个root节点
- clusterBuilderSlot 存储资源的统计信息及调用者信息,如资源RT,QPS, thread count,多维度限流
- statisticSlot 记录不同维度的runtime指标监控信息,统计信息
- FlowSlot 根据预设的信息及前边的统计状态,进行流量控制
- AuthoritySlot 根据配置的黑白名单进行控制
- DegradeSlot 统计信息及预设规则,来做熔断降级
- SystemSlot 通过系统状态,控制总的入口流量
[外链图片转存失败(img-kFZDUV70-1566815712096)(https://github.com/alibaba/Sentinel/raw/master/doc/image/slots.gif)]
spi方式扩展slot
流量控制
相关元素
- resopuce 资源名
- count 限流阈值
- grade 限流阈值类型
- limitApp 流控针对的调用来源
- strategy 调用关系限流策略
- controlBehavior 流控效果 直接拒绝 warm up(冷启动缓慢加热) 排队
集群流控
token client向token server发送获取token的请求,集群限流服务会返回客户端结果决定是否限流
server可用独立部署模式,或者嵌入应用模式
客户端需要实现
RequestEntityWriter
ResponseEntityDecoder
服务端需要实现
ResponseEntityWriter
RequestEntityDecoder
服务端请求处理接口: RequestProcessor
熔断降级
熔断降级的策略
平均响应时间 默认4900,超过阈值熔断
异常比例 比例超过阈值百分比,会熔断
异常数 一分钟内的异常数,超过阈值,熔断
手动编码或使用@SentinelResource注解
系统自适应限流
结合应用的load,总体平均RT,入口qps,线程数,让系统达到一个平衡,尽可能最大吞吐,保证系统稳定性
最终的目的是在系统不被拖垮的情况下,提高系统吞吐率,而不是load低于某个值阈值
tcp bbr算法
动态的修改限流方案
[外链图片转存失败(img-mKLzySaM-1566815712098)(https://user-images.githubusercontent.com/9434884/45406233-645e8380-b698-11e8-8199-0c917403238f.png)]