所谓降级,一般是从整体负荷考虑。
就是当某个服务熔断之后,服务器将不再被调用此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。这样做,虽然服务水平下降,但好歹可用,比直接挂掉要强。
整体资源快不够了,忍痛将某些服务先关闭,待度过难关,再开启回来.
服务降级处理是在客户端,也就是消费者(调用方)实现完成的,与服务端没有关系
由于上一篇博客的服务熔断的做法需要一个方法就需要一个回复的方法,并且回复的方法和业务逻辑方法在一起,代码过于耦合,所以接下来试试这个服务降级的操作:
我们先弄一个服务降级类,这个类实现FallbackFactory<T>这个接口,里面的泛型就放我们暴露出来给别人调用的接口,在之前的例子中实现了feign负载均衡的接口,然后
在这个类上加上注解@Component,记得一定要加上.然后在我们暴露给别人调用的接口上也要加上注解,话不多索,这两个地方直接贴代码比较清白:
package com.hw.service;
import java.util.List;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.hw.entity.Dept;
//fallbackFactory 声明服务降级的处理类
@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)//被调用方服务名
public interface DeptClientService {
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
public Dept get(@PathVariable("id") long id);
@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
public List<Dept> list();
@RequestMapping(value = "/dept/add", method = RequestMethod.POST)
public boolean add(Dept dept);
}
package com.hw.service;
import com.hw.entity.Dept;
import org.springframework.stereotype.Component;
import java.util.List;
import feign.hystrix.FallbackFactory;
/**
* @program: SpringCloud
* @description:
* @author: hw
* @create: 2019-01-25 00:30
**/
@Component // 不要忘记添加,不要忘记添加
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {
@Override
public DeptClientService create(Throwable throwable) {
return new DeptClientService() {
@Override
public Dept get(long id) {
return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭")
.setDb_source("no this database in MySQL");
}
@Override
public List<Dept> list() {
return null;
}
@Override
public boolean add(Dept dept) {
return false;
}
};
}
}
然后的话在我们的调用方,也就是消费者中的配置文件上加上:
feign: #feign负载均衡启动 hystrix
hystrix:
enabled: true
测试的时候我们首先得启动所有的eureka,然后启动我们的被调用方(生产者),最后启动我们的调用方(消费者),通过正确的链接访问,可以看到是没什么问题的.但是我们如果把这个被调用方,也就是生产者关闭之后,再去访问链接的话就会发现,页面上显示的信息就是我们在公共模块中新建的类上自定义的服务降级返回的处理:
此时服务端provider已经down了,但是我们做了服务降级处理,让客户端在服务端不可用时也会获得提示信息而不会挂起耗死服务器