Hystix,英文意思是豪猪,全身是刺,看起来就不好惹,是一种保护机制。
Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。
就是当服务没有响应的时候,能快速给用户响应
雪崩问题
微服务中,服务间调用关系错综复杂,一个请求,可能需要调用多个微服务接口才能实现,多个微服务可能还会调用别的服务,会形成非常复杂的调用链路.
如果一个服务出现了问题,请求会阻塞, 用户不会得到响应,tomcat不会释放这个线程 会一致堆积下去越来越多, 我们知道服务器的并发和线程有限, 一直堆积下去 服务器的资源就会耗尽,从而导致其他的微服务也都不可用,形成雪崩效应.
Hystix解决雪崩问题的手段主要是服务降级
1.线程隔离
2.服务熔断
1.线程隔离
Hystrix为每个服务调配一个小的线程池,如果线程池已满,调用这个服务将被立即拒绝.
用户的请求不再直接访问服务,而是而是通过分配的线程池里面的空闲线程来访问服务,如果线程池已满或者请求超时, 则会进行降级处理 给用户返回一个友好的信息,这样就不会造成阻塞,更不会无休止的等待或者看到系统崩溃.
**当目标服务的调用出现故障,我们希望快速失败,
给用户一个友好提示。因此需要提前编写好失败时的降级处理逻辑,
要使用HystixCommond来完成:**
@GetMapping("{id}")
@HystrixCommand(fallbackMethod = "queryByIdFallBack")
public String queryById(@PathVariable("id") Long id){
String url = "http://user-service/user/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
public String queryByIdFallBack(Long id){
log.error("查询用户信息失败,id:{}", id);
return "对不起,网络太拥挤了!";
}
2.服务熔断
熔断器的三种状态 :
闭合 : 闭合时 一切请求都可以正常访问不会受到任何影响,但是他会统计服务的异常情况,默认统计20次请求, 如果超过50%异常,他会认为这个服务有问题…就会从闭合状态到打开状态, 一旦打开状态 一切请求都会被阻塞 .
打开 : 一旦打开状态 这个服务的一切请求都会被阻塞,他会启用定时器默认休眠5秒,这五秒内一切请求都会被阻塞
半开 : 休眠时间过后, 他会从打开状态 到 半开, 在半开状态时 他会 允许一个请求通过,如果可以正常访问这个服务 他就会闭合熔断 一切请求就都可以正常访问. 如果这个请求还是不行, 他就会再到 打开熔断的状态 重新计时5秒再到半开状态 一直循环.
再加上@HystrixCommand注解的那一刻 熔断器已经生效了…所以不需要实现