1.简介
Hystix,即熔断器。
主页:https://github.com/Netflix/Hystrix/
是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。
熔断器Hystrix是容错管理工具,作用是通过隔离、控制服务从而对延迟利 故障提供更强大的容错能力,避免整个系统被拖垮。
复杂分布式架构通常都具有很多依赖,当一个应用高度耦合其他服务时非常 危险且容易导致失败,这种失败很容易伤害服务的调用者,最后导致一个接一个 的连续错误,应用本身就处在被拖垮的风险中,最后失去控制,就像在一个高流 量的网站中,某个单一的后端一旦发生延迟,将会在数秒内导致所有应用资源被 耗尽。如何处理这些问题是有关系统性能和效率的关键性问题。当在系统高峰时期,大量对微服务的调用可能会堵塞远程服务器的线程 池,如果这个线程池没有和主应用服务器的线程池隔离,就可能导致整个服 务器挂机。
2.熔断器的工作机制
熔断机制的原理很简单,像家里的电路熔断器,如果电路发生短路能立刻熔断电路,避免发生灾难。在分布式系统中应用这一模式之后,服务调用方可以自己进行判断某些服务反应慢或者存在大量超时的情况时,能够主动熔断,防止整 个系统被拖垮。不同于电路熔断只能断不能自动重连,Hystrix可以实现弹性容错,当情况好转之后,可以自动重连。这就好比魔术师把鸽子变没了容易,但是真正考验技 术的是如何把消失的鸽子再变回来。通过断路的方式,可以将后续请求直接拒绝掉,一段时间之后允许部分请求 通过,如果调用成功则回到电路闭合状态,否则继续断开。
正常工作的情况下,客户端请求调用服务API接口:
当有服务出现异常时,直接进行失败回滚,服务降级处理:
当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果。
这就好比去买鱼,平常超市买鱼会额外赠送杀鱼的服务。等到逢年过节,超时繁忙时,可能就不提供杀鱼服务了,这就是服务的降级。
系统特别繁忙时,一些次要服务暂时中断,优先保证主要服务的畅通,一切资源优先让给主要服务来使用,在双十一、618时,京东天猫都会采用这样的策略。
3.代码实战
3.1 消费端consumer-deom
// 添加依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
启动类添加注解EnableCircuitBreaker
//@EnableCircuitBreaker // 服务熔断//@EnableDiscoveryClient//@SpringBootApplication// 等于@SpringBootApplication + @EnableDiscoveryClient + @EnableCircuitBreaker@SpringCloudApplicationpublic class ConsumerApplication {.....
controller
使用HystrixCommand 声明一个失败时的回滚处理函数,当queryById3执行超时(默认是1000毫秒),就会执行fallback函数,返回错误提示。
@HystrixCommand(fallbackMethod = "queryById3Failback")@GetMapping("hy/{id}")public String queryById3(@PathVariable("id") Long id) {String url = "http://USER-SERVICE/user/" + id;return this.restTemplate.getForObject(url, String.class);}public String queryById3Failback(Long id) {return "服务器繁忙!";}
3.2 服务提供者user-service
// 添加休眠时间,来触发熔断public User queryById(Long id) {try {Thread.sleep(2000L);} catch (InterruptedException e) {e.printStackTrace();}return this.userMapper.selectByPrimaryKey(id);}
3.3 启动
hystrix异常处理的结果:
其他接口:
3.4.优化
设置Hystrix超时时间:
hystrix:command:default:execution:isolation:thread:timeoutInMillisecond: 6000 # 设置hystrix的超时时间为6000ms
