Java Feign客户端回退-无法调用回退

我试图通过Java中的 Feign客户端的工作来理解,并在出现错误时调用 Fallback ,遇到了一些困难。 我写了最简单的例子来了解它是如何工作的,但是似乎我很困惑。 请帮助我了解我的错误在哪里。

我还将此示例发布在github上,以使其更加方便: https://github.com/ksereda/feign-fallback-example

客户端通过Feign呼叫服务一,并接收字符串“从SERVICE-ONE获取字符串”。

客户还通过Feign调用 service-two 并获取字符串“从SERVICE-TWO获取字符串”。

先决条件: 如果 service-two 不可用, client 必须调用Fallback类,其中指示了对 service-three 的调用“从SERVICE-TWO获取字符串” 客户端应从 service-三获得“从SERVICE-THREE获取字符串”

服务二服务三是相同的,只返回不同的字符串。

服务一代码:

@RestController
@RequestMapping("/")
public class OneController {

    Logger logger = Logger.getLogger(OneController.class.getName());

    @GetMapping("/getStringFromServiceone")
    public String getString() {
        logger.info("Get String from SERVICE-ONE");
        return "Get String from SERVICE-ONE";
    }

}

服务二代码:

@RestController
@RequestMapping("/")
public class TwoController {

    Logger logger = Logger.getLogger(TwoController.class.getName());

    @GetMapping("/getStringFromServiceTwo")
    public String getString() {
        logger.info("Get String from SERVICE-TWO");
        return "Get String from SERVICE-TWO";
    }

}

服务三代码:

@RestController
@RequestMapping("/")
public class ThreeController {

    Logger logger = Logger.getLogger(ThreeController.class.getName());

    @GetMapping("/getStringFromServiceThree")
    public String getString() {
        logger.info("Get String from SERVICE-THREE");
        return "Get String from SERVICE-THREE";
    }

}

客户代码:

控制器:

@RestController
@RequestMapping("/")
public class ClientController {

   Logger logger = Logger.getLogger(ClientController.class.getName());

    @Autowired
    private ServiceoneFeignClient serviceoneFeignClient;

    @Autowired
    private ServiceTwoFeignClient serviceTwoFeignClient;

    @RequestMapping(path = "/getDataFromServiceoneByFeign")
    public String getDataFromServiceone() {
        String result = serviceoneFeignClient.getString();
        logger.info("Calling through Feign Client");
        return result;
    }

    @RequestMapping(path = "/getDataFromServiceTwoByFeign")
    public String getDataFromServiceTwo() {
        String result = serviceTwoFeignClient.getString();
        logger.info("Calling through Feign Client");
        return result;
    }

}

假装1:

@FeignClient(name = "service-one",url = "http://localhost:8081/")
public interface ServiceoneFeignClient {

    @GetMapping("/getStringFromServiceone")
    String getString();

}

和假装2:

@FeignClient(name = "service-two",url = "http://localhost:8082/",fallback = Fallback.class)
public interface ServiceTwoFeignClient {

    @GetMapping("/getStringFromServiceTwo")
    String getString();

}

和假装3:

@FeignClient(name = "service-three",url = "http://localhost:8083/")
public interface ServiceThreeFeignClient {

    @GetMapping("/getStringFromServiceThree")
    String getString();

}

主类:

@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrix
public class ClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class,args);
    }

}

和application.yml文件

server:
  port: 8070

feign:
  hystrix:
    enabled: true

在这里我创建了Fallback类

@Component
public class Fallback implements ServiceThreeFeignClient {

    @Override
    public String getString() {
        System.out.println("Called MOVIE-SERVICE with Fallback class!");
        return new String("FALLBACK STRING");
    }

}

如果服务二不可用,我想在这里致电服务三

但是当我启动应用程序时,我立即收到错误消息:

Caused by: java.lang.IllegalStateException: Incompatible fallback instance. Fallback/fallbackFactory of type class com.example.client.service.Fallback is not assignable to interface com.example.client.service.ServiceTwoFeignClient for feign client service-two
    at org.springframework.cloud.openfeign.HystrixTargeter.getFromContext(HystrixTargeter.java:86) ~[spring-cloud-openfeign-core-2.1.1.RELEASE.jar:2.1.1.RELEASE]
    at org.springframework.cloud.openfeign.HystrixTargeter.targetWithFallback(HystrixTargeter.java:70) ~[spring-cloud-openfeign-core-2.1.1.RELEASE.jar:2.1.1.RELEASE]
    at org.springframework.cloud.openfeign.HystrixTargeter.target(HystrixTargeter.java:46) ~[spring-cloud-openfeign-core-2.1.1.RELEASE.jar:2.1.1.RELEASE]
    at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:284) ~[spring-cloud-openfeign-core-2.1.1.RELEASE.jar:2.1.1.RELEASE]
    at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:247) ~[spring-cloud-openfeign-core-2.1.1.RELEASE.jar:2.1.1.RELEASE]
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]

我了解他的写道:我必须指出

implements ServiceTwoFeignClient

代替

implements ServiceThreeFeignClient

但是如果服务2不可用,我想致电服务3。

我不知道该怎么做。 谢谢您的帮助。 谢谢

m258494824 回答:Java Feign客户端回退-无法调用回退

我在后备课程中决定了它:

@Component
public class Fallback implements ServiceTwoFeignClient {

    @Autowired
    private ServiceThreeFeignClient serviceThreeFeignClient;

    @Override
    public String getString() {
        return serviceThreeFeignClient.getString();
    }

}
本文链接:https://www.f2er.com/2444871.html

大家都在问