2四、Feign捕获错误码并降级处理

 

 

正常状况下,咱们使用Feign通常使用方式以下spring

 

(1)声明服务接口app

 

@FeignClient(name = "hello",fallback = HelloServiceImpl.class)ide

public interface HelloService {spa

    @GetMapping("hello")插件

    public String hello();调试

}接口

 

改接口已经指定了降级处理代码get

 

(2)实现降级处理代码class

 

package com.easystudy.service.impl;import

 

import org.springframework.stereotype.Service;

import com.easystudy.service.HelloService;

 

import lombok.extern.slf4j.Slf4j;

 

@Service

@Slf4j            // 不想每次都写private final Logger logger = LoggerFactory.getLogger(XXX.class);

                // @Slf4j注入后找不到变量log,那就给IDE安装lombok插件

public class HelloServiceImpl implements HelloService {

    @Override

    public String hello() {

        log.info("调用{}失败","hello");

        return "调用hello失败";

    }

}

 

 

可是问题来了,虽然咱们定义了降级处理代码,可是在降级处理代码中,咱们没法知道失败的具体细节,也就是没法拿到失败或错误的缘由,因此调试过程或排错过程就是意见很麻烦的事情了。为了解决这个问题,咱们必须能拿到对应错误码才行,咱们使用fallback工厂,而不是fallback。

 

 

fallbackFactory 实现以下:

 

(1)接口声明

 

@FeignClient(name = "hello",/*fallback = HelloServiceImpl.class,*/ fallbackFactory=HelloServiceFallbackFactory.class)

public interface HelloService {

    @GetMapping("hello")

    public String hello();

}

 

这里咱们指定了fallbackFactory,也就是由它来完成降级代码的生成。

 

(2)实现降级工厂

 

/**

 * 错误处理

 * @author Administrator

 */

@Component class HelloServiceFallbackFactory implements FallbackFactory<HelloService>{

     @Override

     public HelloService create(Throwable cause) {

          System.out.println("请求错误:" + cause.getMessage());

          

          // 降级处理

          return new HelloService() {

              @Override

              public String hello() {

                   return "调用失败,请肯定服务是否启动或稍后重试!";

              }             

          };

     }

   

}

 

此处,咱们打印了具体的错误信息,而且返回了一个实现了HelloService接口的匿名类,也就是实现了降级服务接口。

 

注意,此处必须将fallback注释掉,采用fallbackFactory方式。fallbackFactory是为指定的客户端接口定义一个回退工厂。回退工厂必须产生回退类的实例,这些实例实现由FeignClient注释的接口。若是同时设置fallback和fallbackfactory不能够的,会有有冲突,fallback生效,fallbackfactory不能使用,fallbackFactory 是fallback的一个升级版,注释fallback设置便可.