关于java:Spring-Cloud-OpenFeign-的-5-个优化小技巧

3次阅读

共计 3334 个字符,预计需要花费 9 分钟才能阅读完成。

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

正文完
 0