22

Alibaba Sentinel 限流与熔断初探

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzIzNzgyMjYxOQ%3D%3D&%3Bmid=2247484550&%3Bidx=1&%3Bsn=5e057b2d4c15411d743f84637a2cf9e3
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

点击上方 “中间件兴趣圈” 选择 “设为星标”

做积极的人,越努力越幸运!

6rAF3eF.png!web

温馨提示:源码分析 Alibaba Sentinel 专栏开始连载,本文展示如何学习一个全新的技术的方法。该专栏基于 1.7.0 版本。

在学习一个新技术或新框架时,建议先查看其官方文档,以获得对其形成一个整体的认识。https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

1、Sentinel 是什么 ?主要能解决什么问题?

按照官方的定义,Sentinel 意为分布式系统的流量防卫兵,主要提供限流、熔断等服务治理相关的功能。

服务的动态注册、服务发现是 SOA、微服务架构体系中首先需要解决的基本问题,服务治理是 SOA 领域又一重要课题,而 dubbo 框架只提供了一些基本的服务治理能力,例如限制服务并发调用数、配置合适的业务线程数量等,但熔断相关的功能就涉及的较少。

Sentinel 将作为 Dubbo 生态的重要一员,将集中解决服务治理相关的课题,服务限流与熔断又是服务治理首先要解决的课题。

那什么是限流与熔断呢?

限流:我们通常使用TPS对流量来进行描述,限流就是现在服务被调用的并发TPS,从而对系统进行自我保护。

熔断:就是当系统中某一个服务出现性能瓶颈是,对这个服务的调用进行快速失败,避免造成连锁反应,从而影响整个链路的调用。

2、限流与熔断的使用场景

限流还是比较好理解,例如一个项目在上线之前经过性能测试评估,例如服务在 TPS 达到 1w/s 时系统资源利用率飙升,与此同时响应时间急剧增大,那我们就要控制该服务的调用TPS,超过该 TPS 的流量就需要进行干预,可以采取拒绝、排队等策略,实现流量的削峰填谷。

还有一个场景,例如一下开放平台,对接口进行收费,免费用户要控制调用TPS,账户的等级不同,允许调用的TPS也不同,这种情况就非常适合限流。

那熔断的使用场景呢?我们首先来看一下如下的分布式架构。

JZvAvmm.png!web

例如应用A 部署了3台机器,如果由于某种原因,例如线程池 hold 住,导致发送到它上面的请求会出现超时而报错,由于该进程并未宕机,请求还是会通过负载算法请求出现故障的机器,出现整个1/3的请求出现超时报错,影响整个系统的可用性?也就是其中一台故障会对整个服务质量产生严重的影响,虽然是集群部署,但无法达到高可用性。那如何解决该问题?如果在调用方(API-Center) 对异常进行统计,发现发往某一台机器的错误数或错误率达到设定的值,就在一定的世界间隔内不继续发往该机器,转而发送给集群内正常的节点,这样就实现了高可用,这就是所谓的熔断机制。

有了上面的基本认识,接下来会进行一些阅读源码的准备,为后面的源码分析 Sentinel 打下坚实的基础。

3、Sentinel 源码结构

qmyQvyN.jpg!web

