共计 3334 个字符,预计需要花费 9 分钟才能阅读完成。
OpenFeign 是 Spring 官网推出的一种申明式服务调用和负载平衡组件。它的呈现就是为了代替曾经进入停更保护状态的 Feign(Netflix Feign),同时它也是 Spring 官网的顶级开源我的项目。咱们在日常的开发中应用它的频率也很高,而 OpenFeign 有一些实用的小技巧,配置之后能够让 OpenFeign 更好的运行,所以本文咱们就来盘点一下(也欢送各位老铁评论区留言补充)。
1. 超时优化
OpenFeign 底层内置了 Ribbon 框架,并且应用了 Ribbon 的申请连贯超时工夫和申请解决超时工夫作为其超时工夫,而 Ribbon 默认的申请连贯超时工夫和申请解决超时工夫都是 1s,如下源码所示:
所有当咱们应用 OpenFeign 调用了服务接口超过 1s,就会呈现以下谬误:
因为 1s 的确太短了,因而咱们须要手动设置 OpenFeign 的超时工夫以保障它能正确的解决业务。
OpenFeign 的超时工夫有以下两种更改办法:
- 通过批改 Ribbon 的超时工夫,被动的批改 OpenFeign 的超时工夫。
-
间接批改 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 种内置的负载平衡策略能够抉择,这些负载平衡策略如下:
- 权重策略:WeightedResponseTimeRule,依据每个服务提供者的响应工夫调配一个权重,响应工夫越长,权重越小,被选中的可能性也就越低。它的实现原理是,刚开始应用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的均匀响应工夫,而后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。
- 最小连接数策略:BestAvailableRule,也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有雷同的最小连接数,那么会调用轮询策略进行选取。
- 区域敏感策略:ZoneAvoidanceRule,依据服务所在区域(zone)的性能和服务的可用性来抉择服务实例,在没有区域的环境下,该策略和轮询策略相似。
- 可用敏感性策略:AvailabilityFilteringRule,先过滤掉非衰弱的服务实例,而后再抉择连接数较小的服务实例。
- 随机策略:RandomRule,从服务提供者的列表中随机抉择一个服务实例。
- 重试策略: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 的运行:
- 批改 OpenFeign 的超时工夫,让 OpenFeign 可能正确的解决业务;
- 通过配置专用的通信组件 Apache HttpClient 或 OKHttp,让 OpenFeign 能够更好地对 HTTP 连贯对象进行重用和治理,以进步其性能;
- 开启数据压缩性能,能够进步宽带利用率和减速数据传输速度;
- 应用适合的负载平衡策略来替换默认的轮询负载平衡策略,已取得更好的执行效率;
- 查看生成环境中 OpenFeign 的日志级别,抉择适合的日志输入级别,避免有效的日志输入。
参考 && 鸣谢
juejin.cn/post/7010555899240513543
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java 中文社群
Java 面试合集:https://gitee.com/mydb/interview