OpenFeign是Spring官方推出的声明式服务调用和负载均衡组件。它的出现是为了取代进入维护状态的Feign(NetflixFeign),同时也是Spring官方的顶级开源项目。我们在日常开发中经常用到它,而OpenFeign有一些实用的小技巧,可以让OpenFeign在配置后更好的运行,所以这篇文章我们来盘点一下(也欢迎大家在老铁评论区留言补充).1.超时优化OpenFeign底层内置了Ribbon框架,使用Ribbon的请求连接超时和请求处理超时作为自己的超时时间,Ribbon默认的请求连接超时和请求处理超时都是1s,如图以下源码显示:当我们使用OpenFeign调用服务接口超过1s时,会出现如下错误:因为1s确实太短了,所以我们需要手动设置OpenFeign的超时时间,以保证其能够正确处理业务.改变OpenFeign的超时时间有两种方式:通过修改Ribbon的超时时间来被动修改OpenFeign的超时时间。直接修改OpenFeign的timeout(推荐)。1.1设置Ribbon超时时间在项目配置文件application.yml中添加如下配置:ribbon:ReadTimeout:5000#请求连接超时时间ConnectionTimeout:10000#请求处理超时时间1.2设置OpenFeign超时时间在项目配置文件application.yml中添加如下内容configuration:feign:client:config:default:#设置全局超时时间connectTimeout:2000#请求连接超时时间readTimeout:5000#请求处理超时时间建议使用该方法设置OpenFeign超时时间,因为这样(配置)语义更明确。2、请求连接优化OpenFeign的底层通信组件默认使用JDK自带的URLConnection对象进行HTTP请求。因为没有使用连接池,所以性能不是很好。我们可以手动将OpenFeign的通信组件替换为ApacheHttpClient或OKHttp等专用通信组件。这些专用的通信组件都有自己的连接池,可以更好的重用和管理HTTP连接对象,也可以大大提高HTTP。请求的效率。下面我将以ApacheHttpClient为例,演示专用通信组件的使用。2.1引入ApacheHttpClient依赖在项目的依赖管理文件pom.xml中添加如下配置:cloud-starter-openfeignio.github.openfeignfeign-httpclient2.2打开ApacheHttpClient使用ApacheHttpClient组件启动,在项目配置文件application.yml中添加如下配置:feign:client:httpclient:#openHttpClientenabled:true验证ApacheHttpClient配置是否生效,可以使用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,根据服务所在区域的性能和服务的可用性来选择服务实例。在没有区域的环境中,此策略类似于轮询策略。可用的敏感度策略: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能够正确处理业务;通信组件ApacheHttpClient或OKHttp让OpenFeign更好地重用和管理HTTP连接对象,以提高其性能;启用数据压缩以提高宽带利用率并加快数据传输;使用合适的负载均衡策略来替代默认的round-robin负载均衡策略,以达到更好的执行效率;检查生产环境OpenFeign的日志级别,选择合适的日志输出级别,防止无效的日志输出。参考&&致谢juejin.cn/post/7010555899240513543判断是非在自己,听别人说,得失看数字。公众号:Java中文社区Java访谈合集:https://gitee.com/mydb/interview