一、Feign接口调用超时
1、问题描述:
在实际项目中,有时候我们会遇到Feign接口调用超时的问题。出现这种问题的主要原因是网络的不稳定性或者接口调用耗时过长。
2、解决方案:
可以通过调整Feign的一些参数来解决这个问题:
@Configuration
public class FeignConfig {
/**
* 连接超时时间,单位毫秒
*/
private int connectTimeout = 10000;
/**
* 读取超时时间,单位毫秒
*/
private int readTimeout = 10000;
/**
* 是否开启日志
*/
private boolean logEnable = true;
/**
* 是否重试
*/
private boolean retryEnable = false;
/**
* 最大重试次数
*/
private int maxRetryCount = 0;
@Bean
public Retryer feignRetryer() {
return new Retryer.Default(100, 1000, maxRetryCount);
}
@Bean
public Logger.Level feignLoggerLevel() {
return logEnable ? Logger.Level.FULL : Logger.Level.NONE;
}
@Bean
public Request.Options options() {
return new Request.Options(connectTimeout, readTimeout);
}
}
二、通过Feign调用的接口还要注册吗?
1、问题描述:
在使用Feign调用其它服务的接口时,需要在FeignClient注解中指定要调用的服务名。此时,需要确保将要调用的服务已经成功注册到了Eureka注册中心中。
2、解决方案:
注册服务的方式不一定只能使用Eureka,可以使用其它的注册中心,但是需要保证服务成功注册到注册中心中。
三、Feign接口调用接受不到参数
1、问题描述:
在使用Feign调用其它服务的接口时,有时候会遇到接口调用方无法接收到参数的问题。
2、解决方案:
检查Feign接口的参数名与接口调用方的参数名是否一致。如果不一致,可以使用@RequestParam或@RequestBody注解来明确指定参数的名称。
四、Feign接口调用post实体类为null
1、问题描述:
在使用Feign调用其它服务的post接口时,有时候会遇到post传递的实体类为null的问题。
2、解决方案:
检查传递的实体类是否为null。如果不是null,则检查实体类是否正确序列化。
五、Feign接口调用代码
代码示例:
@Component
@EnableFeignClients(basePackages = "com.example.feignclient.client")
public class FeignService {
@Autowired
private TestClient testClient;
public String hello(String name){
return testClient.hello(name);
}
}
@FeignClient(value = "testService")
public interface TestClient {
@GetMapping("/hello")
String hello(@RequestParam String name);
}
六、Feign接口调用返回Null
1、问题描述:
在使用Feign调用其它服务的接口时,有时候会遇到返回null的问题。
2、解决方案:
检查返回值是否有序列化问题或者是否存在其他的控制路径导致方法没有返回值。
七、Feign接口调用报错400
1、问题描述:
在使用Feign调用其它服务的接口时,有时候会遇到返回400错误的问题。
2、解决方案:
在接口调用时,需要注意传递的参数是否正确。如果仍然出现此问题,可以在Feign调用端使用Interceptor对请求进行拦截,输出请求和响应内容查看更多信息。
八、Feign接口调用get
代码示例:
@FeignClient(value = "testService",url = "localhost:8080")
public interface TestClient {
@GetMapping("/get/{id}")
String getTest(@PathVariable("id") Integer id);
}
九、Feign接口调用事务回滚
1、问题描述:
在使用Feign调用其它服务的接口时,有时候会遇到事务回滚的问题。
2、解决方案:
在分布式事务环境中,需要使用分布式事务框架(如seata)来实现分布式事务。
十、Feign接口调用获取调用方IP
1、问题描述:
在使用Feign调用其它服务的接口时,有时候需要获取调用方的IP地址。
2、解决方案:
可以在Feign调用端使用HttpServletRequest对象获取调用方IP地址。
@RestController
public class TestController {
@GetMapping("/hello")
public String hello(HttpServletRequest request, @RequestParam String name){
String ip = request.getRemoteAddr();
return "Hello, " + name + "! Your ip is " + ip;
}
}