背景
前面我们使用Hystrix
实现了服务熔断,本文我们将继续使用Hystrix
实现服务降级。
服务降级
服务降级通常有两种场景:
- 当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度;
- 当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户。
通过以上两种场景,其实我们可以理解为服务熔断也是服务降级的一种。从业务来上来看,熔断和降级通常是一起出现的。因为下游服务不可用时,这个时候为了对最终用户负责,就需要进入上游的降级逻辑了。因此,将熔断视为降级的一种,也是可以说的通的。
实现
本文是基于上一篇的代码来进行的。
springcloud-api
创建DeptClientServiceFallbackFactory
package com.langjialing.springcloud.service;
import com.langjialing.springcloud.pojo.Dept;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.context.annotation.ComponentScan;
import java.util.List;
@ComponentScan
public class DeptClientServiceFallbackFactory implements FallbackFactory {
/*
本案例中仅提供了queryId()的降级,其它两个相同操作
*/
@Override
public DeptClientService create(Throwable cause) {
return new DeptClientService() {
@Override
public Dept queryById(Long id) {
Dept dept = new Dept();
dept.setDeptno(id);
dept.setDname("id => " + id + ",没有对应的信息,服务端提供了降级的信息,这个服务现在已经被关闭。");
dept.setDb_source("No Database!");
return dept;
}
@Override
public List<Dept> queryAll() {
return null;
}
@Override
public boolean addDept(Dept dept) {
return false;
}
};
}
}
修改DeptClientService
springcloud-consumer-dept-80-feign
修改application.yaml
功能测试(存疑)
启动模块:
注:
- 服务消费者需启动
springcloud-consumer-dept-80-feign
模块,因为这个模块支持feign
; - 服务提供者启动
springcloud-provider-dept-xxx
模块(没有Hystrix
功能的模块); Eureka
注册中心正常启动。
注:
- 在服务提供者8001关机时,这里应该返回
fallbackFactory = DeptClientServiceFallbackFactory.class
的内容,但博主这里一直返回错误页面,有了解问题所在的大佬烦请在评论区指出,或者邮件指点下博主。
总结
使用Hystrix
的@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT", fallbackFactory = DeptClientServiceFallbackFactory.class)
,可开启服务降级
功能。
但博主的测试代码未能实现降级功能,如有大佬了解原因烦请指点一下。
接下来我们将继续介绍Hystrix
的Dashboard流监控
。