SpringCloud之Hystrix断路器(二)服务降级

所谓降级,一般是从整体负荷考虑。

就是当某个服务熔断之后,服务器将不再被调用此时客户端可以自己准备一个本地的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了,但是我们做了服务降级处理,让客户端在服务端不可用时也会获得提示信息而不会挂起耗死服务器

 

如需完整代码可以加我qq

点赞或者评论是我最大的动力,有问题欢迎留言或者联系q:1559810637 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值