Alibaba Sentinel 限流与熔断初探

Stella981
• 阅读 616

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

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

Alibaba Sentinel 限流与熔断初探

温馨提示:源码分析 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也不同,这种情况就非常适合限流。

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

Alibaba Sentinel 限流与熔断初探

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

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

3、Sentinel 源码结构


Alibaba Sentinel 限流与熔断初探

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,启动参数配置如下:

Alibaba Sentinel 限流与熔断初探

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

Alibaba Sentinel 限流与熔断初探

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

Alibaba Sentinel 限流与熔断初探

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

Alibaba Sentinel 限流与熔断初探

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

部分截图如下:

Alibaba Sentinel 限流与熔断初探

Alibaba Sentinel 限流与熔断初探

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

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


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

Alibaba Sentinel 限流与熔断初探

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

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) 探讨【 面试神器】

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

本文分享自微信公众号 - 中间件兴趣圈(dingwpmz_zjj)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Stella981 Stella981
3年前
Canal 如何保证数据库库事务的一致性
点击上方“中间件兴趣圈”,选择“设为星标”做积极的人,越努力越幸运!!(https://oscimg.oschina.net/oscnet/65b1a5c3587b629c19b3685264434b69949.png)(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.wei
Stella981 Stella981
3年前
Sentinel 调用上下文环境实现原理(含原理图)
点击上方“中间件兴趣圈”,选择“设为星标”做积极的人,越努力越幸运!!(https://oscimg.oschina.net/oscnet/33cec0d20fe42d2f34e7ea0ccb472821287.png)(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp
Stella981 Stella981
3年前
Sentinel 集群限流设计原理
点击上方“中间件兴趣圈”,选择“设为星标”做积极的人,越努力越幸运!!(https://oscimg.oschina.net/oscnet/7366d60332fba1cdd61fffdbfe50fbb2f75.png)(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp
Stella981 Stella981
3年前
Sentienl 流控效果之匀速排队与预热实现原理与实战建议
点击上方“中间件兴趣圈”,选择“设为星标”做积极的人,越努力越幸运!!(https://oscimg.oschina.net/oscnet/a4efb73032c3317edc4d4a58f6f5a2f4235.png)(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp
Stella981 Stella981
3年前
Sentinel 动态数据源架构设计理念与改造实践
点击上方“中间件兴趣圈”,选择“设为星标”做积极的人,越努力越幸运!!(https://oscimg.oschina.net/oscnet/d4efa6c24ed1a56d0edc2e015106825c9ed.png)(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp
Stella981 Stella981
3年前
Sentinel 系统自适应限流原理剖析与实战指导
点击上方“中间件兴趣圈”,选择“设为星标”做积极的人,越努力越幸运!!(https://oscimg.oschina.net/oscnet/71eb753c0197b1ddde74497a579296873ec.png)(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp
Stella981 Stella981
3年前
Sentinel FlowSlot 限流实现原理(文末附流程图与总结)
点击上方“中间件兴趣圈”,选择“设为星标”做积极的人,越努力越幸运!!(https://oscimg.oschina.net/oscnet/8c5bd236633405fcff940fb8b368887110b.png)(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp