我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Sentinel限流熔断降级怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Sentinel限流熔断降级怎么使用

这篇文章主要讲解了“Sentinel限流熔断降级怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Sentinel限流熔断降级怎么使用”吧!

Sentinel限流熔断降级

什么是限流 \ 熔断 \ 降级

限流:在我们的后天系统中,如果那一天突然进入大量流量,我们服务原本最高只能处理同时 2k 的请求,突然一

下就来来了 5k 的请求,这对服务器的压力是不是很要命,这很可能直接导致服务器宕机,崩溃,导致原本 2K 的处

理量都不能处理了,这时候我们需要限流,限流的作用就是保持访问量到达服务器最高的情况下,对多余的请求

不做处理,相比之下,比服务器直接挂掉是好很多的。例如在双十一的时候,我们要下单就会看到类似” 请求繁

忙,请稍后重试!”。

熔断: 相信大家对断路器并不陌生,它就相当于一个开关,打开后可以阻止流量通过。比如保险丝,当电流过大

时,就会熔断,从而避免元器件损坏。

服务熔断是指调用方访问服务时通过断路器做代理进行访问,断路器会持续观察服务返回的成功、失败的状态,

当失败超过设置的阈值时断路器打开,请求就不能真正地访问到服务了。

使用场景

  • 服务故障或者升级时,让客户端快速失败

  • 失败处理逻辑容易定义

  • 响应耗时较长,客户端设置的 read timeout 会比较长,防止客户端大量重试请求导致的连接、线程资源不能释放

* 降级 *: 服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务

场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个

提前准备好的 fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳

定性和可用性。

什么是 Sentinel

Sentinel 是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。

官网:github.com/alibaba/Sentinel/wiki

2012 年,Sentinel 诞生于阿里巴巴,其主要目标是流量控制。2013-2017 年,Sentinel 迅速发展,并成为阿里巴巴所有微服务的基本组成部分。 它已在 6000 多个应用程序中使用,涵盖了几乎所有核心电子商务场景。2018 年,Sentinel 演变为一个开源项目。2020 年,Sentinel Golang 发布。

特点 :

丰富的应用场景 :Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即

突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

完备的实时监控 :Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机

器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

* 生态广广泛 *

Sentinel 的历史

  • 2012 年,Sentinel 诞生,主要功能为入口流量控制。

  • 2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。

  • 2018 年,Sentinel 开源,并持续演进。

  • 2019 年,Sentinel 朝着多语言扩展的方向不断探索,推出 C++ 原生版本,同时针对 Service Mesh 场景也推出了 Envoy 集群流量控制支持,以解决 Service Mesh 架构下多语言限流的问题。

  • 2020 年,推出 Sentinel Go 版本,继续朝着云原生方向演进。

  • 2021 年,Sentinel 正在朝着 2.0 云原生高可用决策中心组件进行演进;同时推出了 Sentinel Rust 原生版本。同时我们也在 Rust 社区进行了 Envoy WASM extension 及 eBPF extension 等场景探索。

  • 2022 年,Sentinel 品牌升级为流量治理,领域涵盖流量路由 / 调度、流量染色、流控降级、过载保护 / 实例摘除等;同时社区将流量治理相关标准抽出到 OpenSergo 标准中,Sentinel 作为流量治理标准实现。

Sentinel-go 的安装

官网文档

安装:go get github.com/alibaba/sentinel-golang/api

Go 限流实战

qps 限流

