快捷搜索: 王者荣耀 脱发

Springcloud---feign--服务降级

客户端技术:整体网站负荷过大时,为了资源的更好利用

客户端微服务做一个异常处理机制

做一个FallbackFactory的实现类

package com.wang.springcloud.service;

import com.wang.springcloud.pojo.Dept;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

import java.util.List;


///实现FallbackFactory 定义降级之后的反馈逻辑
@Component
public class DeptConsumerServiceFailbackFactory implements FallbackFactory {
    @Override
    public Object create(Throwable throwable) {
        return new DeptConsumerService() {
            @Override
            public boolean add(Dept dept) {
                return false;
            }

            @Override
            public Dept get(int id) {
                return new Dept(id,"没有对应信息,服务关闭了","没有数据库信息");
            }

            @Override
            public List<Dept> queryAll() {
                return null;
            }
        };
    }
}

在feignclient指定处理异常的类

package com.wang.springcloud.service;


import com.wang.springcloud.pojo.Dept;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Component
///此处fallbackFactory 指定服务降级触发之后的处理逻辑
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptConsumerServiceFailbackFactory.class)
public interface DeptConsumerService {


    //这里是服务端提供的访问路径
    @RequestMapping("/dept/add")
    public boolean add(Dept dept);

    @RequestMapping("/dept/get/{id}")
    public Dept get(@PathVariable("id") int id);


    @RequestMapping("/dept/list")
    public List<Dept> queryAll();
}

在feign客户端开启feign服务降级处理机制

通过application.yml配置实现

server:
  port: 80

#开启 feign hystrix 服务降级

feign:
  hystrix:
    enabled: true




eureka:
  client:
    register-with-eureka: false  #不像eureka 注册自己
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

测试

这时候,如果请求的服务发生了异常,或者没有服务提供。都可以在客户端处理这个异常。

例如:服务端全部关闭

此时返回信息是客户端处理过的:

当启动了服务器,能够查到结果:

当查询的id不存在,就会有异常抛出,其实这里我理解应该是服务端处理异常更好

例如前一篇博文中的熔断机制

经验分享 程序员 微信小程序 职场和发展