Feign+Hystrix 服务熔断及消费降级
作者xfchen8
今天在项目中尝试了Feign+Hystrix 服务熔断及消费降级。项目采用springCloud微服务架构,主服务调用其他服务接口,在调用失败或等待时间过长时,进入熔断策略。
中间件采用nacos+Feign+Hystrix
以下为测试代码。
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
微服务接口1
@FeignClient(value = "pomp-sap", fallbackFactory = SapFeignServiceFallback.class)
//@FeignClient(value = "pomp-sap", fallback = SapFeignServiceFallback.class)
public interface ISapFeignService {
/**
* 调用sap接口更新
*
* @param
* @return 调用sap接口更新
* @author xfchen8
* @date 2019/9/23 10:05
*/
@PostMapping("/sap/update")
ResponseResult update(@RequestParam("projectId") String projectId, @RequestParam("version") String version, @RequestParam("isCheck") boolean isCheck, @RequestParam("status") String status);
}
实现类1
@Component
public class SapFeignServiceFallback implements FallbackFactory<ISapFeignService> {
private Logger logger = LoggerFactory.getLogger(SapFeignServiceFallback.class);
@Override
public ISapFeignService create(Throwable cause) {
return new ISapFeignService() {
@Override
public ResponseResult update(String projectId, String version, boolean isCheck, String status) {
logger.error(ResultCodeEnum.SAP_INVOKING_FAIL.getCode().toString() + ResultCodeEnum.SAP_INVOKING_FAIL.getDesc());
return RetResponse.makeErrRsp("调用sap接口失败,进入熔断并降级");
}
};
}
微服务接口2
@FeignClient(value = "pomp-sap", fallback = SapFeignServiceFallback.class)
public interface ISapFeignService {
/**
* 调用sap接口更新
*
* @param
* @return 调用sap接口更新
* @author xfchen8
* @date 2019/9/23 10:05
*/
@PostMapping("/sap/update")
ResponseResult update(@RequestParam("projectId") String projectId, @RequestParam("version") String version, @RequestParam("isCheck") boolean isCheck, @RequestParam("status") String status);
}
实现类2
@Component
public class SapFeignServiceFallback implements ISapFeignService {
private Logger logger = LoggerFactory.getLogger(SapFeignServiceFallback.class);
@Override
public ResponseResult update(String projectId, String version, boolean isCheck, String status) {
logger.error(ResultCodeEnum.SAP_INVOKING_FAIL.getCode().toString() + ResultCodeEnum.SAP_INVOKING_FAIL.getDesc());
return RetResponse.makeErrRsp("调用sap接口失败");
}
}
可以看出第二种写法简洁一些,熔断接口直接使用fallback 指定实现类即可
application.yml配置
spring:
profiles:
active: @spring.profiles.active@
cloud:
loadbalancer:
retry:
enabled: false
ribbon:
ReadTimeout: 999999
ConnectTimeout: 999999
#关闭nacos心跳日志
logging:
level:
com.alibaba.nacos.client.naming: error
com.iflytek.pomp.sap.dao: debug
因application.yml中未开启熔断
feign:
hystrix:
enabled: true
熔断默认不开启,如微服务调用失败会报错找不到调用服务,达不到熔断降级目的
Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: xxx
调整后application.yml配置
- spring:
profiles:
active: @spring.profiles.active@
cloud:
loadbalancer:
retry:
enabled: false
feign:
hystrix:
enabled: true
ribbon:
ReadTimeout: 999999
ConnectTimeout: 999999
#关闭nacos心跳日志
logging:
level:
com.alibaba.nacos.client.naming: error
com.iflytek.pomp.sap.dao: debug
启动类加入注解
@EnableHystrix
启动项目进行测试
启动报错,找不到类
Caused by: java.lang.NoClassDefFoundError: com/netflix/hystrix/contrib/javanica/aop/aspectj/HystrixCommandAspect
百度后,pom中添加依赖
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
<version>1.5.12</version>
</dependency>
删掉本地仓库中,目录下jar包
D:\softWare\warehouse\com\netflix\hystrix
再次启动,成功。
调用测试接口
http://localhost:8940/manageComplete/updateManager
打印日志
执行成功。。。返回结果调用sap接口失败,进入熔断并降级
记录下尝试过程,又是充实的一天~