雪崩效应
- 在微服务系统中,一个请求会调用多个服务来完成,服务可用的情况下,当某一个服务出现网络延迟或者故障时,请求就会被阻塞,等待故障服务响应。
- 在高并发的情况下,单个服务的延迟导致整个请求延迟或阻塞,可能在几秒就使整个服务负载饱和
- 雪崩效应: 单个点服务的请求故障导致用户请求阻塞,最终导致整个服务资源耗尽。由于服务依赖性,导致依赖该故障服务的其他服务也处于阻塞,最终导致其他服务资源耗尽,不可用。从而导致整个服务系统都不可用。
熔断器
- 作用:防止雪崩效应
- 原理:服务调用过程中,发现请求延迟或者阻塞,等待一定时间,判定为超时。并且根据设定的进行重试,重试次数都超时或者失败。则进行熔断,在一定时间内不在请求该服务,并预设返回默认值。保持请求逻辑,以及链路服务可用。
Hystrix
- Hystrix是NetFlix公司开源项目,提供熔断器的功能,能够阻止分布式系统中出现联动故障。
- Hystrix是通过隔离服务的访问点组织联动故障,并提供故障的解决方案,从而提高整个分布式系统的弹性
工作机制
- 在一定的时间内,API接口的调用失败次数小于设定的阀值时,熔断器处于关闭状态,该API接口正常提供服务
- 当API请求失败超过阀值,Hystrix判定服务故障,打开熔断器,处于打开状态;请求该API接口会执行快速失败的逻辑(fallback逻辑),请求的线程不会被阻塞
- 打开状态的熔断器,一段时间之后会处于半打开状态,并将一定量的请求执行正常逻辑,另一部分执行fallback逻辑。若执行正常逻辑请求失败,则熔断器继续打开,若成功,则熔断器关闭。具有自我修复能力。
使用Feign Hystrix
- 因为熔断只是作用在服务调用这一端,因此只需要在Consumer 端做配置
jar包引入
- pom文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 由于Feign中已经依赖了Hystrix,不需要引入额外的Hystrix包
application.xml 配置文件
- feign.hystrix.enabled=true
spring.application.name=spring-cloud-hystrix-consumer
server.port=8080
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
# 开启熔断
feign.hystrix.enabled=true
增加API熔断
- 增加熔断处理类(fallback),实现Feign客户端接口,方法名同API名
/**
* Feign 结合Hystrix 熔断器。如果熔断回调该方法
*
* @author yanbin
* @since 2019/8/27 10:10
*/
@Component
public class IndexRemoteFallback implements IndexRemote {
@Override
public String hello(@RequestParam(value = "name") String name) {
return "Hystrix fallback! name: " + name;
}
}
- @FeignClient 注解增加:fallback属性,指定定义好的类
@FeignClient(name = "spring-cloud-eureka-provider", fallback = IndexRemoteFallback.class)
public interface IndexRemote {
@RequestMapping(value = "/hello")
String hello(@RequestParam(value = "name") String name);
}
配置启动类
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class HystrixConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixConsumerApplication.class, args);
}
}
请求入口
@RestController
@RequestMapping("/")
public class ConsumerController {
@Autowired
private IndexRemote indexRemote;
@RequestMapping("/hi/{name}")
public String hi(@PathVariable("name") String name) {
return indexRemote.hello(name);
}
}
调试
- 启动Eureka Server Provider Consumer
正常请求
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL4gjN3EzMyETMzATOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
熔断
- 停掉Provider 返回Fallback。Hystrix熔断器起作用了
微服务--Hystrix熔断器 - 重启Provider,恢复服务
微服务--Hystrix熔断器