在Feign服务降级的学习中遇到了个极品问题。

运行时异常 java.lang.IllegalStateException: No fallback instance of type class

网上谷歌了好多文章基本的解决方法如下

首先需要明确几个问题,首先有个微服务项目Parent,Parent下有很多模块

API模块内含了很多公用的接口(我们把Feign的回调方法与FeignClient注解标识的Service接口都写在这个模块里)如图

图1

下面是回调类与service接口以及主启动类的代码

图2

图3

图4

然后另起了三个模块作为Eureka集群

图5

还有个使用了hystrix的服务提供者下文中称为提供者

图6

最后一个是消费者

图7

消费者目录如下

图8

消费者主启动类

图9

如下是消费者暴露出来的接口代码,直接调用了api模块的DeptServiceINF接口(见图3)中的方法,我们如果去测试Add方法的话,这个时候如果唯一的一个提供者挂掉的话按理说我们是会调用FallBack类(见图2)中的回调方法,也就是是说会调用下图这个方法。

图11

 

图12

1、在回调类上使用@Component注解

2、在回调类所在的项目中添加配置

@Configuration
public class FallBackConfig {
    @Bean
    public DeptServiceFallBack deptServiceFallBack(){
        return new DeptServiceFallBack();
    }
}

3、在消费者中的配置文件加

feign.hystrix.enabled=true

然而上边几个方法我都试过了,依旧报错注入不到Spring容器,这个时候感觉像是Spring自带的问题?

我继续排查问题,在回调类上使用@Service也没软用,在API模块的主启动类加扫描包的注解也没屌用

 

直到。。。。

我突然想到这个错是我启动9002消费者的时候才抛出的运行时异常所以我在API那个模块中加什么注解肯定也不管用,因为API项目不会启动,自然不会注入到容器中,所以我就在修改了9002消费者的主启动类@SpringBootApplication注解

注解中扫描了两个包一个是回调类所在的包,一个是本启动类所在的包

我的老天,这个问题给我困了一整天还多。。。可算是整明白了

项目启动然后把8001服务提供者挂掉

访问9002消费者提供的add接口

如图,显示服务降级回调成功!!!!!!

总结,如果你把回调类写在了与消费者不同项目或者模块中,想要成功调用回调类中的方法的话你就得在消费者的主启动类配置好回调类的bean的扫描包路径。也就是加了@Component注解的回调类的路径。

顺带着提一嘴,如果是跟我一样分了多个项目而且把回调类写在了与消费者不同module中你必须每次修改公用的模块的时候都得进行mvn clean install并且重新对调用该修改过的公用模块的模块的pom文件进行reimport操作再启动。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