我试图通过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。
我不知道该怎么做。 谢谢您的帮助。 谢谢