OpenFeign问题汇总
创始人
2024-06-02 10:25:00
0

OpenFeign 问题汇总

超时配置哪个准?

Options > appConfig > defaultConfig > OKhttp

# Options参数
@PostMapping(value = "/api/test/options")Object testOptions(Request.Options options,	@RequestBody List Params);
# xx应用 appConfig
feign.client.config.xx-application.connectTimeout=2000
feign.client.config.xx-application.readTimeout=2000# feign全局默认 defaultConfig
feign.client.config.default.connectTimeout=1500
feign.client.config.default.readTimeout=3000
# OKHttp的超时配置
return new OkHttpClient.Builder().readTimeout(readTimeout, TimeUnit.MILLISECONDS).connectTimeout(connectTimeout, TimeUnit.MILLISECONDS).writeTimeout(writeTimeout,TimeUnit.MILLISECONDS).build()

动态设置超时参数
feign 版本 >=10.3 支持
feign 版本 <=10.2.3 无法动态设置Options参数

详见SynchronousMethodHandler.invoke

   @Overridepublic Object invoke(Object[] argv) throws Throwable {RequestTemplate template = buildTemplateFromArgs.create(argv);Options options = findOptions(argv);Retryer retryer = this.retryer.clone();...}Options findOptions(Object[] argv) {if (argv == null || argv.length == 0) {return this.options;}return (Options) Stream.of(argv).filter(o -> o instanceof Options).findFirst().orElse(this.options);}

@Header 设置了不生效

// 不生效@GetMapping(value = "/tool/sleep")@Headers("k2:v2")Result sleep(@RequestParam(value = "ms") Integer ms);

测试后,不生效

核心关注下FeignClient 的 Contract

如果是 SpringMvcContract 则使用 @RequestMapping 中的 headers
如果是 Contract.Default 则使用 @Headers 注解即可

// 正解@GetMapping(value = "/tool/sleep", headers = "Retry=true")Result sleep(@RequestParam(value = "ms") Integer ms);

ps: openFeign 会默认启用SpringMvcContract

// FeignClientsConfiguration@Bean@ConditionalOnMissingBeanpublic Contract feignContract(ConversionService feignConversionService) {return new SpringMvcContract(this.parameterProcessors, feignConversionService);}

UndeclaredThrowableException 如何解?

  • 原因
    详见此文

  • 我的解法1

    底层使用 OkHttpClient
    定义 OkhttpInterceptor
    默认针对 IOException + Get/Put 操作做重试 (可结合header做定制扩展)
    上游处理 RpcException + FeignException

  • 我的解法2

    底层使用 OkHttpClient
    定义 OkhttpInterceptor
    实现异常的捕获、包装与转换
    上游只处理 RpcException

连接池配置什么情况?

  • OKHTTP默认

    OkHttpClient.Builder
    maxIdleConnections=5
    keepAliveTime= 5 mins

  • feign-okhttp配置

    FeignAutoConfiguration.OkHttpFeignConfiguration.httpClientConnectionPool
    maxIdleConnections=200
    keepAliveTime= 900 s

# 可通过属性配置 FeignHttpClientProperties
feign.httpclient.maxConnections=50
feign.httpclient.timeToLive=900
  • 多个FeignClient 里共用一个 OkHttpClient

    可以在项目启动时查看

# Feign.Builder 
public Feign build() 看client
public  T target(Target target) 看 target 的type和name
  • 连接池回收

回收原则:idle 数量多 或 idle的时间长
(idleCount> maxIdleConnections || longestIdleDurationNs >= this.keepAliveDurationNs)
详见代码 ConnectionPool.cleanup

# ConnectionPool.cleanupif (longestIdleDurationNs >= this.keepAliveDurationNs|| idleConnectionCount > this.maxIdleConnections) {// We've found a connection to evict. Remove it from the list, then close it below (outside// of the synchronized block).connections.remove(longestIdleConnection);
}

相关内容

热门资讯

不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
安卓文字转语音tts没有声音 安卓文字转语音TTS没有声音的问题在应用中比较常见,通常是由于一些设置或者代码逻辑问题导致的。本文将...
APK正在安装,但应用程序列表... 这个问题可能是由于以下原因导致的:应用程序安装的APK文件可能存在问题。设备上已经存在同名的应用程序...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
报告实验.pdfbase.tt... 这个错误通常是由于找不到字体文件或者文件路径不正确导致的。以下是一些解决方法:确认字体文件是否存在:...