分享Spring Cloud OpenFeign 的五个优化技巧

目录
  • 一、超时优化
    • 1、设置Ribbon超时时间
    • 2、设置OpenFeign超时时间
  • 二、请求连接优化
    • 1、引入Apache HttpClient依赖
    • 2、开启Apache HttpClient使用
  • 三、数据压缩
  • 四、负载均衡优化
  • 五、日志级别优化
  • 总结

前言:

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

一、超时优化

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

如下源码所示:

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

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

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

  • 通过修改 Ribbon 的超时时间,被动的修改 OpenFeign 的超时时间。
  • 直接修改 OpenFeign 的超时时间(推荐使用)。

1、设置Ribbon超时时间

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

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

2、设置OpenFeign超时时间

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

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

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

二、请求连接优化

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

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、开启Apache HttpClient使用

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

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

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

如下图所示:

三、数据压缩

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 增加了额外的负担,也会导致系统性能降低。

四、负载均衡优化

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

如下图所示:

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

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

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

五、日志级别优化

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

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

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

logging:
  level:
    cn.myjszl.service: debug

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

总结

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

OpenFeign 的运行:

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

到此这篇关于Spring Cloud OpenFeign 的五个优化技巧的文章就介绍到这了,更多相关Spring Cloud OpenFeign 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Springcloud基于OpenFeign实现服务调用代码实例

    1.依赖 <!--引入open feign依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> 2.启动注解 @SpringBootApplication @Enabl

  • 详解SpringCloud-OpenFeign组件的使用

    思考: 使用RestTemplate+ribbon已经可以完成服务间的调用,为什么还要使用feign? String restTemplateForObject = restTemplate.getForObject("http://服务名/url?参数" + name, String.class); 存在问题: 1.每次调用服务都需要写这些代码,存在大量的代码冗余 2.服务地址如果修改,维护成本增高 3.使用时不够灵活 说明 https://cloud.spring.io/sprin

  • 完美解决SpringCloud-OpenFeign使用okhttp替换不生效问题

    事发地 原默认的Feign是使用URLConnector进行通信的,当换为okhttp时,直接引入包及配置以下内容根本不生效,还是走原生的. feign: okhttp: enable: true 事件还原 创建项目并引入pom相关的依赖如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xml

  • 一篇文章教你如何在SpringCloud项目中使用OpenFeign

    目录 OpenFeign的介绍 OpenFeign是一种声明式 .模板化的HTTP客户端. OpenFeign与Feign的之间的关系 OpenFegin中的两个常用注解 在项目中使用OpenFeign 调用关系图 导入依赖 使用注解@FeignClient @EnableFeignClients 注入对象.调用 总结: OpenFeign的介绍 OpenFeign是一种声明式 .模板化的HTTP客户端. 何为声明式? 就像调用本地方法一样调用远程方法,无需感知操作远程http请求. 何为模板化

  • Spring Cloud详解实现声明式微服务调用OpenFeign方法

    目录 OpenFeign介绍 项目实战 创建项目 启动项目验证 总结 OpenFeign介绍 一开始,我们使用原生的 DiscoveryClient 发现服务和使用RestTemplate进行服务间调用,然后我们自己手动开发了一个负载均衡组件,最后介绍了负载均衡组件Ribbon.每个章节调用服务的方式也有所不同,共同点则是都是基于RestTemplate 来实现的,想必大家都会觉得这样的调用方式有点麻烦,每次调用前都要写请求协议,服务名称,接口名称.组装参数.处理响应数据类型,这些都是一些重复的

  • SpringCloud学习笔记之OpenFeign进行服务调用

    目录 前言 1.OpenFeign 1.1.OpenFeign概述 1.2.OpenFeign的使用步骤 1.3.超时控制 1.3.1.是什么? 1.3.2.修改代码设置超时错误 1.3.3.进行超时配置 1.4.日志打印 1.4.1.是什么? 1.4.2.日志级别 1.4.3.如何开启日志打印 总结 前言 Feign是一个声明式的Web服务客户端,是面向接口编程的.也就是说使用Feign,只需要创建一个接口并使用注解方式配置它,就可以完成对微服务提供方的接口绑定. 在使用RestTemplat

  • Spring Cloud 系列之服务调用 OpenFeign的实现

    1.1 简介 1.1.1 概述   Feign 旨在使编写 Java Http 客户端变得更容易.在使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 http 请求的封装处理,形成了一套模版化的调用方法.但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用.所以,Feign 在 Ribbon 基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义.在

  • 解决启用 Spring-Cloud-OpenFeign 配置可刷新项目无法启动的问题

    本篇文章涉及底层设计以及原理,以及问题定位,比较深入,篇幅较长,所以拆分成上下两篇: 上:问题简单描述以及 Spring Cloud RefreshScope 的原理 下:当前 spring-cloud-openfeign + spring-cloud-sleuth 带来的 bug 以及如何修复 最近在项目中想实现 OpenFeign 的配置可以动态刷新(主要是 Feign 的 Options 配置),例如: feign: client: config: default: # 链接超时 conn

  • SpringCloud OpenFeign超详细讲解模板化远程通信的实现

    目录 1. openFeign实现 1.1 pom依赖 1.2 yaml配置 1.3 客户端调用代码 1.4.服务端暴露接口 1.5.测试日志 1. openFeign实现 基于spring-boot-starter-parent 2.6.8,spring-cloud-dependencies 2021.0.3,一个order服务一个user服务 1.1 pom依赖 <!--nacos服务注册与发现--> <dependency> <groupId>com.alibab

  • Spring Cloud OpenFeign模版化客户端

    OpenFeign是什么? OpenFeign是一个显示声明式的WebService客户端.使用OpenFeign能让编写Web Service客户端更加简单.使用时只需定义服务接口,然后在上面添加注解.OpenFeign也支持可拔插式的编码和解码器.spring cloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts.和eureka(服务注册中心)和ribbon组合可以实现负载均衡.在Spring Cloud中使用OpenFeign,可以做到使用HTTP请

随机推荐