Sentinel
背景
微服务架构设计由众多为服务组成,为保障高可用,通常会采用集群方式部署。由于服务自身原因或网络等其他问题,并不能保证100%可用性, 若单个服务出现问题, 会导致进入该服务的线程阻塞, 如果大量请求, 服务可能瘫痪, 服务与服务之间的依赖性, 故障会传播, 产生雪崩效应, 为解决和规避此问题, 业界提出熔断器模型, 衍生出了Sentinel,Hystrix和Resilience4j等组件。、
Sentinel地址
流量控制
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状。
熔断降级
与Hystrix熔断理念一致, 主要控制调用链中的不稳定资源, 针对这些不同场景进行限制, 避免影响整体系统的稳定性, 防止出现穿透、雪崩等灾难性问题。
在熔断实现上, Sentinel与Hystrix存在较大差异:
- Hystrix 是通过线程池隔离, 增加线程切换开销,侵入性较强, 且异步方式,不便主线程控制处理。
- Sentinel 前置处理, 限制请求线程并发数量来控制, 这样避免线程切换开销,侵入性低。
- Sentinel 还可以针对响应时间对资源进行降级, 当某个资源出现响应时间过长, 所有对该资源的访问都会被拒绝, 直到配置的指定时间窗口之后才重新恢复访问。
Sentinel的工作原理
主要特性视图
开源生态
工作原理
设计说明
在 Sentinel 里面,所有的资源都对应一个资源名称以及一个 Entry。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 API 显式创建;每一个 Entry 创建的时候,同时也会创建一系列功能插槽(slot chain)。这些插槽有不同的职责,例如:
- NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;
- ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;
- StatisticSlot 则用于记录、统计不同纬度的 runtime 指标监控信息;
- FlowSlot 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;
- AuthoritySlot 则根据配置的黑白名单和调用来源信息,来做黑白名单控制;
- DegradeSlot 则通过统计信息以及预设的规则,来做熔断降级;
- SystemSlot 则通过系统的状态,例如 load1 等,来控制总的入口流量;
扩展机制
Sentinel 将 SlotChainBuilder 作为 SPI 接口进行扩展,使得 Slot Chain 具备了扩展的能力。您可以自行加入自定义的 slot 并编排 slot 间的顺序,从而可以给 Sentinel 添加自定义的功能。
Sentinel使用
Dashboard控制台
Sentinel 控制台包含功能:
- 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
- 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
- 规则管理和推送:统一管理推送规则。
- 鉴权 :生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。
从GitHub下载地址下载最新版本
启动命令, 配置启动端口:
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -jar sentinel-dashboard-1.6.2.jar
默认登陆账号与密码都是sentinel,也可以通过启动参数修改:
-Dsentinel.dashboard.auth.username=sentinel
-Dsentinel.dashboard.auth.password=123456
降级演示
-
平均响应时间演示
当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源进入准降级状态。如果接下来 1s 内持续进入 5 个请求(即 QPS >= 5),它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。-
引用RtDegradeDemo示例
-
集成Dashboard控制台
POM文件加入依赖:
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId></dependency>
启动参数,指定Dashboard地址:
-Dcsp.sentinel.dashboard.server=127.0.0.1:8090
-
结果演示
查看控制台
-
-
异常比例演示
当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
ExceptionRatioDegradeDemo类
private static void initDegradeRule() {List<DegradeRule> rules = new ArrayList<DegradeRule>();DegradeRule rule = new DegradeRule();rule.setResource(KEY);// set limit exception ratio to 0.1rule.setCount(0.1);rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);rule.setTimeWindow(10);// rule.setMinRequestAmount(20);rules.add(rule);DegradeRuleManager.loadRules(rules);}
规则时间窗设为10秒, 降级比例为千分之一。
控制台
限流演示
流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
- QPS限流策略
FlowQpsDemo类,控制策略QPS限制为20。
private static void initFlowQpsRule() {List<FlowRule> rules = new ArrayList<FlowRule>();FlowRule rule1 = new FlowRule();rule1.setResource(KEY);// set limit qps to 20rule1.setCount(20);rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);rule1.setLimitApp("default");rules.add(rule1);FlowRuleManager.loadRules(rules);}
输出结果:
控制台结果:
并发线程限流策略
FlowThreadDemo类,限制并发线程访问数为20。
private static void initFlowRule() {List<FlowRule> rules = new ArrayList<FlowRule>();FlowRule rule1 = new FlowRule();rule1.setResource("methodA");// set limit concurrent thread for 'methodA' to 20rule1.setCount(20);rule1.setGrade(RuleConstant.FLOW_GRADE_THREAD);rule1.setLimitApp("default");rules.add(rule1);FlowRuleManager.loadRules(rules);}
输出结果:
控制台监控:
更多Wiki文档
总结
-
掌握Dashboard控制台的安装使用, 应用服务的接入配置。
-
Sentinel的降级与限流功能配置使用, 理解相关控制策略。