OpenFeign 是 Spring 官方推出的一种声明式服务调用和负载均衡组件。它的出现就是为了替代已经进入停更维护状态的 Feign(Netflix Feign),同时它也是 Spring 官方的顶级开源项目。我们在日常的开发中使用它的频率也很高,而 OpenFeign 有一些实用的小技巧,配置之后可以让 OpenFeign 更好的运行,所以本文我们就来盘点一下(也欢迎各位老铁评论区留言补充)。

1.超时优化

OpenFeign 底层内置了 Ribbon 框架,并且使用了 Ribbon 的请求连接超时时间和请求处理超时时间作为其超时时间,而 Ribbon 默认的请求连接超时时间和请求处理超时时间都是 1s,如下源码所示:



所有当我们使用 OpenFeign 调用了服务接口超过 1s,就会出现以下错误:



因为 1s 确实太短了,因此我们需要手动设置 OpenFeign 的超时时间以保证它能正确的处理业务。

OpenFeign 的超时时间有以下两种更改方法:

  1. 通过修改 Ribbon 的超时时间,被动的修改 OpenFeign 的超时时间。

  2. 直接修改 OpenFeign 的超时时间(推荐使用)。

    1.1 设置Ribbon超时时间

    在项目配置文件 application.yml 中添加以下配置:

    ribbon:
    ReadTimeout: 5000 # 请求连接的超时时间
    ConnectionTimeout: 10000 # 请求处理的超时时间

    1.2 设置OpenFeign超时时间

    在项目配置文件 application.yml 中添加以下配置:

    feign:
    client:
    config:
    default: # 设置的全局超时时间
    connectTimeout: 2000 # 请求连接的超时时间
    readTimeout: 5000 # 请求处理的超时时间

    推荐使用此方式来设置 OpenFeign 的超时时间,因为这样的(配置)语义更明确。

    2.请求连接优化

    OpenFeign 底层通信组件默认使用 JDK 自带的 URLConnection 对象进行 HTTP 请求的,因为没有使用连接池,所以性能不是很好。我们可以将 OpenFeign 的通讯组件,手动替换成像 Apache HttpClient 或 OKHttp 这样的专用通信组件,这些的专用通信组件自带连接池可以更好地对 HTTP 连接对象进行重用与管理,同时也能大大的提升 HTTP 请求的效率。接下来我以 Apache HttpClient 为例,演示一下专用通讯组件的使用。

    2.1 引入Apache HttpClient依赖

    在项目的依赖管理文件 pom.xml 中添加以下配置:

    <!-- 添加 openfeign 框架依赖 -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!-- 添加 httpclient 框架依赖 -->
    <dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
    </dependency>

    2.2 开启Apache HttpClient使用

    启动 Apache HttpClient 组件,在项目配置文件 application.yml 中添加以下配置,:

    feign:
    client:
    httpclient: # 开启 HttpClient
    enabled: true

    验证 Apache HttpClient 配置是否生效,可以在 feign.SynchronousMethodHandler#executeAndDecode 方法上打断点就可以看到了,如下图所示:

    3.数据压缩

    OpenFeign 默认不会开启数据压缩功能,但我们可以手动的开启它的 Gzip 压缩功能,这样可以极大的提高宽带利用率和加速数据的传输速度,在项目配置文件 application.yml 中添加以下配置:

    feign:
    compression:
    request:
    enabled: true # 开启请求数据的压缩功能
    mime-types: text/xml,application/xml, application/json # 压缩类型
    min-request-size: 1024 # 最小压缩值标准,当数据大于 1024 才会进行压缩
    response:
    enabled: true # 开启响应数据压缩功能

    PS:如果服务消费端的 CPU 资源比较紧张的话,建议不要开启数据的压缩功能,因为数据压缩和解压都需要消耗 CPU 的资源,这样反而会给 CPU 增加了额外的负担,也会导致系统性能降低。

4.负载均衡优化

OpenFeign 底层使用的是 Ribbon 做负载均衡的,查看源码我们可以看到它默认的负载均衡策略是轮询策略,如下图所示:



然而除了轮询策略之外,我们还有其他 6 种内置的负载均衡策略可以选择,这些负载均衡策略如下:

  1. 权重策略:WeightedResponseTimeRule,根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。它的实现原理是,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。
  2. 最小连接数策略:BestAvailableRule,也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。
  3. 区域敏感策略:ZoneAvoidanceRule,根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。
  4. 可用敏感性策略:AvailabilityFilteringRule,先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例。
  5. 随机策略:RandomRule,从服务提供者的列表中随机选择一个服务实例。
  6. 重试策略:RetryRule,按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null。

出于性能方面的考虑,我们可以选择用权重策略或区域敏感策略来替代轮询策略,因为这样的执行效率最高。

5.日志级别优化

OpenFeign 提供了日志增强功能,它的日志级别有以下几个:

  • NONE:默认的,不显示任何日志。
  • BASIC:仅记录请求方法、URL、响应状态码及执行时间。
  • HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息。
  • FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。

我们可以通过配置文件来设置日志级别,配置信息如下:

logging:
level:
cn.myjszl.service: debug

其中 cn.myjszl.service 为 OpenFeign 接口所在的包名。虽然 OpenFeign 默认是不输出任何日志,但在开发阶段可能会被修改,因此在生产环境中,我们应仔细检查并设置合理的日志级别,以提高 OpenFeign 的运行效率

总结

OpenFeign 是 Spring 官方推出的一种声明式服务调用和负载均衡组件,在生产环境中我们可以通过以下配置来优化 OpenFeign 的运行:

  1. 修改 OpenFeign 的超时时间,让 OpenFeign 能够正确的处理业务;
  2. 通过配置专用的通信组件 Apache HttpClient 或 OKHttp,让 OpenFeign 可以更好地对 HTTP 连接对象进行重用和管理,以提高其性能;
  3. 开启数据压缩功能,可以提高宽带利用率和加速数据传输速度;
  4. 使用合适的负载均衡策略来替换默认的轮询负载均衡策略,已获得更好的执行效率;
  5. 检查生成环境中 OpenFeign 的日志级别,选择合适的日志输出级别,防止无效的日志输出。

参考 && 鸣谢

juejin.cn/post/7010555899240513543

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java中文社群

Java面试合集:https://gitee.com/mydb/interview

Spring Cloud OpenFeign 的 5 个优化小技巧!的更多相关文章

  1. 微服务生态组件之Spring Cloud OpenFeign详解和源码分析

    Spring Cloud OpenFeign 概述 Spring Cloud OpenFeign 官网地址 https://spring.io/projects/spring-cloud-openfe ...

  2. Feign 系列(05)Spring Cloud OpenFeign 源码解析

    Feign 系列(05)Spring Cloud OpenFeign 源码解析 [TOC] Spring Cloud 系列目录(https://www.cnblogs.com/binarylei/p/ ...

  3. Spring Cloud OpenFeign使用教程

    文章目录 Spring Cloud OpenFeign Demo 怎么配置OpenFeignServer 怎么配置OpenFeignClient 多个参数传递问题 FeignClient的日志问题 多 ...

  4. SpringCloud升级之路2020.0.x版-29.Spring Cloud OpenFeign 的解析(1)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在使用云原生的很多微服务中,比较小规模的可能直接依靠云服务中的负载均衡器进行内部域名与服务 ...

  5. 嵌入式C语言优化小技巧

    嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的 ...

  6. .NET性能优化小技巧

    .NET 性能优化小技巧 Intro 之前做了短信发送速度的提升,在大师的指导下,发送短信的速度有了极大的提升,学到了一些提升 .NET 性能的一些小技巧 HttpClient 优化 关于使用 Htt ...

  7. IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题

    IT咨询顾问:一次吐血的项目救火   年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...

  8. OI常用的常数优化小技巧

    注意:本文所介绍的优化并不是算法上的优化,那个就非常复杂了,不同题目有不同的优化.笔者要说的只是一些实用的常数优化小技巧,很简单,虽然效果可能不那么明显,但在对时间复杂度要求十分苛刻的时候,这些小的优 ...

  9. Spring Cloud OpenFeign的原理(六)

    通过上篇我们了解OpenFeign他也可以完成远程通信,但是它并不是真正义意上的RPC通信,因为他是通过封装代理来实现的,下面和以前一样,知道了怎么用就来看下他是怎么实现的. 一.思考Feign要做的 ...

随机推荐

  1. Paxos算法的一个简单小故事

    一.Paxos是什么? Paxos,它是一个基于消息传递的一致性算法,Leslie Lamport在1990年提出,近几年被广泛应用于分布式计算中,Google的Chubby,Apache的Zooke ...

  2. Android点击按钮退出程序并提醒

    效果展示: MainActivity.java import androidx.appcompat.app.AppCompatActivity; import android.app.AlertDia ...

  3. IDEA中 Debug 调试工具(图文详解)

    DEBUG调试工具 一. Debug 调试工具 1. Debug的作用 2. Debug的使用步骤 3. IDEA中Debug按钮详解 总结 参考博文:https://blog.csdn.net/qq ...

  4. Input的校验表达式

    1.只是不能输入空格 <input type="text" onkeyup="this.value=this.value.replace(/^ +| +$/g,'' ...

  5. 什么是3D建模?

    一.3D建模是什么 将所见所想用立体三维的方式通过计算机技术表现出来,这就是3D建模,比如你看到了一个可爱呆萌的卡通人物又或是华丽酷炫的变形金刚,总之就是你认为美好的立体实物 你想将它用计算机技术完美 ...

  6. C语言类型(上)

    前提说明 格式说明:以[signed] int 为例 表明该类型的完整表达是 signed int 只不过signed可以省略 所以 int 也代表 signed int 类型 signed和unsi ...

  7. Java基础之浅谈泛型

    简单的介绍了Java泛型类型的使用.上手容易,深入很难.

  8. Machine Learning 02 学习笔记 卷积、感知机、神经网络

    理解卷积公式. 卷积的物理意义. 图像的卷积操作. 卷积神经网络. 卷积的三层含义. 感知机. 感知机的缺陷. 总结. 神经网络. 缺陷. 激活函数

  9. 【直播回顾】OpenHarmony知识赋能第四期第四课——音频驱动开发

    3月31日晚上19点,知识赋能第四期直播的第四节,也是本期最后一节直播课​<OpenHarmony标准系统HDF框架之音频驱动开发>​,在OpenHarmony开发者成长计划社群内成功举办 ...

  10. MQ系列:消息中间件执行原理

    1 关于消息中间件 1.1 什么是消息中间件? 消息中间件是指在分布式系统中完成消息的发送和接收的基础软件. 消息中间件也可以称消息队列(Message Queue / MQ),用高效可靠的消息传递机 ...