1.服务雪崩:
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的"四 出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应"。
2.服务熔断:
熔断机制是应对雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。 Hystrix会监控微服务间调用的状况,当失败的调用到-定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand.
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在个依赖出问题的情况下, 不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回-个符合预期的、可处理的备选响应(FallBack) ,而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至香崩。
3.如何实现微服务的熔断,本章提供两种方法实现
(两种方法都要)先加上相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
然后启动类加上注解@EnableHystrix
@SpringBootApplication
@EnableEurekaClient //Eureka客户端
@EnableFeignClients(basePackages = "com.example.huawei")
@EnableHystrix //添加熔断降级注解
public class HuaweiApplication {
public static void main(String[] args) {
SpringApplication.run(HuaweiApplication.class, args);
}
}
第一种@HystrixCommand(fallbackMethod=”方法名”)来实现,如图所示,当调用getAll方法失败后会降级调用@HystrixCommand里面的fallbackMethod中的方法,注意fallbackMethod中的方法返回必须跟调用的方法一致。
第二种是针对用feign做负载均衡的
1.yml文件中开启feign.hystrix.enabled:true
feign:
hystrix:
enabled: true
2.先建一个用来调用失败,降级返回本地方法的类,如图所示:StudentServiceFallback就是降级返回本地方法的类。
StudentServiceFallback:
@Component
public class StudentServiceFallback implements StudentService{
@Override
public List getAll() {
List list = new ArrayList();
list.add("暂停服务");
return list;
}
}
当contoller调用/list方法失败时就会返回list.add(“暂停服务”)的本地值
@RestController
public class ListContoller {
@Autowired
private StudentService studentService;
@GetMapping("/list")
public List getAll(){
return studentService.getAll();
}
}
(git地址git@gitee.com:zhu_can_admin/springcloud.git)