(二)微服务保护——限流规则

本文详细介绍了Sentinel微服务保护中的限流规则,包括快速入门的簇点链路概念,流控模式的直接、关联和链路三种类型,以及不同流控效果如快速失败、预热模式和排队等待。此外,还讨论了热点参数限流的应用。通过这些规则,可以有效地管理和控制服务的流量,保障系统的稳定性和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微服务保护——限流规则

一、快速入门:

1、簇点链路:

簇点链路:就是项目内的调用链路,链路中被监控的每个接口就是一个资源。
默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。
流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

二、流控模式:

(一)三种模式:

在添加限流规则时,点击高级选项,可以选择三种流控模式:
1、直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
2、关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
3、链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
在这里插入图片描述

(二)关联模式:

1、例子:

AB两个资源,A触发了阈值,对B进行限流;

2、 使用场景:

比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。

满足下面条件可以使用关联模式:
1、两个有竞争关系的资源
2、一个优先级较高,一个优先级较低

在这里插入图片描述当/write资源访问量触发阈值时,就会对/read资源限流,避免影响/write资源

3、案例:

给谁限流,资源名就写谁。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

(三)链路模式:

1、例子:

统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流;也就是说:ABC三个服务请求都要访问D的请求,只统计A服务到本资源的请求,触发阈值则对A的请求限流。
在这里插入图片描述

2、案例

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

三、流控效果:

(一)流控效果的种类

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:

1、快速失败:

达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。

2、warm up预热模式:

对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。

3、排队等待:

让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长,否则也会抛出异常,拒绝这个请求。

(二)预热模式:

主要是为了避免冷启动那一刻过高的并发导致服务故障。所以让阈值逐步增大,而不是一下子就达到阈值的最大值。
在这里插入图片描述

(三)排队等待:

在这里插入图片描述对于不稳定的访问请求,使用排队等待模式则可以让请求稳定地被放行。比如在两秒内,第一秒没有请求,第二秒突然来了10个请求,这个时候达到阈值,它会把这写请求放到一个队列中,然后队列每隔200ms就放行一个请求。这就能让波浪形的QPS变成平缓形的QPS。可以起到流量整形的效果。

四、热点参数限流:

(一)理解:

在这里插入图片描述在这里插入图片描述注意点:热点参数限流对默认的SpringMVC资源无效,需要给资源添加注解@SentinelResource(“资源名称”)
在这里插入图片描述

### Go语言中微服务的熔断、降级和限流实现方法 #### 熔断机制 在Go语言中,可以利用第三方库 `hystrix-go` 来实现熔断机制。该库提供了类似于Java中的Hystrix的功能,能够检测服务调用失败的情况并触发熔断逻辑。当某个服务在一个固定的时间窗口内连续多次发生错误或者响应超时时,熔断器会被打开,在此状态下所有的请求都会被立即拒绝而不会真正发送到目标服务上[^4]。 下面是一个简单的例子展示如何使用 hystrix-go 进行基本配置: ```go package main import ( "fmt" "time" hystrix "github.com/afex/hystrix-go/hystrix" ) func main() { hystrix.ConfigureCommand("example", hystrix.CommandConfig{ Timeout: 100, // 超时时间为100ms MaxConcurrentRequests: 5, // 并发请求数量上限为5 ErrorPercentThreshold: 50, // 错误百分比超过50%则启动熔断 }) go func() { for { err := hystrix.Do("example", func() error { // 正常业务逻辑 fmt.Println("Executing command...") time.Sleep(2 * time.Second) return nil }, func(err error) error { // fallback函数 fmt.Println("Fallback triggered:", err) return nil }) if err != nil { fmt.Println("Error executing command:", err) } } }() select {} } ``` 这段代码展示了通过设置命令名称 `"example"` 配置了一个具有特定参数的 Hystrix 命令,并定义了正常处理路径与回退(fallback)路径。 #### 降级策略 对于服务降级来说,通常是在系统负载过高或依赖的服务不可用的情况下采取的一种措施。上述示例中的fallback部分即实现了这一目的——一旦主操作失败,则执行备用计划来返回默认数据或其他预设行为[^3]。 另外还可以借助像 Sentinel 这样的工具来进行更复杂的控制,它不仅可以用于 Java 应用程序,也支持其他编程环境下的流量防护工作。例如可以通过设定规则限制某些条件下的访问次数从而减少不必要的消耗;同时还能实时查看各项性能指标以便及时调整策略[^5]。 #### 请求限流 关于限流方面,除了刚才提到过的 sentinel 可以外部管理外,也可以自己编写相应的中间件完成这项任务。比如采用令牌桶算法(Token Bucket Algorithm),每次接收到新请求前先检查是否有足够的token可用再决定是否允许继续前进。 这里给出一个简易版基于goroutine同步原语mutex锁加计数器形式模拟每秒最多接受N次请求的例子: ```go package ratelimiter var maxRate int = 10 // 每秒钟最大速率 var currentTokens float64 = float64(maxRate) var mutex sync.Mutex // Refill tokens every second. func refillTicker() { ticker := time.NewTicker(time.Second) defer ticker.Stop() for range ticker.C { mutex.Lock() currentTokens += float64(maxRate) if currentTokens > float64(maxRate){ currentTokens = float64(maxRate) } mutex.Unlock() } } // Try to consume one token from the bucket. func ConsumeToken() bool { mutex.Lock() defer mutex.Unlock() if currentTokens >= 1.0 { currentTokens -= 1.0 return true } return false } func init(){ refillTicker() } ``` 以上片段创建了一个全局变量表示当前剩余代币数量(currentTokens),并通过定时补充的方式维持一定水平。每当有新的HTTP请求到达服务器端口处时便尝试扣除一枚代币,如果成功说明此次查询合法可被执行下去;反之则应给予适当提示告知用户稍后再试。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值