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


    OpenFeign可配置事项

    日志配置

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

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

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

    异常解码器

    在这里插入图片描述
    Feign 中提供了异常的解码器,但我们也可以自定义异常解码器,自定义异常解码器可以用于内部服务之间调用的异常传递。比如说 A 服务调用 B 服务,B 服务中出现异常后,会由 B 服务中的全局异常处理器进行处理,然后返回给 A 服务的数据格式是固定的 code 是多少,message 是什么。

    拦截器

    在这里插入图片描述
    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 
    
    • 1
    • 2
    • 3
    • 4

    开启默认的 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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    替换默认通信组件

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

    > 
        >io.github.openfeign> 
        >feign-okhttp> 
        >11.0> 
    > 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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); 
        } 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3.在 application.yml 中启用 OkHttp。

    feign: 
      okhttp: 
        enabled: true 
    
    • 1
    • 2
    • 3

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

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

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

    在这里插入图片描述

  • 相关阅读:
    现代循环神经网络 - 机器翻译与数据集
    进程间通信(27000字超详解)
    [附源码]java毕业设计基于SSM高考志愿填报系统
    Win10纯净版和官方原版哪个好?
    扩容领跑者 Arbitrum 抢占 Layer3 竞争高地
    c++中的定位new表达式
    0006__js库中文版
    Mac 卸载 PyCharm 方法
    k8s-7部署kube-state-metrics监控组件
    python 循环绘制子图时,设置共享x、y轴
  • 原文地址:https://blog.csdn.net/qq_35427589/article/details/126207401