Spring Cloud - Feign调用请求数据过大和响应时间过长的处理办法
Feign调用请求数据过大和响应时间过长的处理办法
请求过大
在使用 Feign 进行服务间调用时,Spring 默认配置了将服务间传输的 JSON 数据进行压缩。当传输数据的大小超过一定值时(具体我也没查到底是多大),就会报如下错误:
Caused by: com.fasterxml.jackson.core.JsonParseException: Illegal character ((CTRL-CHAR, code 31)):
only regular white space (\r, \n, \t) is allowed between tokens at [Source: (PushbackInputStream); line: 1, column: 2]
这时需要更改 Feign 配置:
feign: compression: request: enabled: false response: enabled: false
这样就可以取消服务 Feign 对数据的压缩
响应时间过长
当一个 Feign Client 的处理时间过长(默认为 2 秒)时,调用方服务会报出: ReadTimeOut 的错误。
这时可以通过编写以下配置文件解决:
import feign.Request; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; /** * feign client 配置类 * * @author Helios */ @Component public class RemoteService1Config { /** * 连接超时 */ @Value("${service.feign.connectTimeout:120000}") private long connectTimeoutMillis; /** * 数据读取超时 */ @Value("${service.feign.readTimeOut:120000}") private long readTimeoutMillis; /** * 构造自定义配置类 * * @return Options */ @Bean(name = "service1Options") public Request.Options options() { return new Request.Options(connectTimeoutMillis, TimeUnit.MILLISECONDS, readTimeoutMillis, TimeUnit.MILLISECONDS, true); } }
然后在 Feign Client 接口文件中引入这个配置:
@FeignClient(contextId = "remoteService1", value = "XXX", fallbackFactory = XXXFallbackFactory.class, configuration = RemoteService1Config.class) public interface RemoteService1 { ... }
通过这种方式配置的 Feign Client ,可以做到一个配置文件对应一个服务。还可以配合 Nacos 动态配置超时阈值。