1. 雪崩效应
在微服务架构中,系统会根据业务来拆分成一个个的服务,多个服务之间可以相互调用。
由于网络或者自身原因,服务并不能保证完全可用。当单个服务出故障时,调用这个服务就会出现线程阻塞并且会出现级联阻塞,进而出现整个系统不可用的情况,这种现象被称为服务雪崩效应。
从别处找了一个方便理解的例子如下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。
2. 熔断器
熔断器就是为了解决雪崩效应而被提出的模型。
熔断器的原理很简单,如果它在一段时间内侦测到许多类似的错误超过一定比例(默认50%),会将异常服务的调用快速响应失败不再阻塞等待。熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。
3. Hystrix
Hystrix具有熔断器、fallback的机制。fallback是指当请求服务出现异常的时候, 可以使用fallback方法返回的值.。fallback方法的返回值一般是设置的默认值或者来自缓存。
Feign中已经依赖了Hystrix,是自带熔断器的,所以不需要在maven配置文件中再次依赖Hystrix。
注意:熔断器作用于服务调用方,即服务消费方。
4. Feign中熔断器的使用实例
继上篇文章demo2中做熔断器的添加 https://blog.csdn.net/qq_34896887/article/details/82789083
1)application.properties中设置启用熔断器
feign.hystrix.enabled=true
2)创建回调类HelloFallback,需要实现HelloRemote接口,并注入到IOC容器中
@Component
public class HelloFallback implements HelloRemote {
@Override
public String sayHello(String name) {
return "hello "+name+",System error, please contact the administrator!";
}
}
3)在消费接口HelloRemote上增加fallback
@FeignClient(name= "demo1",fallback = HelloFallback.class)
public interface HelloRemote {
@RequestMapping(value="/hello",method=RequestMethod.GET)
public String sayHello(@RequestParam(value="name") String name);
}
5. 测试
1) 启动注册中心 sbc-server
2) 启动服务消费方 demo2
3) 浏览器访问:http://localhost:8092/hello/su,由于没有启动服务提供方,会如下错误
4)启动服务提供方 demo1 ,重新访问http://localhost:8092/hello/su