Sentinel限流熔断降级怎么使用


这篇文章主要讲解了“Sentinel限流熔断降级怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Sentinel限流熔断降级怎么使用”吧!什么是限流 熔断 降级限流:在我们的后天系统中,如果那一天突然进入大量流量,我们服务原本最高只能处理同时 2k 的请求,突然一下就来来了 5k 的请求,这对服务器的压力是不是很要命,这很可能直接导致服务器宕机,崩溃,导致原本 2K 的处理量都不能处理了,这时候我们需要限流,限流的作用就是保持访问量到达服务器最高的情况下,对多余的请求不做处理,相比之下,比服务器直接挂掉是好很多的。例如在双十一的时候,我们要下单就会看到类似” 请求繁忙,请稍后重试!”。熔断: 相信大家对断路器并不陌生,它就相当于一个开关,打开后可以阻止流量通过。比如保险丝,当电流过大时,就会熔断,从而避免元器件损坏。服务熔断是指调用方访问服务时通过断路器做代理进行访问,断路器会持续观察服务返回的成功、失败的状态,当失败超过设置的阈值时断路器打开,请求就不能真正地访问到服务了。使用场景服务故障或者升级时,让客户端快速失败失败处理逻辑容易定义响应耗时较长,客户端设置的 read timeout 会比较长,防止客户端大量重试请求导致的连接、线程资源不能释放* 降级 *: 服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的 fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。什么是 SentinelSentinel 是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。官网:github.com/alibaba/Sentinel/wiki2012 年,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/apiGo 限流实战qps 限流

packagemain

import(
"fmt"
"log"

sentinel"github.com/alibaba/sentinel-golang/api"
"github.com/alibaba/sentinel-golang/core/base"
"github.com/alibaba/sentinel-golang/core/flow"
)

