一、什么是Hystrix
1.Hystrix是一种保护机制;(豪猪)
2.Hystrix是一个组件;
3.Hystrix用于隔离访问远程服务,第三方库,防止出现级联失败;
二、Hystrix处理的问题
1.雪崩服务
微服务中服务之间调用关系错综很复杂,可能一个功能需要多个服务里面的功能协调完成,会形成一个复杂的链路;
当一个业务出现问题这个问题就会报错,所以需要处理一下;
服务支持的线程和并发数量有限,请求一直处于阻塞状态,会导致服务器上的资源耗尽,其他服务被打死;造成雪崩效应;
2.Hystrix解决雪崩的手段
1.线程隔离
1>通过空闲线程来访问资源服务,线程已满或者请求超时则会进行降级处理;
2>当服务无法访问不会出现服务崩溃,会收到一个提示;
3>请求失败但是线程不会阻塞,对其它服务不会造成威胁;
环境搭建
1.引入相对应的jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
2.开启熔断服务@SpringCloudApplication集成熔断服务;
3.编写降级逻辑
我们改造consumer,当目标服务的调用出现故障,我们希望快速失败,给用户一个友好提示。因此需要提前编写好失败时的降级处理逻辑,要使用HystixCommond来完成
@DefaultProperties(defaultFallback = "fallBack")//全类配置
public class IssueController {
@GetMapping("sta")
@HystrixCommand//降级配置
public ResultJson sta() {
return new ResultJson(StatusCode.SUCCESS);
}
public ResultJson fallBack(){
return new ResultJson(StatusCode.ERROR,"服务请求失败");
}
}
当我们需要全局配置的时间需要加上类上面加@DefaultProperties(defaultFallback = “fallBack”)
2.服务熔断
1.熔断状态
Closed:关闭状态,所有请求都正常访问。
Open:打开状态,所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分
比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于
20次。
Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器
会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,
否则继续保持打开,再次进行休眠计时
@DefaultProperties(defaultFallback = "fallBack")//全类配置
public class IssueController {
@GetMapping("sta")
@HystrixCommand//降级配置
public ResultJson sta(Long id) {
if(id==1){
throw new XException("接口请求失败");
}
return new ResultJson(StatusCode.SUCCESS);
}
public ResultJson fallBack(){
return new ResultJson(StatusCode.ERROR,"服务请求失败");
}
}
当我们输入ID=1代码结果依旧是服务请求失败,进行降级处理;
三、feign里面使用降级处理
1.在Api里面@FeignClient中加入fallbackFactory = PoliceFallbackFactory.class
2.编写对应的降级服务
@Component
public class PoliceFallbackFactory implements FallbackFactory<PoliceApi> {
private static final Logger log = LoggerFactory.getLogger(PoliceFallbackFactory.class);
@Override
public PoliceApi create(Throwable throwable) {
log.error("Police服务调用失败");
return new PoliceApi() {
@Override
public String syncVehicle(VehicleDto vehicleDto) {
ResultJson resultJson = new ResultJson(StatusCode.ERROR,"车辆推送失败");
return JSON.toJSONString(resultJson);
}
};
}
}
feign:
circuitbreaker:
enabled: true
被调用者yml加入开启服务
3.要注意以前版本feign集成Hystrix,后面升级摒弃来,需要我们添加Hystrix的jar包;