2

Spring Cloud OpenFeign 的 5 个优化小技巧! - Java中文社群

 2 years ago
source link: https://www.cnblogs.com/vipstone/p/16309034.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

1.超时优化

OpenFeign 底层内置了 Ribbon 框架,并且使用了 Ribbon 的请求连接超时时间和请求处理超时时间作为其超时时间,而 Ribbon 默认的请求连接超时时间和请求处理超时时间都是 1s,如下源码所示:
image.png
所有当我们使用 OpenFeign 调用了服务接口超过 1s,就会出现以下错误:
image.png
因为 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 方法上打断点就可以看到了,如下图所示:
    image.png

    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 做负载均衡的,查看源码我们可以看到它默认的负载均衡策略是轮询策略,如下图所示:
image.png
然而除了轮询策略之外,我们还有其他 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK