• 谈谈Spring Cloud OpenFeign远程调用性能优化


    前沿

    FeignNetflix公司写的,是SpringCloud组件中的一个轻量级RESTful的HTTP服务客户端,是SpringCloud中的第一代负载均衡客户端。OpenFeign是Spring官方推出的一种声明式服务调用和负载均衡组件,它的出现就是为了替代已经进入停更维护状态的Feign(Netflix Feign),OpenFeign作为远程调用组件在微服务扮演着头等重要的角色。

    本文主要是分享一下OpenFeign几个方面优化的小技巧,主要分为以下几点:

    • 请求通讯连接优化
    • 超时优化
    • 负载均衡
    • 数据压缩
    • 日志级别优化

    一、请求通讯连接优化

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

    1.1 添加pom依赖

    1. <!-- 添加 openfeign 框架依赖 -->
    2. <dependency>
    3. <groupId>org.springframework.cloud</groupId>
    4. <artifactId>spring-cloud-starter-openfeign</artifactId>
    5. </dependency>
    6. <!-- 添加 httpclient 框架依赖 -->
    7. <dependency>
    8. <groupId>io.github.openfeign</groupId>
    9. <artifactId>feign-httpclient</artifactId>
    10. </dependency>

    1.2 开启Apache HttpClient使用

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

    1. spring:
    2. cloud:
    3. feign:
    4. client:
    5. httpclient:
    6. # 默认Feign使用的是JDK自带的URLConnection进行Http请求的,手动替换成Apache HttpClient专用的通信组件
    7. enabled: true

    验证Apache HttpClient配置是否生效,通过debug调试,在feign.SynchronousMethodHandler#executeAndDecode()方法上打端断点,通过发起一个远程调用请求,在没配置替换前,是这样的:

    配置替换后,可以看看默认使用的client是已经被替换成Apache HttpClient:

     

     

    二、Ribbon超时优化

    OpenFeignFeign底层都内置了Ribbon负载均衡组件,在导入OpenFeign依赖后无需专门导入Ribbon依赖。OpenFeign也因此使用了Ribbon的请求连接超时时间和请求处理超时时间作为其超时时间,而Ribbon默认的请求连接超时时间和请求处理超时时间都是1s,如下源码所示:

    所以我们使用OpenFeign远程调用微服务接口响应时间超过1s时,就会出以下报错:

    2.1 设置OpenFeign调用超时时间

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

    1. # 远程调用优化
    2. feign:
    3. client:
    4. httpclient:
    5. # 默认Feign使用的是JDK自带的URLConnection进行Http请求的,手动替换成Apache HttpClient专用的通信组件
    6. enabled: true
    7. config:
    8. default: # 设置的全局超时时间
    9. connectTimeout: 3000 # 请求连接的超时时间
    10. readTimeout: 5000 # 请求处理的超时时间

    2.2 设置Ribbon超时时间

    1. ribbon:
    2. ConnectionTimeout: 3000 # 请求连接的超时时间
    3. ReadTimeout: 5000 # 请求处理的超时时间

    通过debug的方式验证以下设置的超时时间是否生效,很明显配置已经生效,主要看org.springframework.cloud.openfeign.FeignClientFactoryBean#configureUsingProperties()方法,源码如下图所示:

    再次调用发现已经不会再报请求超时的异常了!

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

    三、数据压缩

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

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

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

    四、负载均衡优化

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

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

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

    五、OpenFeign调用日志级别优化

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

    • NONE【性能最佳,适用于生产】: 默认的,不显示任何日志。
    • BASIC【适用于生产环境追踪问题】: 仅记录请求方法、URL、响应状态码及执行时间。
    • HEADERS【适用于需查看请求头信息】: 除了BASIC中定义的信息之外,还有请求和响应的头信息。
    • FULL【比较适用于开发级测试环境定位问题】: 除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。

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

    1. logging:
    2. level:
    3. com.jacklin.mamba.contentcenter.post.feignClient.UserCenterFeignClient: debug # feign的自定义接口

    六、总结

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

    1. 修改OpenFeign的超时时间,让OpenFeign能够正确的处理业务;
    2. 通过配置专用的通信组件Apache HttpClientOKHttp,让OpenFeign可以通过线程池更好地对 HTTP连接对象进行重用和管理,以提高其性能;
    3. 开启数据压缩功能,可以提高宽带利用率和加速数据传输速度;
    4. 使用合适的负载均衡策略来替换默认的轮询负载均衡策略,已获得更好的执行效率;
    5. 检查生成环境中OpenFeign的日志级别,选择合适的日志输出级别,防止无效的日志输出。
  • 相关阅读:
    第3关:节点状态检查、数据查看和更新
    [NLP Begin] Classical NLP Methods - HMM
    MAX17058_MAX17059 STM32 iic 驱动设计
    [leetCode152]乘积最大子数组
    【前后缀技巧】2022牛客多校3 A
    Go语学习笔记 - gorm使用 - 数据库配置、表新增 Web框架Gin(七)
    2024字节跳动校招面试真题汇总及其解答(四)
    OpenCV官方教程中文版 —— 模板匹配
    Mysql间隙锁
    电脑提示iutils.dll丢失的解决方法,分享5种靠谱的解决方法
  • 原文地址:https://blog.csdn.net/weixin_62421895/article/details/126481931