面试题答案
一键面试服务熔断理解
服务熔断类似于电路中的保险丝,当某个微服务出现故障(如频繁超时、大量错误),为防止故障扩散至整个系统,暂时切断对该服务的调用,避免更多的资源浪费在不可用的服务上,使系统能够快速失败并释放资源处理其他请求。
服务降级理解
服务降级是指当系统整体资源紧张(如高并发导致系统负载过高)或者某个服务不可用时,为了保证核心业务功能的正常运行,对一些非核心业务功能或服务进行限制或停止,优先保障核心业务。例如,在电商大促时,关闭一些非核心的个性化推荐功能,优先保证商品下单、支付等核心流程。
实际开发中设计与实现
服务熔断设计与实现
- 熔断状态设计:
- 关闭(Closed)状态:正常情况下,熔断器处于关闭状态,对服务的调用正常进行。熔断器会统计一段时间内的请求失败率等指标。
- 打开(Open)状态:当失败率达到设定阈值(如50% 的请求失败),熔断器打开,此时所有对该服务的调用直接快速失败,不再实际调用服务。同时启动一个定时器,定期尝试探测服务是否恢复。
- 半打开(Half - Open)状态:定时器到期后,熔断器进入半打开状态,此时会允许少量请求通过,去实际调用服务。如果这些请求大部分成功,说明服务已恢复,熔断器切换回关闭状态;如果请求失败率仍然很高,则回到打开状态。
- 实现工具或框架:
- Hystrix:Netflix 开源的一个容错库。通过注解方式可以很方便地对方法进行熔断保护。例如,在Spring Boot项目中引入Hystrix依赖,在需要保护的方法上添加
@HystrixCommand
注解,并配置熔断相关参数,如fallbackMethod
指定服务熔断后的降级处理方法,commandProperties
中设置circuitBreaker.requestVolumeThreshold
(熔断请求阈值)、circuitBreaker.errorThresholdPercentage
(失败率阈值)等。 - Resilience4j:轻量级的容错库,支持熔断、限流、降级等功能。以熔断为例,通过
CircuitBreaker
构建器创建熔断实例,在调用服务前通过该实例判断是否熔断,熔断时执行相应的降级逻辑。在Spring Boot项目中,可以结合Resilience4j-spring-boot-starter
进行集成,通过配置文件设置熔断参数。
- Hystrix:Netflix 开源的一个容错库。通过注解方式可以很方便地对方法进行熔断保护。例如,在Spring Boot项目中引入Hystrix依赖,在需要保护的方法上添加
服务降级设计与实现
- 降级策略设计:
- 静态数据降级:当服务不可用时,返回预先定义好的静态数据。例如在电商商品详情服务不可用时,返回一个提示“商品信息暂时无法获取,请稍后重试”的静态页面。
- 兜底方法降级:为每个可能出现问题的服务方法提供一个兜底方法,当原方法调用失败或因资源紧张被降级时,执行兜底方法。如在远程调用商品库存服务失败时,兜底方法返回一个默认的库存值(如 -1 表示库存未知)。
- 实现工具或框架:
- 上述Hystrix和Resilience4j同样支持降级:在Hystrix中通过
@HystrixCommand
注解的fallbackMethod
属性指定降级方法;在Resilience4j中,可以通过FallbackProvider
接口实现自定义的降级逻辑。 - Sentinel:阿里开源的流量控制、熔断降级工具。它通过规则配置实现服务降级,如慢调用比例降级(当慢调用比例超过设定值,进行降级)、异常比例降级等。在Spring Cloud Alibaba项目中引入Sentinel依赖,通过控制台或配置文件设置降级规则,并配置降级后的返回内容或处理逻辑。
- 上述Hystrix和Resilience4j同样支持降级:在Hystrix中通过