一、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;
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193529.html