Sentinel 的核心模块说明如下:

  • sentinel-core

    Sentinel 核心模块,实现限流、熔断等基本能力。

  • sentinel-dashboard

    Sentinel 可视化控制台,提供基本的管理界面,配置限流、熔断规则等,展示监控数据等。

  • sentinel-adapter

    Sentinel 适配,Sentinel-core 模块提供的是限流等基本API,主要是提供给应用自己去显示调用,对代码有侵入性,故该模块对主流框架进行了适配,目前已适配的模块如下:

    • sentinel-apache-dubbo-adapter

      对 Apache Dubbo 版本进行适配,这样应用只需引入 sentinel-apache-dubbo-adapter 包即可对 dubbo 服务进行流控与熔断,大家可以思考会利用 Dubbo 的哪个功能特性。

    • sentinel-dubbo-adapter

      对 Alibaba Dubbo 版本进行适配。

    • sentinel-grpc-adapter

      对 GRPC 进行适配。

    • sentinel-spring-webflux-adapter

      对响应式编程框架 webflux 进行适配。

    • sentinel-web-servlet

      对 servlet 进行适配,例如 Spring MVC。

    • sentinel-zuul-adapter

      对 zuul 网关进行适配。

  • sentinel-cluster

    提供集群模式的限流与熔断支持,因为通常一个应用会部署在多台机器上组成应用集群。

  • sentinel-transport

    网络通讯模块,提供 Sentinel 节点与 sentinel-dashboard 的通讯支持,主要有如下两种实现。

    • sentinel-transport-netty-http

      基于 Netty 实现的 http 通讯模式。

    • sentinel-transport-simple-http

      简单的 http 实现方式。

  • sentinel-extension

    Sentinel 扩展模式。主要提供了如下扩展(高级)功能:

    • sentinel-annotation-aspectj

      提供基于注解的方式来定义资源等。

    • sentinel-parameter-flow-control

      提供基于参数的限流(热点限流)。

    • sentinel-datasource-extension

      限流规则、熔断规则的存储实现,默认是存储在内存中。

    • sentinel-datasource-apollo

      基于 apollo 配置中心实现限流规则、熔断规则的存储,动态推送生效机制。

    • sentinel-datasource-consul

      基于 consul 实现限流规则、熔断规则的存储,动态推送生效机制。

    • sentinel-datasource-etcd

      基于 etcd 实现限流规则、熔断规则的存储,动态推送生效机制。

    • sentinel-datasource-nacos

      基于 nacos 实现限流规则、熔断规则的存储,动态推送生效机制。

    • sentinel-datasource-redis

      基于 redis 实现限流规则、熔断规则的存储,动态推送生效机制。

    • sentinel-datasource-spring-cloud-config

      基于 spring-cloud-config 实现限流规则、熔断规则的存储,动态推送生效机制。

    • sentinel-datasource-zookeeper

      基于 zookeeper 实现限流规则、熔断规则的存储,动态推送生效机制。

4、在 IntelliJ IDEA 中运行 Sentine Demo

在 sentinel-demo 模块下提供了很多示例,Seninel 一开始是为 Dubbo 而生的,故我们选取一下 sentinel-demo-apache-dubbo 为本次演示的示例。

注意:该版本需要引入的 apache dubbo 版本需要修改为 2.7.2。

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.7.2</version>
</dependency>

Step1:先启动 sentinel-dashboard,启动参数配置如下:

mIvE3yQ.jpg!web

sentinel-demo-apache-dubbo 模块如下所示:

NZzAnaM.png!web

先启动服务提供者,其配置参数如下:

2MJFBbi.jpg!web

然后启动服务消费者,其配置参数如下:

UzA3QbB.jpg!web

启动后,我们能看到消费者会出现报错,因为触发了限流,我们可以通过控制台查看接入应用的信息,例如输入:http://localhost:8080

部分截图如下:

6JbAbuj.jpg!webyEBRvui.jpg!web

可以在控制台动态添加限流、熔断等规则配置,然后接入的客户端将能在不启动应用的情况下生效。

默认情况下,sentinel-dashboard 中的规则是存储在内存中,重启后就会丢失,因此 Sentinel 提供了很多种数据源的实现,例如 sentinel-datasource-zookeeper,这部分内容随着该专栏的陆续更新,将会对该机制进行介绍。

欢迎加入我的知识星球,一起交流源码,探讨架构 ,打造高质量的技术交流圈, 长按如下二维码

fymYVbB.png!web

中间件兴趣圈 知识星球 正在对如下话题展开如火如荼的讨论:

1、【让天下没有难学的Netty-网络通道篇】

1、Netty4 Channel概述

2、Netty4 ChannelHandler概述

3、Netty4事件处理传播机制

4、Netty4服务端启动流程

5、Netty4 NIO 客户端启动流程

6、Netty4 NIO线程模型分析

7、Netty4编码器、解码器实现原理

8、Netty4 读事件处理流程

9、Netty4 写事件处理流程

10、Netty4 NIO Channel其他方法详解

2、Java 并发框架(JUC) 探讨【 面试神器

如果喜欢您喜欢这篇文章,点赞 转发是对我最大的鼓励,越努力越幸运,一起加油。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK