OpenFeign性能优化最全实战
Feign 就是动态代理 模板化 HTTP 请求帮你把接口方法自动转成 HTTP 调用。完整执行流程8 步启动时FeignClient 接口被 Feign 扫描生成动态代理类调用时执行接口方法 → 进入代理类解析注解读取 GetMapping、参数、路径构造请求拼接 URL、参数、请求头选择客户端使用 OkHttp/HttpClient 发送请求拦截器处理执行请求前后拦截器如放 Token发送请求通过连接池发送 HTTP一、OpenFeign 为什么慢核心瓶颈默认配置非常保守慢的根源并发线程数太小默认仅 200 个HTTP 连接不池化每次请求新建连接超时时间不合理默认用 JDK 原生 HttpURLConnection性能差、无连接池日志级别过高FULL 日志极耗性能二、终极优化方案4 步起飞优化 1替换 HTTP 客户端最关键禁用默认 JDK 客户端改用 Apache HttpClient 5 或 OkHttp它们支持连接池、复用连接、心跳、并发优化性能提升巨大。推荐OkHttp最简单、最稳!-- OpenFeign 核心 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!-- 优化OkHttp 连接池 --dependencygroupIdio.github.openfeign/groupIdartifactIdfeign-okhttp/artifactIdversion12.1/version/dependency启用配置feign:okhttp:enabled:true# 启用 OkHttphttpclient:enabled:false# 关闭默认 HttpClient优化 2配置连接池并发核心feign:okhttp:enabled:trueclient:config:default:connectTimeout:2000# 连接超时readTimeout:5000# 读取超时loggerLevel:basic# 日志级别千万别用 full# OkHttp 连接池优化生产推荐okhttp:pool:max-idle-connections:200# 最大空闲连接keep-alive-duration:300s# 连接保活时间优化 3调大 Feign 并发线程池默认 max-connections 200高并发下直接不够用feign:okhttp:enabled:truehttpclient:max-connections:500# 最大总连接数max-connections-per-route:300# 每个域名最大连接数高并发建议max-connections 500 ~ 1000max-connections-per-route 300 ~ 500优化 4日志级别优化性能杀手❌ 禁止使用loggerLevel:full# 打印完整请求响应高并发下性能暴跌✅ 生产推荐loggerLevel:basic# 只打印请求方法、URL、响应码、耗时三、进阶性能优化高手必看优化 5开启 Feign 异步非阻塞默认 Feign 是同步阻塞的高并发下会阻塞业务线程。开启异步FeignClient(nameuser-service)publicinterfaceUserFeign{GetMapping(/user/{id})CompletableFutureUsergetUser(PathVariable(id)Longid);}性能提升非常明显。优化 6开启 GZIP 压缩减少传输体积feign:compression:request:enabled:truemime-types:application/jsonmin-request-size:1024# 超过1KB压缩response:enabled:true接口响应速度提升 20%~50%优化 7单独调优某服务避免全局影响feign:client:config:# 默认全局default:connectTimeout:2000readTimeout:5000# 给 user-service 单独配置更大超时更高并发user-service:connectTimeout:3000readTimeout:8000四、生产环境终极最优配置直接复制feign:okhttp:enabled:truehttpclient:enabled:falsemax-connections:800max-connections-per-route:400client:config:default:connectTimeout:2000readTimeout:5000loggerLevel:basiccompression:request:enabled:truemime-types:application/jsonmin-request-size:1024response:enabled:trueokhttp:pool:max-idle-connections:200keep-alive-duration:300s五、性能提升效果实测接口响应速度提升 30%~100%并发支持能力提升 3~5 倍线程阻塞大幅减少服务CPU使用率降低六、OpenFeign 请求头传递Token微服务最常见需求网关/前端传 Token → 微服务A → 调用 Feign → 微服务B必须让 Token 透传方案RequestInterceptor 统一拦截注入最标准1. 写拦截器代码importfeign.RequestInterceptor;importfeign.RequestTemplate;importjakarta.servlet.http.HttpServletRequest;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.context.request.RequestContextHolder;importorg.springframework.web.context.request.ServletRequestAttributes;ConfigurationpublicclassFeignHeaderConfig{BeanpublicRequestInterceptorrequestInterceptor(){returnnewRequestInterceptor(){Overridepublicvoidapply(RequestTemplatetemplate){// 1. 获取当前请求上下文ServletRequestAttributesattributes(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();if(attributes!null){HttpServletRequestrequestattributes.getRequest();// 2. 从请求头获取 TokenStringtokenrequest.getHeader(Authorization);// 3. 放入 Feign 请求头if(token!null){template.header(Authorization,token);}}}};}}2. 适用场景网关透传 Token登录鉴权用户信息传递3. 注意异步场景失效异步(Async)、子线程中 Feign 调用会拿不到 request因为RequestContextHolder是ThreadLocal 存储子线程无法获取。✅异步修复方案// 主线程先获取ServletRequestAttributesattributes(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();// 异步任务里手动设置CompletableFuture.runAsync(()-{RequestContextHolder.setRequestAttributes(attributes);// 这里再调 Feign});七、OpenFeign 优化总结必须用 OkHttp 替代默认客户端必须开启连接池必须调大并发连接数日志级别必须用 basic高并发建议开启异步开启GZIP压缩
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2457513.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!