Alibaba Sentinel熔断降级/限流框架不完全解析
关于Alibaba Sentinel熔断降级/限流框架
阿里在集群防御、熔断限流方向所做可圈可点。 其中 github: Sentinel 在其中扮演着很重要的角色。 相对于类似的框架如 Hystrix(多得多的文档), 更加符合中国互联网工程师的思维习惯。
接下来的内容如果觉得啰嗦可以直接跳到
Sentinel架构介绍
小节
类似的防御体系:
- 美团的github: OCTO更像是集全公司的力量, 由上而下的要求全公司接入的、集中治理的平台。
- 滴滴对熔断、限流上更多的每个独立的团队自行发展, 各成体系。
以及其他企业的预案方案,想要轻松接入都不容易。 想要最低成本的接入熔断、限流,Sentinel更合适。
本文将持续迭代。
这里有对熔断、限流的包含源码解析的详解: Alibaba Sentinel 限流、熔断实现详解
一段话的介绍
预案
对可预期的问题, 例如 依赖的某服务不可用、网络可能不稳定、DB服务器不稳定、下星期要进行大规模抢购、可能有人恶意爬取 等这些不符合当前业务运行规则的。
设计一个处理方案, 来规避这些问题。
一般处理方案(简单列举):
- 两地三中心
- 服务器紧急扩容(参考微博)
- 代码中添加
if else
语句切换请求来源 - ···
通过建立一些针对可预期的问题的处理方案, 最低限度的保证自己系统的主体服务可用性
。
限流
通过压测测试出当前系统的最大负载能力,然后配置超过这个负载能力的请求全部丢弃、或者排队等待。
在长链路调用中,以最低承受单点为基准, 超过这个单点的负载能力的请求全部丢弃、或者排队等待。
通过限制调用方对自己的调用,起到保护自己系统的效果
。
熔断
在Sentinel中, 熔断往往跟降级靠在一起(我更加认为降级本就是预案的一部分,限流是预案、熔断也是预案,熔断却不一定都是降级)。
所有的对外部的调用都认为是不可控的。
其中部分调用是必须依赖的, 部分调用是可以被替代的(如查缓存改查DB)。
当我们对外部的请求发生异常, 例如超时、抛出异常, 且超过一定的阈值。这个时候我们可以理解为外部依赖不可用,多次请求也只是在浪费时间。这个时候可以禁止访问外部、或者直接返回默认值。
通过限制自己对外部系统的调用, 起到节约响应时间、维护链路稳定的作用
。
Alibaba Sentinel建立的用处就是在针对服务上的熔断与限流。此Sentinel不同于Redis的Sentinel。
它提供一个客户端SDK, 通过编写熔断、限流规则, 起到熔断、限流的作用。
同时它提供一个服务端(非必须), 能够更好的监控客户端运行状态,同时免编码的直接下发规则给客户端。
我基于Sentinel做的一个对Hello World的限流(看不到文件可直接下载):
Sentinel使用方式
部署Sentinel的客户端
参考Github介绍 Sentinel新手指南 以及 如何使用
大致这么几部:
- 引入依赖(
pom
/sentinel-core.jar
) - 代码编写植入
- 定义规则(支持本地配置规则, 使用Sentinel Dashboard配置规则)。
相对来说Sentinel的接入非常轻便简单了。但是遇到每一段代码都植入Sentinel给定的代码, 也是很麻烦, 因此可以参考小节
基于Sentinel所做易用性拓展
参考官方demo:
// 代码编写植入
public static void main(String[] args) {
// 配置规则.
initFlowRules();
while (true) {
// 1.5.0 版本开始可以直接利用 try-with-resources 特性
try (Entry entry = SphU.entry("HelloWorld")) {
// 被保护的逻辑
System.out.println("hello world");
} catch (BlockException ex) {
// 处理被流控的逻辑
System.out.println("blocked!");
}
}
}
// 定义规则(支持本地配置规则, 使用Sentinel Dashboard配置规则)。
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("HelloWorld");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// Set limit QPS to 20.
rule.setCount(20);
rules.add(rule);