微服务架构应用的特点就是多服务,而服务层之间通过网络进行通信,从而支撑起整个应用系统,所以,各个微服务之间不可避免的存在耦合依赖关系。
一旦某个服务或局部业务发生了故障,会导致系统的不可用,我们知道当故障累积到一定程度就会造成系统层面的灾害,也就是级联故障
,也叫雪崩效应
。
所以微服务需要在故障累计到上限之前阻止或疏通这些故障以保证系统的稳固安全,下面就简单介绍下Hystrix
和Hystrix
在SpringCloud中的应用。
Hystrix解决依赖隔离
1. 包裹请求:
使用`HystrixCommand`包裹对依赖的调用逻辑,每个命令在独立的线程中执行,使用了设计模式中的`命令模式`
2. 跳闸机制:
当某服务的错误率超过一定阈值时,`Hystrix`可以自动或者手动跳闸,停止请求该服务一段时间
3. 资源隔离:
`Hystrix`为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程已满,则发向该依赖的请求就会被立即拒绝,而不是排队等候,从而加速失败判定
4. 监控:
`Hystrix`可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等;
5. 回退机制:
当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑,回退逻辑由开发人员自行提供,如返回一个缺省值
6. 自我修复:
断路器打开一段时间后,会自动进入“半开”状态,此时断路器可允许一个请求访问依赖的服务,若请求成功,则断路器关闭,否则断路器转为“打开”状态
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
简单使用
在启动类Application上添加:
@EnableHystrix或@EnableCircuitBreaker
修改Controller,在其中添加getUser方法,并添加熔断回调方法注解及回调方法:
@HystrixCommand(fallbackMethod = "getDefaultUser")
@RequestMapping("/getUser")
public String getUser() {
return restTemplate.getForObject("user", String.class);
}
private String getDefaultUser() {
System.out.println("熔断,默认回调函数");
return "{"name":"ld","age":"12"}";
}
基于Feign使用Hystrix
feign中已经集成了hystrix类库
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
开启hystrix
feign:
hystrix:
enabled: true #默认feign的hystrix为关闭状态
启动类添加:
@EnableFeignClients
控制层通过注入feign的接口去完成声明式调用
@FeignClient(name = "pro-user",fallback = FeignClientFallback.class)
public interface UserFeign {
@RequestMapping("/getUser")
public String getUser();
}
创建回调类
@Component
class FeignClientFallback implements UserFeign {
@Override
public String getUser() {
System.out.println("熔断,默认回调函数");
return "{"name":"admin","age":"12"}";
}
}