1. 服务熔断和服务降级
服务雪崩:在微服务架构中服务之间会相互调用和依赖,如果某个服务发生故障,可能会导致多个服务故障,从而导致整个系统故障
解决服务雪崩的方式:
-
服务熔断
当服务出现不可用或响应超时时,为了防止整个系统出现雪崩, 暂时停止对该服务的调用,直接返回一个结果,快速释放资源。
如果检测到目标服务情况好转,则恢复对目标服务的调用。
-
服务降级
为了防止核心业务功能出现负荷过载或者响应慢的问题,将非核心服务进行降级,暂时性的关闭或延迟使用,保证核心服务的正常运行
2. 简介
Hystrix就是用来实现服务熔断的,其实就是一种机制,当某个服务不可用时,可以阻断故障的传播,称为断路器或熔断器
- Hystrix负责监控服务之间的调用情况,当出现连续多次调用失败的情况时会进行熔断保护
- 该服务的断路器就会打开,直接返回一个由开发者设置的fallback(退路)信息
- Hystrix会定期再次检查故障的服务,如果故障服务恢复,将继续使用服务
3. 用法
断路器是安装在服务消费者上的,我们需要做的是在服务消费者上开启断路器并配置。
在Feign中使用Hystrix是非常简单的,已经包含了整合Hystrix的依赖
步骤:
-
编辑application.yml文件,启用断路器
# 启用断路器 feign: hystrix: enabled: true
-
设置fallback信息
在@FeignClient注解中指定fallback参数
// 调用的服务名,到Eureka中寻找对应的微服务,找到的是:微服务的ip:port @FeignClient(value = "user-provider",fallback = UserServiceFallback.class) public interface UserService {
创建UserService接口的实现类,并配置返回的信息
@Service
public class UserServiceFallback implements UserService {
@Override
public ResponeResult userList() {
return ResponeResult.createServerErrorResult();
}
@Override
public ResponeResult user(Integer id) {
return ResponeResult.createServerErrorResult();
}
@Override
public ResponeResult addForm(User user) {
return ResponeResult.createServerErrorResult();
}
@Override
public ResponeResult addJson(User user) {
return ResponeResult.createServerErrorResult();
}
@Override
public ResponeResult delete(Integer id) {
return ResponeResult.createServerErrorResult();
}
@Override
public ResponeResult update(User user) {
return ResponeResult.createServerErrorResult();
}
}
- 测试
当服务提供者不可用或出现异常时,会暂时停止对该服务的调用。修改生产者获取列表接口的实现,使它报出异常。
@GetMapping("/{id}")
public ResponeResult user(@PathVariable("id")Integer id){
int a = 1/0;
return ResponeResult.createSuccessResult(userMap.get(id));
}
调用消费者接口访问生产者接口,经过断点调试,会 发现接口最终访问UserServiceFallback
中的实现,并输出。