【云原生】SpringCloud系列之服务调用OpenFeign(日志配置、异常解码器、更改负载均衡策略、替换默认通信组件等)

1年前 (2023) 程序员胖胖胖虎阿
110 0 0

文章目录

    • OpenFeign可配置事项
      • 日志配置
      • 异常解码器
      • 拦截器
      • 更改 OpenFeign 默认的负载均衡策略
      • 开启默认的 OpenFeign 数据压缩功能
      • 替换默认通信组件

OpenFeign可配置事项

日志配置

当 API 调用失败后,需要有详细的请求信息来分析失败原因,我们可以设置 Feign 的日志级别来输出详细的请求信息,Feign 的日志级别有四种:

  • NONE 表示不输出日志。
  • BASIC 表示只输出请求方法的 URL 和响应的状态码以及执行的时间。
  • HEADERS 将 BASIC 信息和请求头信息输出。
  • FULL 会输出全部完整的请求信息。

了解了日志级别后,我们就可以为 Feign Client 设置不同的级别了,级别不同输出的请求信息的详细程度也不一样,后面的课时我会介绍动态的去调整日志级别,这样在平时是不输出日志的,一旦需要排查问题的时候就可以动态的将日志打开,非常方便。

异常解码器

【云原生】SpringCloud系列之服务调用OpenFeign(日志配置、异常解码器、更改负载均衡策略、替换默认通信组件等)
Feign 中提供了异常的解码器,但我们也可以自定义异常解码器,自定义异常解码器可以用于内部服务之间调用的异常传递。比如说 A 服务调用 B 服务,B 服务中出现异常后,会由 B 服务中的全局异常处理器进行处理,然后返回给 A 服务的数据格式是固定的 code 是多少,message 是什么。

拦截器

【云原生】SpringCloud系列之服务调用OpenFeign(日志配置、异常解码器、更改负载均衡策略、替换默认通信组件等)
Feign 中提供了拦截器机制,我们可以添加自己的拦截器来实现某些场景下的需求。BasicAuth 在 Feign 中默认提供了拦截器,我们只需要配置一下就可以使用,如果我们需要自定义拦截器,可以参考 BasicAuth 的代码,只要实现 RequestInterceptor 接口,在 apply 方法中编写你自己的逻辑就可以了,通过 RequestTemplate 可以进行很多操作,比如添加指定的请求头信息,这个可以用在服务间传递某些信息的时候。

更改 OpenFeign 默认的负载均衡策略

前面提到,在 OpenFeign 使用时默认引用 Ribbon 实现客户端负载均衡。那如何设置 Ribbon 默认的负载均衡策略呢?在 OpenFeign 环境下,配置方式其实与之前 Ribbon+RestTemplate 方案完全相同,只需在 application.yml 中调整微服务通信时使用的负载均衡类即可。

warehouse-service: #服务提供者的微服务ID 
  ribbon: 
    #设置对应的负载均衡类 
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule 

开启默认的 OpenFeign 数据压缩功能

在 OpenFeign 中,默认并没有开启数据压缩功能。但如果你在服务间单次传递数据超过 1K 字节,强烈推荐开启数据压缩功能。默认 OpenFeign 使用 Gzip 方式压缩数据,对于大文本通常压缩后尺寸只相当于原始数据的 10%~30%,这会极大提高带宽利用率。但有一种情况除外,如果应用属于计算密集型,CPU 负载长期超过 70%,因数据压缩、解压缩都需要 CPU 运算,开启数据压缩功能反而会给 CPU 增加额外负担,导致系统性能降低,这是不可取的。

feign: 
  compression: 
    request: 
      # 开启请求数据的压缩功能 
      enabled: true 
      # 压缩支持的MIME类型 
      mime-types: text/xml,application/xml, application/json 
      # 数据压缩下限 1024表示传输数据大于1024 才会进行数据压缩(最小压缩值标准) 
      min-request-size: 1024 
    # 开启响应数据的压缩功能 
    response: 
      enabled: true 

替换默认通信组件

OpenFeign 默认使用 Java 自带的 URLConnection 对象创建 HTTP 请求,但接入生产时,如果能将底层通信组件更换为 Apache HttpClient、OKHttp 这样的专用通信组件,基于这些组件自带的连接池,可以更好地对 HTTP 连接对象进行重用与管理。作为 OpenFeign 目前默认支持 Apache HttpClient 与 OKHttp 两款产品。我以OKHttp配置方式为例,为你展现配置方法。
1.引入 feign-okhttp 依赖包。

<dependency> 
    <groupId>io.github.openfeign</groupId> 
    <artifactId>feign-okhttp</artifactId> 
    <version>11.0</version> 
</dependency> 

2.在应用入口,利用 Java Config 形式初始化 OkHttpClient 对象。

@SpringBootApplication 
@EnableFeignClients 
public class OrderServiceApplication { 
    //Spring IOC容器初始化时构建okHttpClient对象 
    @Bean 
    public okhttp3.OkHttpClient okHttpClient(){ 
        return new okhttp3.OkHttpClient.Builder() 
                //读取超时时间 
                .readTimeout(10, TimeUnit.SECONDS) 
                //连接超时时间 
                .connectTimeout(10, TimeUnit.SECONDS) 
                //写超时时间 
                .writeTimeout(10, TimeUnit.SECONDS) 
                //设置连接池 
                .connectionPool(new ConnectionPool()) 
                .build(); 
    } 
    public static void main(String[] args) { 
        SpringApplication.run(OrderServiceApplication.class, args); 
    } 
} 

3.在 application.yml 中启用 OkHttp。

feign: 
  okhttp: 
    enabled: true 

做到这里,我们已将OpenFeign的默认通信对象从URLConnection调整为OKHttp,至于替换为HttpClient组件的配置思路是基本相同的。

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
主页:共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

【云原生】SpringCloud系列之服务调用OpenFeign(日志配置、异常解码器、更改负载均衡策略、替换默认通信组件等)

相关文章

暂无评论

暂无评论...