服务熔断和降级,别傻傻分不清!

服务熔断和降级,别傻傻分不清!

目录

一、什么是服务熔断?二、什么是服务降级?三、熔断和降级的区别?四、熔断降级方案实现五、如何选择熔断降级方案?六、总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

🌟了解 RPC 请看 : RPC 详解,小白也能听懂!

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力 ✨更多文章请看个人主页: 码熔burning

一、什么是服务熔断?

服务熔断是一种防止系统过载的保护机制。🔌 当一个服务因为故障(如网络问题、服务不可用等)导致大量请求失败时,熔断器会“断开”这个服务,阻止更多的请求发送到这个服务,从而保护系统不被进一步的故障影响。

解释:

想象一下,你家的电路如果短路了,保险丝会熔断,切断电源,防止火灾。🔥 服务熔断也是类似的,当一个服务出现问题,熔断器会“切断”这个服务,防止问题扩散。

为什么需要熔断?

防止雪崩效应: 如果一个服务挂了💀,调用它的服务也会跟着挂,然后这些服务又会影响其他服务,最终导致整个系统瘫痪,这就是雪崩效应。熔断可以阻止这种连锁反应。快速失败: 熔断后,请求不会一直等待超时⏳,而是立即返回错误,让调用方知道服务不可用,避免浪费资源。服务自愈: 熔断器不会一直处于“跳闸”状态。它会定期尝试恢复服务,如果服务恢复正常,熔断器会自动关闭,恢复正常调用。

熔断器的三种状态:

Closed(关闭): 正常状态,所有请求都转发给目标服务。✅Open(开启): 熔断状态,所有请求都被拦截,直接返回错误。❌Half-Open(半开): 尝试恢复状态,允许少量请求通过,如果请求成功,则关闭熔断器;如果请求失败,则保持开启状态。⚠️

二、什么是服务降级?

服务降级是指在系统压力过大或某些服务不可用时,主动关闭一些非核心功能,保证核心功能的正常运行。比如,电商网站在大促时,可能会关闭评论功能,确保下单和支付功能正常。

解释:

以餐厅为例,如果顾客太多,厨房忙不过来 🥵,你可以决定暂时不提供甜点 🍰,只提供主菜 🍲。这样虽然顾客的选择少了,但至少能保证他们能吃到主菜,不至于饿肚子 😋

为什么需要降级?

保证核心功能: 即使某些服务不可用,也要保证用户可以完成最基本的操作,比如浏览商品、下单等。提升用户体验: 避免用户看到大量的错误页面,提供更友好的提示。

降级的例子:

电商网站: 当商品评论服务不可用时,可以暂时隐藏评论功能,让用户可以继续浏览商品和下单。社交网站: 当用户头像上传服务不可用时,可以使用默认头像。

三、熔断和降级的区别?

熔断: 是一种保护机制🛡️,防止故障蔓延,快速失败。降级: 是一种备用方案💡,保证核心功能可用,提升用户体验。

关系:

熔断是降级的前提,当服务熔断后,可以触发降级逻辑。降级是熔断后的处理方式之一。

四、熔断降级方案实现

以下是一些常见的熔断降级方案实现:

Hystrix(Netflix): (已停止维护,不推荐新项目使用)

Sentinel(阿里巴巴):

特点: 阿里巴巴开源的流量控制、熔断降级组件,功能丰富,支持多种限流策略。原理: 通过滑动窗口统计请求的成功率和异常率,当满足熔断条件时,开启熔断器。降级: 支持多种降级策略,比如慢调用比例、异常比例、异常数等。优点: 功能强大,社区活跃,支持多种协议。 Resilience4j:

Spring Cloud CircuitBreaker:

Istio(Service Mesh):

代码示例(Sentinel):

import com.alibaba.csp.sentinel.annotation.SentinelResource;

import com.alibaba.csp.sentinel.slots.block.BlockException;

import org.springframework.stereotype.Service;

@Service

public class MyService {

@SentinelResource(value = "myService", fallback = "fallback", blockHandler = "blockHandler")

public String callExternalService() {

// 调用外部服务

// 如果调用失败,或者被限流/降级,会触发 fallback 或 blockHandler

if (Math.random() < 0.5) { // 模拟50%的失败率

throw new RuntimeException("External service failed");

}

return "Success";

}

// 降级方法

public String fallback(Throwable t) {

System.out.println("Fallback triggered: " + t.getMessage());

return "Fallback response";

}

// 限流/降级处理方法

public String blockHandler(BlockException e) {

System.out.println("Blocked by Sentinel: " + e.getMessage());

return "Blocked response";

}

}

解释:

@SentinelResource(value = "myService", fallback = "fallback", blockHandler = "blockHandler"):表示callExternalService方法需要Sentinel保护。

value = "myService":资源名称,用于在Sentinel控制台中配置规则。fallback = "fallback":降级方法,当方法抛出Throwable时,会执行该方法。blockHandler = "blockHandler":限流/降级处理方法,当方法被限流或降级时,会执行该方法。 callExternalService:模拟调用外部服务,如果调用失败,会抛出异常。fallback:降级方法,当callExternalService抛出Throwable时,会执行该方法,返回备用结果。blockHandler:限流/降级处理方法,当callExternalService被限流或降级时,会执行该方法,返回备用结果。

注意:

需要引入Sentinel的依赖:

com.alibaba.csp

sentinel-spring-boot-starter

需要在Sentinel控制台中配置相应的规则(例如:流控规则、降级规则)。

五、如何选择熔断降级方案?

选择熔断降级方案需要考虑以下因素:

技术栈: 选择与你的技术栈兼容的方案。功能需求: 根据你的业务需求选择功能合适的方案。易用性: 选择易于使用和维护的方案。性能: 选择性能良好的方案。社区活跃度: 选择社区活跃、文档完善的方案。

六、总结

服务熔断和服务降级是分布式系统中重要的容错机制,可以提高系统的可用性和稳定性。选择合适的熔断降级方案,并合理配置,可以有效地防止故障蔓延,提升用户体验。🎉

希望这篇文章能够帮助你理解服务熔断和服务降级!😊