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 动态配置超时阈值。

posted @ 2022-08-10 12:07  Helios_Fz  阅读(5429)  评论(0)    收藏  举报