Hello developers, I'm a developer from China and I'm starting to learn how to use openfeign, due to the version upgrade, there are some changes in the way I use it and when I set the fallback, it doesn't work anymore, I'd like to get some help, thanks.
env:
<java.version>11</java.version>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.2<version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
config
#feign-config
feign:
compression:
request:
enabled: true
mime-types: text/xml,application/xml,application/json
min-request-size: 2048
response:
enabled: true
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: basic
code:
ArticleController.java
@Autowired
private FileFeignService fileFeignService;
@GetMapping("/test")
public ResponseEntity<String> test(String name) {
return fileFeignService.test(name);
}
FileFeignService.java
@FeignClient(value = "files", contextId = "file-test",fallback = FileFeignServiceFallbackImpl.class)
public interface FileFeignService {
/**
* test
* @param name test
* @return test
*/
@GetMapping("/test")
ResponseEntity<String> test(@RequestParam(value = "name") String name);
}
FileFeignServiceFallbackImpl.java
@Component
public class FileFeignServiceFallbackImpl implements FileFeignService {
@Override
public ResponseEntity<String> test(String name) {
return ResponseEntity.badRequest().body("fail");
}
}
files is service-provider,article is service-cusumer
When the article service is started and the file service is not started, I think fallback should be called, but loadbalancer reports an error and does not execute the fallback
exception
feign.FeignException$ServiceUnavailable: [503] during [GET] to [http://files/test?name=1] [FileFeignService#test(String)]: [Load balancer does not contain an instance for the service files]
at feign.FeignException.serverErrorStatus(FeignException.java:237) ~[feign-core-10.10.1.jar:na]
at feign.FeignException.errorStatus(FeignException.java:180) ~[feign-core-10.10.1.jar:na]
at feign.FeignException.errorStatus(FeignException.java:169) ~[feign-core-10.10.1.jar:na]
at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:92) ~[feign-core-10.10.1.jar:na]
at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:96) ~[feign-core-10.10.1.jar:na]
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138) ~[feign-core-10.10.1.jar:na]
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89) ~[feign-core-10.10.1.jar:na]
at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) ~[feign-core-10.10.1.jar:na]
at com.sun.proxy.$Proxy90.test(Unknown Source) ~[na:na]
at cn.beichenhpy.controller.ArticleController.test(ArticleController.java:42) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.6.jar:5.3.6]
...
I would like to know if it is my dependency conflict or my configuration is wrong, I hope to get your reply, thank you very much!
Comment From: beichenhpy
I should have known better, I didn't use a breaker like hystrix or Sentinel
Comment From: beichenhpy
My bad, I know why it didn't work because feign.circuitbreaker.enabled=true was not used
https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#spring-cloud-feign-circuitbreaker
THX