Spring Cloud OpenFeign 优化

229 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

OpenFeign 是 Spring 官方推出的一种声明式服务调用负载均衡组件。它的出现就是为了替代已经进入停更维护状态的 Feign(Netflix Feign),同时它也是 Spring 官方的顶级开源项目。

超时优化

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

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

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

设置 Ribbon 超时时间

application.yml

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

设置 OpenFeign 超时时间

application.yml

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

请求连接优化

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

引入 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>

开启Apache HttpClient使用

application.yml

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

数据压缩

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 的资源。

负载均衡优化

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

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

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

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

日志级别优化

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

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

application.yml

logging:
  level:
    cn.myjszl.service: debug

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