在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障, 进而造成整个系统不可用的情况,这种现象被称为
是一种 因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。 如下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A 不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成 了。
我们在微服务开发中如何避免产生这种雪崩效应呢? 可以使用Hystrix来实现熔断器避免
。
Hystrix [hɪst'rɪks]的中文含义是豪猪, 因其背上长满了刺,而拥有自我保护能力
能使你的系统在出现依赖服务失效的时候
了解熔断器模式请看下图:
Feign 本身支持Hystrix,不需要额外引入依赖。我们仅需在yml里开启即可
feign:
hystrix:
enabled: true
(2)我们在使用微服务时候通常需要在微服务调用者代码中创建一个client来接通被调用模块,其实我们在添加熔断器也可以配置到这个client包下并实现接口,比如qa服务调用base服务在com.zyh.qa.client包下创建impl包,包下创建熔断实现类,实现BaseClient接口
@FeignClient(value = "tensquare-base",fallback = BaseClientImpl.class)//@FeignClient("tensquare-base")使的
public interface BaseClient {
@RequestMapping(value = "label/{labelId}",method = RequestMethod.GET)
public Result findById(@PathVariable("labelId") String labelId);
//这里必须@PathVariable("labelId") 指定labelId,因为RequestMappering里的labelId是传到PathVariable中的
//这样在tensquare_base模块中才会在RequestMapper中
}
@Component //熔断器交给spring容器
public class BaseClientImpl implements BaseClient {
@Override
public Result findById(String labelId) {
return new Result(false, StatusCode.ERROR,"子服务连不上了,交给我这个熔断器了");
}
}
相比之前普通调用微服务开发,使用熔断器的意义主要是添加和使用备胎. 我们这里需要指定如果被调用的微服务断了,我们需要去哪里执行代替的服务,所以需要在原来的client类@FeignClient里添加备胎类 备胎其实方法都和client一样,目的就是当微服务断掉时候,我们也可以执行到一样的方法,不让请求落空,甚至去做别的高级处理
它可以实时的监管每个配置了熔断器的client 如果A服务调用B服务,C为B的Client接口实现类具体表现: eg: 如果AB正在正常工作,B挂了,那么会走备胎C 如果A正常使用备胎C,B突然好了,那么下一次请求将继续由B来接收处理