package mainimport (    "fmt"    "log"    sentinel "github.com/alibaba/sentinel-golang/api"    "github.com/alibaba/sentinel-golang/core/base"    "github.com/alibaba/sentinel-golang/core/flow")func main() {    //基于sentinel的qps限流    //必须初始化    err := sentinel.InitDefault()    if err != nil {        log.Fatalf("Unexpected error: %+v", err)    }    //配置限流规则:1秒内通过10次    _, err = flow.LoadRules([]*flow.Rule{        {            Resource:               "some_test",            TokenCalculateStrategy: flow.Direct,            ControlBehavior:        flow.Reject, //超过直接拒绝            Threshold:              10,          //请求次数            StatIntervalInMs:       1000,        //允许时间内        },    })    if err != nil {        log.Fatalf("Unexpected error: %+v", err)        return    }    for i := 0; i < 12; i++ {        e, b := sentinel.Entry("some_test", sentinel.WithTrafficType(base.Inbound))        if b != nil {            fmt.Println("限流了")        } else {            fmt.Println("检查通过")            e.Exit()        }    }}

打印结果:

检查通过检查通过检查通过检查通过检查通过检查通过检查通过检查通过检查通过检查通过限流了限流了

Thrnotting

package mainimport (    "fmt"    "log"    "time"    sentinel "github.com/alibaba/sentinel-golang/api"    "github.com/alibaba/sentinel-golang/core/base"    "github.com/alibaba/sentinel-golang/core/flow")func main() {    //基于sentinel的qps限流    //必须初始化    err := sentinel.InitDefault()    if err != nil {        log.Fatalf("Unexpected error: %+v", err)    }    //配置限流规则    _, err = flow.LoadRules([]*flow.Rule{        {            Resource:               "some_test",            TokenCalculateStrategy: flow.Direct,            ControlBehavior:        flow.Throttling, //匀速通过            Threshold:              10,              //请求次数            StatIntervalInMs:       1000,            //允许时间内        },    })    if err != nil {        log.Fatalf("Unexpected error: %+v", err)        return    }    for i := 0; i < 12; i++ {        e, b := sentinel.Entry("some_test", sentinel.WithTrafficType(base.Inbound))        if b != nil {            fmt.Println("限流了")        } else {            fmt.Println("检查通过")            e.Exit()        }        time.Sleep(time.Millisecond * 100)    }}
检查通过检查通过检查通过检查通过检查通过检查通过检查通过检查通过检查通过检查通过检查通过检查通过

Warrm_up

package mainimport (    "fmt"    "log"    "math/rand"    "time"    sentinel "github.com/alibaba/sentinel-golang/api"    "github.com/alibaba/sentinel-golang/core/base"    "github.com/alibaba/sentinel-golang/core/flow")func main() {    //先初始化sentinel    err := sentinel.InitDefault()    if err != nil {        log.Fatalf("初始化sentinel 异常: %v", err)    }    var globalTotal int    var passTotal int    var blockTotal int    ch := make(chan struct{})    //配置限流规则    _, err = flow.LoadRules([]*flow.Rule{        {            Resource:               "some-test",            TokenCalculateStrategy: flow.WarmUp, //冷启动策略            ControlBehavior:        flow.Reject, //直接拒绝            Threshold:              1000,            WarmUpPeriodSec:        30,        },    })    if err != nil {        log.Fatalf("加载规则失败: %v", err)    }    //我会在每一秒统计一次,这一秒只能 你通过了多少,总共有多少, block了多少, 每一秒会产生很多的block    for i := 0; i < 100; i++ {        go func() {            for {                globalTotal++                e, b := sentinel.Entry("some-test", sentinel.WithTrafficType(base.Inbound))                if b != nil {                    //fmt.Println("限流了")                    blockTotal++                    time.Sleep(time.Duration(rand.Uint64()%10) * time.Millisecond)                } else {                    passTotal++                    time.Sleep(time.Duration(rand.Uint64()%10) * time.Millisecond)                    e.Exit()                }            }        }()    }    go func() {        var oldTotal int //过去1s总共有多少个        var oldPass int  //过去1s总共pass多少个        var oldBlock int //过去1s总共block多少个        for {            oneSecondTotal := globalTotal - oldTotal            oldTotal = globalTotal            oneSecondPass := passTotal - oldPass            oldPass = passTotal            oneSecondBlock := blockTotal - oldBlock            oldBlock = blockTotal            time.Sleep(time.Second)            fmt.Printf("total:%d, pass:%d, block:%d\n", oneSecondTotal, oneSecondPass, oneSecondBlock)        }    }()    <-ch}

打印结果:逐渐到达 1k, 在 1k 位置上下波动

total:11, pass:9, block:0total:21966, pass:488, block:21420total:21793, pass:339, block:21414total:21699, pass:390, block:21255total:21104, pass:393, block:20654total:21363, pass:453, block:20831total:21619, pass:491, block:21052total:21986, pass:533, block:21415total:21789, pass:594, block:21123total:21561, pass:685, block:20820total:21663, pass:873, block:20717total:20904, pass:988, block:19831total:21500, pass:996, block:20423total:21769, pass:1014, block:20682total:20893, pass:1019, block:19837total:21561, pass:973, block:20524total:21601, pass:1014, block:20517total:21475, pass:993, block:20420total:21457, pass:983, block:20418total:21397, pass:1024, block:20320total:21690, pass:996, block:20641total:21526, pass:991, block:20457total:21779, pass:1036, block:20677

Go 熔断实战

这里我们介绍一个错误数量的,查看详细熔断机制

error_countpackage mainimport (    "errors"    "fmt"    "log"    "math/rand"    "time"    sentinel "github.com/alibaba/sentinel-golang/api"    "github.com/alibaba/sentinel-golang/core/circuitbreaker"    "github.com/alibaba/sentinel-golang/core/config"    "github.com/alibaba/sentinel-golang/logging"    "github.com/alibaba/sentinel-golang/util")type stateChangeTestListener struct {}func (s *stateChangeTestListener) OnTransformToClosed(prev circuitbreaker.State, rule circuitbreaker.Rule) {    fmt.Printf("rule.steategy: %+v, From %s to Closed, time: %d\n", rule.Strategy, prev.String(), util.CurrentTimeMillis())}func (s *stateChangeTestListener) OnTransformToOpen(prev circuitbreaker.State, rule circuitbreaker.Rule, snapshot interface{}) {    fmt.Printf("rule.steategy: %+v, From %s to Open, snapshot: %d, time: %d\n", rule.Strategy, prev.String(), snapshot, util.CurrentTimeMillis())}func (s *stateChangeTestListener) OnTransformToHalfOpen(prev circuitbreaker.State, rule circuitbreaker.Rule) {    fmt.Printf("rule.steategy: %+v, From %s to Half-Open, time: %d\n", rule.Strategy, prev.String(), util.CurrentTimeMillis())}func main() {    //基于连接数的降级模式    total := 0    totalPass := 0    totalBlock := 0    totalErr := 0    conf := config.NewDefaultConfig()    // for testing, logging output to console    conf.Sentinel.Log.Logger = logging.NewConsoleLogger()    err := sentinel.InitWithConfig(conf)    if err != nil {        log.Fatal(err)    }    ch := make(chan struct{})    // Register a state change listener so that we could observer the state change of the internal circuit breaker.    circuitbreaker.RegisterStateChangeListeners(&stateChangeTestListener{})    _, err = circuitbreaker.LoadRules([]*circuitbreaker.Rule{        // Statistic time span=10s, recoveryTimeout=3s, maxErrorCount=50        {            Resource:         "abc",            Strategy:         circuitbreaker.ErrorCount,            RetryTimeoutMs:   3000, //3s只有尝试回复            MinRequestAmount: 10,   //静默数            StatIntervalMs:   5000,            Threshold:        50,        },    })    if err != nil {        log.Fatal(err)    }    logging.Info("[CircuitBreaker ErrorCount] Sentinel Go circuit breaking demo is running. You may see the pass/block metric in the metric log.")    go func() {        for {            total++            e, b := sentinel.Entry("abc")            if b != nil {                // g1 blocked                totalBlock++                fmt.Println("协程熔断了")                time.Sleep(time.Duration(rand.Uint64()%20) * time.Millisecond)            } else {                totalPass++                if rand.Uint64()%20 > 9 {                    totalErr++                    // Record current invocation as error.                    sentinel.TraceError(e, errors.New("biz error"))                }                // g1 passed                time.Sleep(time.Duration(rand.Uint64()%20+10) * time.Millisecond)                e.Exit()            }        }    }()    go func() {        for {            total++            e, b := sentinel.Entry("abc")            if b != nil {                // g2 blocked                totalBlock++                time.Sleep(time.Duration(rand.Uint64()%20) * time.Millisecond)            } else {                // g2 passed                totalPass++                time.Sleep(time.Duration(rand.Uint64()%80) * time.Millisecond)                e.Exit()            }        }    }()    go func() {        for {            time.Sleep(time.Second)            fmt.Println(totalErr)        }    }()    <-ch}

感谢各位的阅读,以上就是“Sentinel限流熔断降级怎么使用”的内容了,经过本文的学习后,相信大家对Sentinel限流熔断降级怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Sentinel限流熔断降级怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Sentinel限流熔断降级怎么使用

这篇文章主要讲解了“Sentinel限流熔断降级怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Sentinel限流熔断降级怎么使用”吧!Sentinel限流熔断降级什么是限流 \ 熔
2023-07-04

Spring Cloud Alibaba 使用 Feign+Sentinel 怎么完成熔断

这篇文章主要讲解了“Spring Cloud Alibaba 使用 Feign+Sentinel 怎么完成熔断”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Cloud Alib
2023-06-14

Redis怎么实现限流和熔断

Redis 可以通过以下方式实现限流和熔断:限流:使用 Redis 的计数器功能来实现限流。在每次请求到来时,首先检查计数器的值是否超过设定的阈值,如果超过则拒绝请求,否则允许请求并将计数器加一。可以使用 Redis 的 INCR 命令来实
Redis怎么实现限流和熔断
2024-05-07

GS Admin限流功能怎么使用

今天小编给大家分享一下GS Admin限流功能怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。仓库giee: gite
2023-07-04

怎么使用AOP+redis+lua做限流

这篇“怎么使用AOP+redis+lua做限流”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用AOP+redis+lu
2023-06-30

java怎么使用Semaphore实现限流器

这篇文章主要讲解了“java怎么使用Semaphore实现限流器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java怎么使用Semaphore实现限流器”吧!概念1、Semaphore可以
2023-06-30

redisson分布式限流RRateLimiter怎么使用

今天小编给大家分享一下redisson分布式限流RRateLimiter怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧
2023-07-04

nginx怎么使用内置模块配置限速限流

这篇文章主要介绍“nginx怎么使用内置模块配置限速限流”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nginx怎么使用内置模块配置限速限流”文章能帮助大家解决问题。有时候 NGINX 面对一些特殊
2023-06-30

怎么判断不限内容VPS使用是否正常

判断不限内容VPS使用是否正常的方法:1、关闭防火墙,使用ping命令看是否能ping通,能ping通说明VPS运行正常;2、使用域名解析访问域名,看是否能ping通,是否能远程连接VPS,域名解析是否正常来判断VPS使用是否正常,如VPS
2023-02-08

Java怎么使用Semaphore对单接口进行限流

这篇文章主要讲解了“Java怎么使用Semaphore对单接口进行限流”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么使用Semaphore对单接口进行限流”吧!目录一、实战说明1
2023-06-20

云服务器无限流量怎么设置使用

云服务器是一种虚拟服务器,它具有无限的存储空间和计算能力,可以根据用户的需要随意分配和使用,以提供高可靠性、高可扩展性和灵活性。以下是使用云服务器无限流量的具体步骤:选择合适的云服务器供应商,选择一款合适的云服务器,比如阿里云、亚马逊等。注册并获取账号并绑定设备。在云服务器的配置文件中,可以找到“Surrounding”选项,点击进去。设置账户类型(Single)。默认情况下,云服务器都
2023-10-26

使用springmvc怎么实现一个限流拦截器

这期内容当中小编将会给大家带来有关使用springmvc怎么实现一个限流拦截器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。限流器算法目前常用限流器算法为两种:令牌桶算法和漏桶算法,主要区别在于:漏桶算法
2023-05-30

怎么使用Go+Redis实现常见限流算法

本文小编为大家详细介绍“怎么使用Go+Redis实现常见限流算法”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Go+Redis实现常见限流算法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。固定窗口使用R
2023-07-05

SpringBoot怎么使用RateLimiter通过AOP方式进行限流

这篇文章主要讲解了“SpringBoot怎么使用RateLimiter通过AOP方式进行限流”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么使用RateLimiter通
2023-07-02

使用香港不限流量vps卡顿怎么解决

1. 优化VPS配置如果您的VPS配置较低,可能会导致卡顿现象。您可以考虑升级VPS配置,例如增加CPU、内存、硬盘容量等。2. 优化网络连接如果您的网络连接较慢,也可能会导致卡顿现象。您可以尝试优化网络连接,例如使用更快的网络服务提供商、
2023-05-24

使用Asp.NET怎么实现一个限流控制功能

使用Asp.NET怎么实现一个限流控制功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、AspNetCoreRateLimit 介绍AspNetCoreRa
2023-06-08

怎么使用php递归实现无限级分类

使用PHP递归实现无限级分类的步骤如下:1. 创建一个数组或从数据库中获取分类数据,包含id和parent_id字段,表示分类的唯一标识和父级分类的标识。2. 创建一个递归函数,接受两个参数:分类数据和父级分类的id。3. 在递归函数中,遍
2023-09-29

云服务器无限流量怎么设置使用方法

配置云服务器:选择一个稳定可靠的云服务器提供商,并确保您的网络带宽和存储空间足够支持您的应用程序。您可以选择多家云服务器提供商,并了解每个云服务器提供商的流量管理和限制方式。此外,您可以选择自动伸缩和备份等功能来帮助您控制网络带宽和存储空间。启用多线程:在云服务器上启用多线程可以帮助您在有限的网络带宽下提供更多的计算能
2023-10-27

云服务器无限流量怎么设置使用时间

云服务器的无限流量设置是一个重要的功能,它可以使用户在没有连接互联网的情况下也能够使用云服务器提供的资源。一般来说,用户需要设置一个有效的WiFi连接,并将其与云服务器的连接设置为自动连接。这个设置可以使用户无论身在何处,都能够使用云服务器提供的资源。除了WiFi连接之外,用户还需要选择一个合适的云服务器应用程序。用户
2023-10-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录