温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Spring Cloud OpenFeign优化的技巧有哪些

发布时间:2022-05-25 10:15:36 来源:亿速云 阅读:438 作者:zzz 栏目:开发技术

这篇文章主要介绍了Spring Cloud OpenFeign优化的技巧有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Cloud OpenFeign优化的技巧有哪些文章都会有所收获,下面我们一起来看看吧。

    前言:

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

    一、超时优化

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

    如下源码所示:

    Spring Cloud OpenFeign优化的技巧有哪些

    所有当我们使用 OpenFeign 调用了服务接口超过 1s,就会出现以下错误:

    Spring Cloud OpenFeign优化的技巧有哪些

    因为 1s 确实太短了,因此我们需要手动设置 OpenFeign 的超时时间以保证它能正确的处理业务。OpenFeign 的超时时间有以下两种更改方法:

    • 通过修改 Ribbon 的超时时间,被动的修改 OpenFeign 的超时时间。

    • 直接修改 OpenFeign 的超时时间(推荐使用)。

    1、设置Ribbon超时时间

    在项目配置文件 application.yml 中添加以下配置:

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

    2、设置OpenFeign超时时间

    在项目配置文件 application.yml 中添加以下配置:

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

    推荐使用此方式来设置 OpenFeign 的超时时间,因为这样的(配置)语义更明确。

    二、请求连接优化

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

    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、开启Apache HttpClient使用

    启动 Apache HttpClient 组件,在项目配置文件 application.yml 中添加以下配置,:

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

    验证 Apache HttpClient 配置是否生效,可以在 feign.SynchronousMethodHandler#executeAndDecode 方法上打断点就可以看到了,如下图所示:

    Spring Cloud OpenFeign优化的技巧有哪些

    三、数据压缩

    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 增加了额外的负担,也会导致系统性能降低。

    四、负载均衡优化

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

    Spring Cloud OpenFeign优化的技巧有哪些

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

    • 权重策略:  WeightedResponseTimeRule,根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。它的实现原理是,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。

    • 最小连接数策略:  BestAvailableRule,也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。

    • 区域敏感策略:  ZoneAvoidanceRule,根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。

    • 可用敏感性策略:  AvailabilityFilteringRule,先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例。

    • 随机策略:  RandomRule,从服务提供者的列表中随机选择一个服务实例。

    • 重试策略:  RetryRule,按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null。

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

    五、日志级别优化

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

    • NONE:  默认的,不显示任何日志。

    • BASIC:  仅记录请求方法、URL、响应状态码及执行时间。

    • HEADERS:  除了 BASIC 中定义的信息之外,还有请求和响应的头信息。

    • FULL:  除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。

    我们可以通过配置文件来设置日志级别,配置信息如下:

    logging:
      level:
        cn.myjszl.service: debug

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

    关于“Spring Cloud OpenFeign优化的技巧有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Spring Cloud OpenFeign优化的技巧有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI