原创

OpenFeign的高级特性


一、引言

在微服务架构中,OpenFeign 作为一款强大的声明式 HTTP 客户端工具,为服务间的通信提供了便捷高效的方式。除了基本的远程调用功能,OpenFeign 还具备许多高级特性,如超时控制、重试机制、默认 HttpClent 修改、请求/响应压缩以及日志打印功能。这些特性能够进一步优化服务间的通信质量和效率,提升系统的稳定性和可靠性。

二、超时控制

在分布式系统中,由于网络延迟或服务繁忙等原因,请求可能会出现长时间未响应的情况。为了避免这种情况导致的系统阻塞,我们可以使用 OpenFeign 的超时控制特性。

默认连接超时时长和读超时时长都是60秒,可以通过以下配置进行更改。

spring:
  application:
    name: cloud-consumer-openfeign-order
  cloud:
    consul:
      discovery:
        service-name: ${spring.application.name}
        prefer-ip-address: true #优先使用IP进行注册
      host: localhost
      port: 8500
    openfeign:
      client:
        config:
          default: #全局通用配置
            connect-timeout: 15000  #连接超时时间,单位毫秒,默认60秒
            read-timeout: 15000 #读取超时时间,单位毫秒,默认60秒
          cloud-payment-service: #自定义接口配置,注册的服务名,优先级大于通用配置
            connect-timeout: 10000  #连接超时时间,单位毫秒,默认60秒
            read-timeout: 10000 #读取超时时间,单位毫秒,默认60秒

通过上述代码,我们可以设置连接超时和读取超时的时间,确保在规定时间内未得到响应时能够及时处理异常。

例如,如果某个服务的响应时间通常在 2 秒内,但偶尔会因为特殊情况延长到 4 秒,我们可以将读取超时时间设置为 5 秒,以应对这种偶发情况。

全局通用配置使用default,个性接口配置需要指定服务注册的名称进行配置。当两个配置同时存在时,个性化配置优先级大于通用配置

三、重试机制

当请求由于短暂的网络波动或服务暂时不可用而失败时,重试机制可以提高请求的成功率。

默认重试是关闭的,可以通过以下方式开启。

@Configuration
public class FeignConfig {

    @Bean
    public Retryer feignRetryer() {
        // Feign默认配置不开重试机制
        // return Retryer.NEVER_RETRY;
        
        // 最大请求次数3次(1(default) + 2(retry)),初始间隔时间为100毫秒,重试期间最大间隔时间为1秒
        return new Retryer.Default(100, 1, 3);
    }
}

在上述代码中,我们设置了初始重试间隔为 100 毫秒,最大重试次数为 2 次,最大重试间隔为 1000 毫秒。

比如,对于一个重要但非关键的请求,我们可以适当增加重试次数和重试间隔,以提高请求成功的机会。

四、默认 HttpClent 修改

OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求,默认的HttpURLConnection没有连接池、性能和效率比较低。

通过以下配置,使用Apache HttpClient5替换后,性能可以得到提升。

修改pom.xml文件

<!-- Apache httpclient5 -->
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3</version>
</dependency>
<!-- feign-hc5 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-hc5</artifactId>
    <version>13.1</version>
</dependency>

修改application.yml文件

spring:
  cloud:
    openfeign:
      httpclient:
        hc5:
          enabled: true

五、请求/响应压缩

请求/响应可以使用GZIP压缩以减少网络传输的数据量,提高通信效率。

修改application.yml文件

spring:
  cloud:
    openfeign:
      compression:
        request:
          enabled: true
          min-request-size: 2048 #最小触发压缩的大小
          mime-types: text/xml,application/xml,application/json #触发压缩数据类型
        response:
          enabled: true

当数据量较大(设置超过2K)时,启用压缩可以显著减少传输时间和带宽消耗。

比如,在传输大量文本数据或二进制文件时,压缩能够带来明显的性能提升。

六、日志打印功能

良好的日志记录对于调试和监控服务间的通信至关重要。Feign提供了日志打印功能,可以通过配置来调整日志级别,从而了解Feign中Http请求的细节,也就是对Feign接口的调用情况进行监控和输出。

日志级别:

  • NONE:默认的,不显示任何日志
  • BASIC:仅记录请求方法、URL、响应状态及执行时间
  • HEADERS:除了BASIC中定义的数据外,还记录请求和响应的头信息
  • FULL:除了HEADERS中定义的数据外,还记录请求和响应的正文及元数据

修改application.yml文件

logging:
  level:
    com:
      atguigu:
        cloud:
          apis:
            PayFeignApi: debug

修改feign配置文件

@Configuration
public class FeignConfig {

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

通过设置日志级别为 FULL ,我们可以获取详细的请求和响应信息。

例如,在排查通信故障时,详细的日志能够帮助我们快速定位问题所在。

七、总结

OpenFeign 的这些高级特性为我们在微服务架构中的服务通信提供了强大的工具和灵活性。通过合理地配置和使用超时控制、重试机制、默认 HttpClent 修改、请求/响应压缩以及日志打印功能,我们能够构建更稳定、高效和可靠的微服务系统。

SpringCloud
  • 作者:一介闲人(联系作者)
  • 发表时间: 2024-08-29 19:15
  • 版权声明:原创-转载需保持署名
  • 公众号转载:请在文末添加本文链接
  • 评论