面试题答案
一键面试熔断和降级的概念及作用
- 熔断概念:熔断器就像电路中的保险丝,当某个服务的调用失败率达到一定阈值(如请求错误率超过80%),熔断器会“熔断”,后续一段时间内不再调用该服务,直接返回一个预设的 fallback 响应,避免大量无效请求继续调用故障服务,从而防止故障在整个系统中蔓延。
- 熔断作用:防止因单个服务故障导致级联故障,保障系统整体的可用性和稳定性。比如在电商系统中,若商品详情服务故障,熔断机制可阻止订单服务等其他服务因等待商品详情服务响应而长时间阻塞。
- 降级概念:当系统处于高负载等情况,为了保证核心功能的正常运行,将一些非核心功能或服务暂时屏蔽或返回简单的兜底数据。例如在大促期间,关闭一些次要的个性化推荐功能。
- 降级作用:确保系统在资源紧张时,核心业务功能仍然可用,提升用户体验和系统整体稳定性。
使用Hystrix实现熔断与降级机制
- 引入依赖:
在
pom.xml
中添加Hystrix依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 启用Hystrix:
在Spring Boot应用主类上添加
@EnableHystrix
注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.netflix.hystrix.contrib.javanica.annotation.EnableHystrix;
@SpringBootApplication
@EnableHystrix
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 配置熔断参数:
在
application.properties
中配置熔断相关参数,例如:
hystrix.command.default.circuitBreaker.requestVolumeThreshold=10 # 在滚动时间窗内,请求数量达到此值,熔断器才会进行错误率计算
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50 # 错误率达到此值,熔断器熔断
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000 # 熔断器熔断后,休眠此时间后尝试半开
- 编写熔断逻辑代码:
在需要熔断的服务方法上添加
@HystrixCommand
注解,并指定 fallback 方法:
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
@Service
public class ExampleService {
@HystrixCommand(fallbackMethod = "fallbackMethod")
public String exampleMethod() {
// 实际调用远程服务或其他可能失败的业务逻辑
return "Real result from remote service";
}
public String fallbackMethod() {
// 熔断后的兜底逻辑
return "Fallback result due to service failure";
}
}
使用Resilience4j实现熔断与降级机制
- 引入依赖:
在
pom.xml
中添加Resilience4j相关依赖:
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
</dependency>
- 配置熔断参数:
在
application.yml
中配置熔断相关参数,例如:
resilience4j.circuitbreaker:
instances:
exampleCircuitBreaker:
slidingWindowSize: 10
permittedNumberOfCallsInHalfOpenState: 3
failureRateThreshold: 50
waitDurationInOpenState: 5000
- 编写熔断逻辑代码:
使用
@CircuitBreaker
注解,例如:
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
@Service
public class ExampleService {
@CircuitBreaker(name = "exampleCircuitBreaker", fallbackMethod = "fallbackMethod")
public String exampleMethod() {
// 实际调用远程服务或其他可能失败的业务逻辑
return "Real result from remote service";
}
public String fallbackMethod(Exception e) {
// 熔断后的兜底逻辑
return "Fallback result due to service failure";
}
}
- 实现降级逻辑:
对于降级,可以通过
@RateLimiter
或自定义逻辑实现。例如使用@RateLimiter
进行限流从而达到降级目的:
import io.github.resilience4j.ratelimiter.annotation.RateLimiter;
import org.springframework.stereotype.Service;
@Service
public class ExampleService {
@RateLimiter(name = "exampleRateLimiter")
public String exampleMethod() {
// 业务逻辑
return "Result";
}
}
在application.yml
中配置限流参数:
resilience4j.ratelimiter:
instances:
exampleRateLimiter:
limitForPeriod: 10
limitRefreshPeriod: 10000