啥?学习微服务,你竟然不知道什么是熔断,降级和限流

本文探讨了在复杂Web应用中,微服务架构如何通过熔断、降级和限流来保障系统可用性。熔断处理接口故障,降级应对突发流量,限流则控制大流量。它们都是在资源有限时避免系统崩溃的策略。

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

现在的web应用,基本上都会采用微服务架构,复杂的web应用系统中,会有几个甚至十几个微服务,应用系统在对外提供服务的背后,是很多个微服务相互依赖,相互协作完成的。每个微服务负责一个或多个功能的实现,通过对外暴露接口的形式,来实现自己的价值。正常情况下,多个微服务正常运行,在自己的工作岗位上,尽职尽责,对依赖自己的调用方,提供服务。但是,随着系统服务周期的增长,总会有某个,或者某几个服务出现不可用的情况,当一个服务出现了不可用,不仅自身无法对外提供服务,依赖自己的服务也会受到影响,变得不可用,一个服务的不可用,随着依赖关系的扩展,会导致更多的服务不可用,如果没有人工介入,可能会导致整个系统都会变得不可用。

在业务系统开发的过程中,要保证功能需求(这个是最基本的),非功能需求也要一定满足。否则,出现上了上面的问题,整个系统都不可用了,那么开发的功能需求,也就没有意义了。系统的可用性,是一个系统非功能需求中比较重要的指标。

在微服务系统架构中,保障系统可用性的常用手段,有以下三个:熔断,降级和限流。整体来说,这三者都是采用通过牺牲系统吞吐量,来防止问题扩大化的一种手段,通过人为让系统部分不可用的手段,来避免系统整体不可用的灾难,是一种丢卒保车,断尾求生的做法,三者都是为了完成这一目的,只不过实现过程中,侧重点不同而已。对这三者有了一个整体认识之后,我们再来看一下,三者的侧重点分别都是什么。

1)什么是熔断

熔断主要针对具体某个接口出现问题时,对这个接口采用的临时方案,它站在接口或者服务的层面来考虑问题。防止因为某个接口出现问题,导致问题蔓延,直至整个系统不可用。例如:某个接口的提供方宕机,导致接口调用方频繁超时,调用方的上游受到影响,进而也会超时,最终整个链路都会变得超时,如果超时时间很长的话,会导致客户端系统资源浪费(一些池化的资源,长时间得不到释放)。此时可以在接口的调用方进行对该接口的熔断,具体做法,可以直接返回一个默认值,防止频繁的调用超时。同时通过不断的对该接口进行可用性探测,当检测到该接口可用时,对熔断逻辑进行撤销,具体可以参考hystrix

2)什么是降级

降级是系统应对突发流量的解决方案,它站在系统层面来考虑问题,目的是为了保证整个系统的可用性。因为受系统自身资源的限制,可以处理的流量是是有限的,不能对突发流量进行完全处理,那么此时就应该对流量进行有选择的处理,让系统只处理优先级高的流量,优先级低的流量不进行处理,直接返回默认值(或者其他处理策略),也就是对部分低优先级流量进行舍弃,例如,双十一期间,很多电商网站的评论,收藏功能变得不可用,这里就是系统为了保证网站核心功能可用,对评论和收藏功能进行了降级,将系统资源用在核心业务上,正所谓"好钢用在刀刃上"。

但是,这种方案为什么叫做"降级"呢?好像没有体现出"降级"的语义。其实降级,是站在整个系统维度来说的,举例来说:系统正常情况下,可以对外提供10个接口服务,在降级的情况下,只能对外提供5个接口服务,那么此时的系统,就是有"瑕疵"的系统,能够完整提供服务的系统,我们给系统打5星,现在系统中一部分功能不可用了,那么此时系统只能打3星,系统的"级别"有所下降了。

3)什么是限流

限流和降级所做的事情相似,也是站在系统层面来考虑问题,都是在系统遇到突发大流量所做的应急方案。为了保证系统不被大流量冲垮,降级所做的事情是对流量进行有选择的处理,让系统处理总流量中的一部分。这里的有选择,主要是按照流量的优先级进行选择的。而限流则是通过对流量进行采样,例如1000个请求,通过80%采样后,系统只处理其中的800个,剩下的200个,通过限流策略进行过滤,这里的过滤更强调无差别的过滤。

总体来说,熔断,降级和限流,是系统面对突发流量,限于自身系统资源不足的一种"无奈"的做法,是一种兜底方案,系统设计的时候一定要考虑这些兜底方案,但是最好不要用上,因为它会降低系统的可用性,所以在遇到大流量前,一定要做好容量评估。

 

 

### 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、付费专栏及课程。

余额充值