面试题答案
一键面试服务熔断实现方式
- 引入依赖:在
pom.xml
中添加spring-cloud-starter-netflix-hystrix
依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 开启熔断功能:在启动类上添加
@EnableHystrix
注解。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.netflix.hystrix.contrib.javanica.annotation.EnableHystrix;
@SpringBootApplication
@EnableHystrix
public class YourApplication {
public static void main(String[] args) {
SpringApplication.run(YourApplication.class, args);
}
}
- 定义熔断方法:在需要熔断保护的方法上添加
@HystrixCommand
注解,并指定熔断后的降级方法。
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
@Service
public class YourService {
@HystrixCommand(fallbackMethod = "fallbackMethod")
public String yourMethod() {
// 正常业务逻辑
return "正常响应";
}
public String fallbackMethod() {
// 熔断后的降级处理逻辑
return "服务暂时不可用,请稍后重试";
}
}
服务降级实现方式
- 全局降级配置:创建一个实现
FallbackFactory
接口的类,用于生成全局降级逻辑。
import com.netflix.hystrix.contrib.javanica.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class YourFallbackFactory implements FallbackFactory<YourService> {
@Override
public YourService create(Throwable cause) {
return () -> "全局降级处理,服务不可用";
}
}
然后在需要全局降级的方法上使用@HystrixCommand
注解并指定fallbackFactory
。
@HystrixCommand(fallbackFactory = YourFallbackFactory.class)
public String yourMethod() {
// 正常业务逻辑
return "正常响应";
}
- 局部降级:与熔断中定义的
fallbackMethod
类似,在@HystrixCommand
注解中指定具体的方法作为降级逻辑。
服务熔断和降级的区别
- 触发机制
- 熔断:通常是由于某个服务调用持续失败或响应时间过长,达到一定阈值后触发。熔断就像电路中的保险丝,当电流过大(请求失败过多)时自动切断电路(停止调用故障服务),防止故障扩散。
- 降级:更多是基于系统整体的负荷情况,比如流量过大、资源不足等,主动放弃一些非核心服务的正常功能,以保证核心服务的可用性。可以手动触发,比如运维人员根据监控数据决定对某些服务进行降级。
- 恢复策略
- 熔断:触发熔断后,会进入一个熔断状态,在一段时间内(熔断时间窗)不会再尝试调用故障服务。当熔断时间窗结束后,会进入半熔断状态,尝试少量调用,如果调用成功则恢复正常,否则继续熔断。
- 降级:降级一般是由人工或系统自动调整(如根据流量、资源使用率等指标),当系统负荷降低或故障排除后,手动或自动恢复正常服务。
- 作用层面
- 熔断:主要保护自身服务不被下游故障服务拖垮,防止级联故障。
- 降级:更侧重于从整个系统层面进行资源调配和服务可用性保障,在资源紧张时牺牲部分非关键功能,保证核心业务。