Alibaba Sentinel熔断降级/限流框架不完全解析

关于Alibaba Sentinel熔断降级/限流框架

阿里在集群防御、熔断限流方向所做可圈可点。 其中 github: Sentinel 在其中扮演着很重要的角色。 相对于类似的框架如 Hystrix(多得多的文档), 更加符合中国互联网工程师的思维习惯。

接下来的内容如果觉得啰嗦可以直接跳到Sentinel架构介绍小节

类似的防御体系:

  1. 美团的github: OCTO更像是集全公司的力量, 由上而下的要求全公司接入的、集中治理的平台。
  2. 滴滴对熔断、限流上更多的每个独立的团队自行发展, 各成体系。

以及其他企业的预案方案,想要轻松接入都不容易。 想要最低成本的接入熔断、限流,Sentinel更合适。

本文将持续迭代。

这里有对熔断、限流的包含源码解析的详解: Alibaba Sentinel 限流、熔断实现详解

一段话的介绍

预案

对可预期的问题, 例如 依赖的某服务不可用网络可能不稳定DB服务器不稳定下星期要进行大规模抢购可能有人恶意爬取 等这些不符合当前业务运行规则的。
设计一个处理方案, 来规避这些问题。

一般处理方案(简单列举):

  • 两地三中心
  • 服务器紧急扩容(参考微博)
  • 代码中添加if else语句切换请求来源
  • ···

通过建立一些针对可预期的问题的处理方案, 最低限度的保证自己系统的主体服务可用性

限流

通过压测测试出当前系统的最大负载能力,然后配置超过这个负载能力的请求全部丢弃、或者排队等待。
在长链路调用中,以最低承受单点为基准, 超过这个单点的负载能力的请求全部丢弃、或者排队等待。

通过限制调用方对自己的调用,起到保护自己系统的效果

熔断
在Sentinel中, 熔断往往跟降级靠在一起(我更加认为降级本就是预案的一部分,限流是预案、熔断也是预案,熔断却不一定都是降级)。

所有的对外部的调用都认为是不可控的。
其中部分调用是必须依赖的, 部分调用是可以被替代的(如查缓存改查DB)。

当我们对外部的请求发生异常, 例如超时、抛出异常, 且超过一定的阈值。这个时候我们可以理解为外部依赖不可用,多次请求也只是在浪费时间。这个时候可以禁止访问外部、或者直接返回默认值。

通过限制自己对外部系统的调用, 起到节约响应时间、维护链路稳定的作用

Alibaba Sentinel建立的用处就是在针对服务上的熔断与限流。此Sentinel不同于Redis的Sentinel
它提供一个客户端SDK, 通过编写熔断、限流规则, 起到熔断、限流的作用。
同时它提供一个服务端(非必须), 能够更好的监控客户端运行状态,同时免编码的直接下发规则给客户端。

我基于Sentinel做的一个对Hello World的限流(看不到文件可直接下载):

Sentinel使用方式

部署Sentinel的客户端

参考Github介绍 Sentinel新手指南 以及 如何使用

大致这么几部:

  1. 引入依赖(pom/sentinel-core.jar
  2. 代码编写植入
  3. 定义规则(支持本地配置规则, 使用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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值