Sentinel(从入门到精通详细图解)

Sentinel(从入门到精通详细图解)-mikechen

Sentinel简介

Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。

Sentinel(从入门到精通详细图解)-mikechen

 

Sentinel特征

Sentinel 具有以下特征,大致分为如下4点:

1)丰富的应用场景

Sentinel 承接了阿里巴巴近10年的双十一大促流量的核心场景,例如:秒杀、消息削峰、填谷、集群流量、控制、实时熔断下游等。

2)完备的实时监控

Sentinel 同时提供实时的监控功能,你可以在控制台中看到集群的汇总运行情况。

3)广泛的开源生态

Sentinel 提供了与 Spring Cloud、Dubbo、gRPC 的整合,只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

4)完善的SPI扩展点

Sentinel 提供简单易用、完善的 SPI 扩展接口,例如:定制规则管理、适配动态数据源等。

 

Sentinel 组成

1.Sentinel 核心库

Sentinel 的核心库不依赖任何框架或库,能够运行于 Java 8 及以上的版本的运行时环境中。

同时对Spring Cloud、Dubbo、gRPC 等微服务框架提供了很好的支持。

 

2.Sentinel 控制台

Sentinel(从入门到精通详细图解)-mikechen

Sentinel 提供的一个轻量级的开源控制台:它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能。

 

Sentinel 核心功能

Sentinel(从入门到精通详细图解)-mikechen

1.流量控制

我们的机器不可能无限制的接受和处理客户端的请求,如果不加以限制,当发生高并发情况时,系统资源将很快被耗尽。为了避免这种情况,我们就可以添加流量控制

Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:

Sentinel(从入门到精通详细图解)-mikechen

流量控制有以下几个角度:

  • 资源的调用关系:例如资源的调用链路,资源和资源之间的关系;
  • 运行指标:例如 QPS、线程池、系统负载等;
  • 控制的效果:例如直接限流、冷启动、排队等;

 

2.限流

Sentinel(从入门到精通详细图解)-mikechen

Sentinel提供了两种流量统计方式:

一种是统计并发线程数;

另外一种则是统计 QPS;

当并发线程数超出某个设定的阈值,新的请求会被立即拒绝,当QPS超出某个设定的阈值,系统可以拒绝等方式来应对,从而起流量控制的作用。

 

3.熔断降级

Sentinel(从入门到精通详细图解)-mikechen

接触过Spring Cloud的同学,都知道熔断降级的概念。

服务之间会有相互依赖关系,例如:服务A做到了1秒上万个QPS,但这时候服务B并无法满足1秒上万个QPS,那么如何保证服务A在高频调用服务B时,服务B仍能正常工作呢?

一种比较常见的情况是:服务A调用服务B时,服务B因无法满足高频调用出现响应时间过长的情况,导致服务A也出现响应过长的情况,进而产生连锁反应影响整个依赖链上的所有应用。

这时候就需要熔断和降级的方法,Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时,进行限制,避免影响到其它的资源而导致级联错误。

在Sentinel中判断资源是否处于稳定状态的指标或者纬度:

  • 慢调用比例(SLOW_REQUEST_RATIO)
  • 异常比例(ERROR_RATIO)
  • 异常数(ERROR_COUNT)

 

4.塑形

通常我们遇到的流量具有随机性、不规则、不受控的特点,但系统的处理能力往往是有限的,我们需要根据系统的处理能力对流量进行塑形,即规则化,从而根据我们的需要来处理流量。

Sentinel通过资源的调用关系、运行指标、控制的效果三个维度来对流量进行控制,开发者可以自行灵活组合,从而达到理想的效果。

5.负载保护

平时系统运行都没问题,但遇到大促的时候,发现机器的load非常高,这时候对系统的负载保护就显得非常重要,以防止雪崩。

Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

需要注意的是:Sentinel在系统负载保护方面的判断机制是根据系统能够处理的请求,和允许进来的请求,来做平衡。

而不是根据一个间接的指标系统load来做限流,因为我们最终追求的目标是在系统不被拖垮的情况下,提高系统的吞吐率,而不是load一定要到低于某个阈值。

 

Sentinel使用示例

创建SpringBoot 应用,加入Sentinel依赖,我们做一个简要的使用示例。

1.加入Maven 依赖pom

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.0</version>
</dependency>

 

2.加入控制层

@Controller
public class TestController {

    @RequestMapping(path = {"/hello"}, method = RequestMethod.GET)
    @ResponseBody
    public String hello() {
        try {
        	// 设置一个资源名称为 Hello
            Entry ignored = SphU.entry("Hello");
            System.out.println("Hello Sentinel");
            return "Hello Sentinel";
        } catch (BlockException e) {
            System.out.println("系统繁忙,请稍后");
            e.printStackTrace();
            return "系统繁忙,请稍后";
        }
    }

    /** 
     * 使用代码编写流控规则,项目中不推荐使用,这是硬编码方式
     * 
     * 注解 @PostConstruct 的含义是:本类构造方法执行结束后执行
     */
    @PostConstruct
    public void initFlowRule() {
        /* 1.创建存放限流规则的集合 */
        List<FlowRule> rules = new ArrayList<>();
        /* 2.创建限流规则 */
        FlowRule rule = new FlowRule();
        /* 定义资源,表示 Sentinel 会对哪个资源生效 */
        rule.setResource("Hello");
        /* 定义限流的类型(此处使用 QPS 作为限流类型) */
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        /* 定义 QPS 每秒通过的请求数 */
        rule.setCount(2);
        /* 3.将限流规则存放到集合中 */
        rules.add(rule);
        /* 4.加载限流规则 */
        FlowRuleManager.loadRules(rules);
    }
}

3.测试运行

Sentinel(从入门到精通详细图解)-mikechen

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法