SpringCloud微服务组件-断路器hystrix
一.定义
断路器:断路器可以把某个独立微服务隔离起来,提高系统的容错率,避免错误的异常的调用,他可以保证一个系统服务出了问题不会导致整体系统服务的奔溃,从而提升微服务系统的稳定性。
服务熔断:当一个服务不可用或者超时又或者发生异常再或者网络拥堵的时候,为了避免整个系统雪崩效应,那么我们会切断和这个系统的通信,这个骚操作叫做服务熔断
服务降级:服务熔断后,这个服务对外不可用了,所以此时我们可以提供一个兜底的方案,也就是提供一个方法,这个方法就是弥补服务熔断后所提供的内容,这个叫做服务降级
二.配置步骤
2.1.引入pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.2 熔断-降级
2.2.1 服务提供者熔断
1 服务异常或者超时,请求过来获得兜底的方法数据,比如返回空对象或者“系统异常,请联系管理员”类似的。这个过程就是熔断该服务,不让你请求了,我会返回一个其他的方法。
// 在对应业务的controller上添加注解的熔断机制,并且写上降级方法
@HystrixCommand(fallbackMethod = "queryByIdsFallback")
// 当降级后,则调用降级代码即可
// 用于降级的方法
public GraceJSONResult queryByIdsFallback(String userIds) {
System.out.println("进入降级方法:queryByIdsFallback");
List<AppUserVO> publisherList = new ArrayList<>();
List<String> userIdList = JsonUtils.jsonToList(userIds, String.class);
for (String userId : userIdList) {
// 手动构建空对象,详情页所展示的用户信息可有可无
AppUserVO userVO = new AppUserVO();
// 添加到publisherList
publisherList.add(userVO);
}
return GraceJSONResult.ok(publisherList);
}
2 服务提供者的启动类开启熔断注解
@EnableCircuitBreaker
2.2.2 服务调用者降级
1.定义
一旦服务熔断后,那么就变得不可访问,我们可以在调用端进行降级处理,此时服务提供端可能宕机或者停机
2.配置
1,配置yml文件
feign:
hystrix:
enabled: true
2,服务调用者启动类开启hystrix注解
@EnableHystrix
3,在feign客户端上添加降级配置
@FeignClient(value = MyServiceList.SERVICE_USER, fallbackFactory = UserFactoryFallback.class)
4,实现UserFactoryFallback.class
@Component
public class UserFactoryFallback implements FallbackFactory<UserControllerApi> {
@Override
public UserControllerApi create(Throwable throwable) {
return new UserControllerApi() {
@Override
public GraceJSONResult getUserInfo(String userId) {
return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR_FEIGN);
}
@Override
public GraceJSONResult getAccountInfo(String userId) {
return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR_FEIGN);
}
@Override
public GraceJSONResult updateUserInfo(@Valid UpdateUserInfoBO updateUserInfoBO) {
return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR_FEIGN);
}
@Override
public GraceJSONResult queryByIds(String userIds) {
System.out.println("进入客户端的服务降级");
List<AppUserVO> publisherList = new ArrayList<>();
return GraceJSONResult.ok(publisherList);
}
};
}
}
注意:服务的提供方和调用方都能实现降级,但是一般来说,我们都是以调用端降级为主。因为服务提供者有可能会宕机挂掉
三.hystrix常用功能
3.1 超时的降级
我们也可以设置超时的时间。比如5秒内响应是正常的,超过5秒则调用降级的方法。
只需要添加超时属性即可:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000 # 设置hystrix超时时间,超过2秒触发降级
3.2 全局的降级
3.2.1 定义
目前虽然达道了降级的目的,但是每个业务都带上一个降级方法,那么就是2倍的代码量,太多了。
其实我只需要统一的配置一个全局降级方法即可,只有再有必要的时候才会使用局部降级。比如我们设定10个方法里8个使用全局降级,其余的2个配置他自己专有的降级方法即可。
3.2.2 配置
1.在controller上方加上
@DefaultProperties(defaultFallback = "globalFallback")
2.在原来的方法上去掉降级方法,(加上则以局部降级为主):
@HystrixCommand//(fallbackMethod = "detailFallback")
3.3 hystrix-自动触发熔断隔离与恢复
1,定义
断路器是如何工作的,看如下图
图中标识了hystrix的几个状态,首先正常情况下,断路器是处于关闭状态(CLOSED),如果此时发生异常,在超过一定百分比(阈值)的异常错误,则开启断路器(OPEN)此时发生熔断,所有请求无法访问,此时访问兜底的降级方法。等待一定时间以后,断路器会慢慢释放一个请求去检测服务是否可用,此时处于半开状态(HALF OPEN),如果请求没毛病,则关闭断路器,否则继续开启断路器。如此持续重复进行检查。
在这个过程中,第2步,没有超过阈值的异常,会触发服务端的降级方法,一旦超过,则触发客户端feign的降级方法。这里需要数值。
以上这个过程都是由hystrix来实现,那么我们只需要做好配置即可。
代码中我们可以设置一下判断,指定用户id,如果不匹配,则抛出异常,否则就是正常的
hystrix断路器的默认阈值如下参考:
一定时间(10s)内触发熔断的最小请求次数(达道次数才会触发熔断判断):20
触发熔断的请求失败率(阈值):50%
断路器开启的持续时间:5秒(关闭到半开的时间)
配置hystrix断路器
hystrix:
command:
default:
circuitBreaker: # 配置断路器
enabled: true
requestVolumeThreshold: 10 # 触发熔断最小请求次数,默认:20
sleepWindowInMilliseconds: 10000 # 熔断后过几秒后尝试半开状态(请求重试),默认:5s
errorThresholdPercentage: 50 # 触发熔断的失败率,默认:50