关于Hystrix
服务熔断:
概念:服务消费链上,下游服务因访问压力过大而出现响应变慢或失败不可用,上游服务为了保护系统整体的可用性(避免无效重试及长时等待等情况),可以暂时切断对下游服务的调用,直接快速返回fallback的默认值
熔断关闭状态(Closed):服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制。
熔断开启状态(Open):在固定时间窗口内(Hystrix默认是10秒),接口调用出错比率达到一个阈值(Hystrix默认为50%),会进入熔断开启状态。进入熔断状态后,后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法。
半熔断(半开启)状态(Half-Open):在进入熔断开启状态一段时间之后(Hystrix默认是5秒),熔断器会进入半熔断状态。所谓半熔断就是尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断关闭状态。
服务降级:
概念:尽可能的把系统资源让给优先级高的服务。资源有限,而请求是无限的。
如何使用?
1.Feign集成了Hystrix,直接开启服务
引入spring-cloud-starter-openfeign
feign.hystrix.enabled=true
2.配置回滚服务
@FeignClient(value = "cloud-provider", fallback = FindServiceImpl.class)
//指出是哪个服务
public interface FindService {
@GetMapping("/cloud/find/{id}")
//这个路径一定要和provider的路径保持一致
String find(@PathVariable("id") long id);
}
@Component
class FindServiceImpl implements FindService {
public String find(long id) {
return "原服务失效";
}
}
3.服务提供者provide controller抛出异常
@GetMapping("/cloud/find/{id}")
public String m1(@PathVariable("id") Long id) throws Exception {
if (System.currentTimeMillis() % 2 == 0) {
throw new Exception("服务出错,去返回回调方法内容吧");
}
return "8001" + iCloudTestService.getById(id).toString();
}