熔断器
雪崩效应
在微服务架构中,通常会有多个服务层调用,基本服务的故障可能会导致级联故障,从而导致整个系统不可用。这种现象被称为服务雪崩效应。服务雪崩效应是一个由于服务提供商的不可用性而逐渐扩大不可用性的过程。
如下图所示:A作为服务提供商,B为A服务消费者,C和D是B为消费者服务。A不可用导致B不可用,并将不可用放大到C和像滚雪球一样D形成了雪崩效应。
熔断器(CircuitBreaker)
熔断器的原理很简单,就像电力过载保护器一样。它可以实现快速失败。如果它在一段时间内发现许多类似的错误,它将迫使它在未来的多个呼叫快速失败,不再访问远程服务器,以防止应用程序继续尝试执行可能失败的操作,使应用程序继续执行而不等待纠正错误,或浪费CPU等到长时间超时。熔断器还可以使应用程序诊断错误是否已经修正,如果已经修正,应用程序将再次尝试调用。
熔断器模式就像一个容易导致错误操作的代理。该代理可以记录最近调用的错误次数,然后决定继续使用允许操作,或立即返回错误。 熔断器开关相互转换的逻辑如下图所示:
熔断器是保护服务可用性高的最后一道防线。
Hystrix特性
断路器很容易理解, 当Hystrix Command要求后端服务失败超过一定比例(默认50%), 断路器切换到开路状态(Open). 此时,所有请求将直接失败,不会发送到后端服务. 断路器在开路一段时间后保持(默认5秒), 自动切换到半开路状态(HALF-OPEN). 此时将判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则,将重新切换到开路状态(OPEN). Hystrix断路器就像我们家电路里的保险丝, 一旦后端服务不可用, 断路器将直接切断要求链, 避免发送大量无效请求影响系统吞吐量, 断路器具有自我检测和恢复的能力.
Fallback相当于降级操作. 查询操作, 我们可以实现一个fallback方法, 请求后端服务异常时, 可以使用fallback方法返回的值. fallback该方法的返回值通常是默认值或缓存.
在Hystrix中, 资源隔离主要通过线程池实现. 通常在使用时,我们会根据调用的远程服务划分多个线程池. 例如,调用产品务Command放入A线程池, 调用账户服务Command放入B线程池. 这样做的主要优点是运行环境被隔离了. 这样,即使调用服务的代码存在bug或者当你的线程池因为其他原因耗尽时, 不会对系统的其他服务造成影响. 但成本是维护多个线程池会给系统带来额外的性能费用. 如果客户端代码对性能有严格的要求,并且确信他们呼叫服务不会有问题, 可以使用Hystrix的信号模式(Semaphores)来隔离资源.
Feign Hystrix
因为熔断只作用于服务调用的这一端,我们只需要根据示例代码进行更改spring-cloud-consumer可以使用项目相关代码。Feign已经依赖了Hystrix所以在maven配置不需要做任何改变。
示例代码链接:http://www.ityouknow.com/springcloud/2017/05/12/eureka-provider-constomer.html
1、配置文件
application.properties添加此条:
feign.hystrix.enabled=true
2.创建回调类
创建HelloRemoteHystrix类继承与HelloRemote回调的方法
@Component public class HelloRemoteHystrix implements HelloRemote{ @Override public String hello(@RequestParam(value = "name") String name) { return "hello" name ", this messge send failed "; } }
3、添加fallback属性
在HelloRemote
类添加指定fallback类,服务熔断时返回fallback类中的内容。
@FeignClient(name= "spring-cloud-producer",fallback = HelloRemoteHystrix.class) public interface HelloRemote { @RequestMapping(value = "/hello") public String hello(@RequestParam(value = "name") String name); }
这就是改变点的很简单。
4、测试
让我们来测试一下效果。
依次启动spring-cloud-eureka、spring-cloud-producer、spring-cloud-consumer三个项目。
输入浏览器:http://localhost:9001/hello/neo
返回:hello neo,this is first messge
说明加入熔断相关信息后,不影响正常访问。接下来,我们手动停止spring-cloud-producer再次测试项目:
输入浏览器:http://localhost:9001/hello/neo
返回:hello neo, this messge send failed
熔断返回结果,熔断成功。