funcmain(){
//基于sentinel的qps限流
//必须初始化
err:=sentinel.InitDefault()
iferr!=nil{
log.Fatalf("Unexpectederror:%+v",err)
}

//配置限流规则:1秒内通过10次
_,err=flow.LoadRules([]*flow.Rule{
{
Resource:"some_test",
TokenCalculateStrategy:flow.Direct,
ControlBehavior:flow.Reject,//超过直接拒绝
Threshold:10,//请求次数
StatIntervalInMs:1000,//允许时间内
},
})

iferr!=nil{
log.Fatalf("Unexpectederror:%+v",err)
return
}

fori:=0;i

打印结果:

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

Thrnotting

packagemain

import(
"fmt"
"log"
"time"

sentinel"github.com/alibaba/sentinel-golang/api"
"github.com/alibaba/sentinel-golang/core/base"
"github.com/alibaba/sentinel-golang/core/flow"
)

funcmain(){
//基于sentinel的qps限流
//必须初始化
err:=sentinel.InitDefault()
iferr!=nil{
log.Fatalf("Unexpectederror免费云主机域名:%+v",err)
}

//配置限流规则
_,err=flow.LoadRules([]*flow.Rule{
{
Resource:"some_test",
TokenCalculateStrategy:flow.Direct,
ControlBehavior:flow.Throttling,//匀速通过
Threshold:10,//请求次数
StatIntervalInMs:1000,//允许时间内
},
})

iferr!=nil{
log.Fatalf("Unexpectederror:%+v",err)
return
}

fori:=0;i

检查通过
检查通过
检查通过
检查通过
检查通过
检查通过
检查通过
检查通过
检查通过
检查通过
检查通过
检查通过

Warrm_up

packagemain

import(
"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"
)

funcmain(){
//先初始化sentinel
err:=sentinel.InitDefault()
iferr!=nil{
log.Fatalf("初始化sentinel异常:%v",err)
}

varglobalTotalint
varpassTotalint
varblockTotalint
ch:=make(chanstruct{})

//配置限流规则
_,err=flow.LoadRules([]*flow.Rule{
{
Resource:"some-test",
TokenCalculateStrategy:flow.WarmUp,//冷启动策略
ControlBehavior:flow.Reject,//直接拒绝
Threshold:1000,
WarmUpPeriodSec:30,
},
})

iferr!=nil{
log.Fatalf("加载规则失败:%v",err)
}

//我会在每一秒统计一次,这一秒只能你通过了多少,总共有多少,block了多少,每一秒会产生很多的block
fori:=0;i

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

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

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

error_count
packagemain

import(
"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"
)

typestateChangeTestListenerstruct{
}

func(s*stateChangeTestListener)OnTransformToClosed(prevcircuitbreaker.State,rulecircuitbreaker.Rule){
fmt.Printf("rule.steategy:%+v,From%stoClosed,time:%dn",rule.Strategy,prev.String(),util.CurrentTimeMillis())
}

func(s*stateChangeTestListener)OnTransformToOpen(prevcircuitbreaker.State,rulecircuitbreaker.Rule,snapshotinterface{}){
fmt.Printf("rule.steategy:%+v,From%stoOpen,snapshot:%d,time:%dn",rule.Strategy,prev.String(),snapshot,util.CurrentTimeMillis())
}

func(s*stateChangeTestListener)OnTransformToHalfOpen(prevcircuitbreaker.State,rulecircuitbreaker.Rule){
fmt.Printf("rule.steategy:%+v,From%stoHalf-Open,time:%dn",rule.Strategy,prev.String(),util.CurrentTimeMillis())
}

funcmain(){
//基于连接数的降级模式
total:=0
totalPass:=0
totalBlock:=0
totalErr:=0
conf:=config.NewDefaultConfig()
//fortesting,loggingoutputtoconsole
conf.Sentinel.Log.Logger=logging.NewConsoleLogger()
err:=sentinel.InitWithConfig(conf)
iferr!=nil{
log.Fatal(err)
}
ch:=make(chanstruct{})
//Registerastatechangelistenersothatwecouldobserverthestatechangeoftheinternalcircuitbreaker.
circuitbreaker.RegisterStateChangeListeners(&stateChangeTestListener{})

_,err=circuitbreaker.LoadRules([]*circuitbreaker.Rule{
//Statistictimespan=10s,recoveryTimeout=3s,maxErrorCount=50
{
Resource:"abc",
Strategy:circuitbreaker.ErrorCount,
RetryTimeoutMs:3000,//3s只有尝试回复
MinRequestAmount:10,//静默数
StatIntervalMs:5000,
Threshold:50,
},
})
iferr!=nil{
log.Fatal(err)
}

logging.Info("[CircuitBreakerErrorCount]SentinelGocircuitbreakingdemoisrunning.Youmayseethepass/blockmetricinthemetriclog.")
gofunc(){
for{
total++
e,b:=sentinel.Entry("abc")
ifb!=nil{
//g1blocked
totalBlock++
fmt.Println("协程熔断了")
time.Sleep(time.Duration(rand.Uint64()%20)*time.Millisecond)
}else{
totalPass++
ifrand.Uint64()%20>9{
totalErr++
//Recordcurrentinvocationaserror.
sentinel.TraceError(e,errors.New("bizerror"))
}
//g1passed
time.Sleep(time.Duration(rand.Uint64()%20+10)*time.Millisecond)
e.Exit()
}
}
}()
gofunc(){
for{
total++
e,b:=sentinel.Entry("abc")
ifb!=nil{
//g2blocked
totalBlock++
time.Sleep(time.Duration(rand.Uint64()%20)*time.Millisecond)
}else{
//g2passed
totalPass++
time.Sleep(time.Duration(rand.Uint64()%80)*time.Millisecond)
e.Exit()
}
}
}()

gofunc(){
for{
time.Sleep(time.Second)
fmt.Println(totalErr)
}
}()

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

相关推荐: C语言如何求两个数的最大公约数

这篇文章主要介绍了C语言如何求两个数的最大公约数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言免费云主机域名如何求两个数的最大公约数文章都会有所收获,下面我们一起来看看吧。代码如下:运用了辗转相除法的运算思路关于“C语言如何…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/21 12:43
下一篇 02/21 12:43

相关推荐