SpringCloud OpenFeign与Ribbon客户端配置详解

 更新时间:2022年11月23日 10:34:01   作者:卡布奇诺-海晨  
在springcloud中,openfeign是取代了feign作为负载均衡组件的,feign最早是netflix提供的,他是一个轻量级的支持RESTful的http服务调用框架,内置了ribbon,而ribbon可以提供负载均衡机制,因此feign可以作为一个负载均衡的远程服务调用框架使用

一、前言

OpenFeign为微服务架构下服务之间的调用提供了解决方案,OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。但是如果请求连接超时、处理请求超时怎么办,如果我们放任不管听之任之势必造成服务雪崩,客户电话打爆投诉,背锅的又会是谁呢?所以本篇文章我们来探究一下超时处理:

二、OpenFeign与Ribbon配置

这里的例子可以在本专栏里面找到,也可以自己手动试试。

1、OpenFeign默认处理请求超时时间

1.1、模拟处理请求0.5秒

    @Override
    public String feign(String str) {
        try {
            // 模拟处理请求超时
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Hello " + str + ":";
    }

用postman请求看下feign调用结果:

可以看到正常执行并返回了结果。 我们继续看下面的一组实验:

1.2、模拟处理请求1秒

    @Override
    public String feign(String str) {
        try {
            // 模拟处理请求超时熔断
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Hello " + str + ":";
    }

用postman请求看下feign调用结果:

响应结果是“网络繁忙,请稍后再试试!!!” ,可见请求超时了会降级处理。所以OpenFeign默认处理请求操作超时时间为1秒。这个时间确实是快了点!

2、Ribbon配置

2.1、配置请求处理超时5秒

ribbon:
  eureka:
    enabled: false #由于使用Nacos,而不是Eureka
  eager-load:
    enabled: true #饥饿加载,系统启动时创建好ribbon客户端而不是在使用时去创建
  ConnectTimeout: 5000 #单位ms,请求连接超时时间 那这里1分钟
  ReadTimeout: 5000 #单位ms,请求处理的超时时间
  OkToRetryOnAllOperations: false #对所有操作请求都进行重试
  MaxAutoRetriesNextServer: 0 #切换实例的重试次数
  MaxAutoRetries: 0 #对当前实例的重试次数
  ServerListRefreshInterval: 2000 #从源刷新服务器列表的间隔
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule

用postman请求看下feign调用结果:

可见Ribbon中配置的超时时间5秒相对于模拟睡眠时间1秒较长,睡眠时间过了处理完请求,返回正常结果。

2.2、模拟请求处理5秒

    @Override
    public String feign(String str) {
        try {
            // 模拟处理请求超时熔断
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Hello " + str + ":";
    }

用postman请求看下feign调用结果:

响应结果是“网络繁忙,请稍后再试试!!!” ,可见请求超时了会降级处理。所以处理请求操作不能时间不能超过Ribbon配置的处理请求超时时间,否则会被降级处理(自己定义降级处理)!

3、OpenFeign配置

3.1、配置请求处理超时6秒

用postman请求看下feign调用结果:feign:
  sentinel:
    enabled: true
    # 设置 feign 超时时间,优先级高于ribbon配置
  client:
    config:
      # default 设置的全局超时时间,指定服务名称可以设置单个服务的超时时间
      default:
        connectTimeout: 6000
        readTimeout: 6000

可见虽然Ribbon中配置的超时时间5秒,但是feign配置的处理请求超时时间为6秒,相对于模拟睡眠时间5秒大于ribbon配置时间小于feign配置时间并且处理完请求,返回正常结果。那么feign的配置覆盖了ribbon配置的超时时间,feign的配置优先级高于ribbon的。

3.2、OpenFeign配置对全部服务有效

feign:
  hystrix:
    # Feign启用断路器,默认为FALSE
    enabled: true
  client:
    config:
      # 针对所有的服务
      default:
        # Feign的连接建立超时时间,默认为10秒
        connectTimeout: 5000
        # Feign的请求处理超时时间,默认为60秒
        readTimeout: 5000
        # 日志级别
        loggerLevel: full
        # 错误解码器
        errorDecoder: com.example.SimpleErrorDecoder
        # 重试策略
        retryer: com.example.SimpleRetryer
        # 拦截器配置(和@Bean的方式二选一)
        requestInterceptors:
          - com.example.FooRequestInterceptor
          - com.example.BarRequestInterceptor
        # 是否对404错误码解码
        # 处理逻辑详见feign.SynchronousMethodHandler#executeAndDecode
        decode404: false
        # 编码器
        encoder: com.example.SimpleEncoder
        # 解码器
        decoder: com.example.SimpleDecoder
        # 契约
        contract: com.example.SimpleContract

注意config下的default。

3.3、针对某个服务

feign:
  hystrix:
    # Feign启用断路器,默认为FALSE
    enabled: true
  client:
    config:
      # 针对某个服务
      ceam-wx:
        # Feign的连接建立超时时间,默认为10秒
        connectTimeout: 5000
        # Feign的请求处理超时时间,默认为60秒
        readTimeout: 5000
        # 日志级别
        loggerLevel: full
        # 错误解码器
        errorDecoder: com.example.SimpleErrorDecoder
        # 重试策略
        retryer: com.example.SimpleRetryer
        # 拦截器配置(和@Bean的方式二选一)
        requestInterceptors:
          - com.example.FooRequestInterceptor
          - com.example.BarRequestInterceptor
        # 是否对404错误码解码
        # 处理逻辑详见feign.SynchronousMethodHandler#executeAndDecode
        decode404: false
        # 编码器
        encoder: com.example.SimpleEncoder
        # 解码器
        decoder: com.example.SimpleDecoder
        # 契约
        contract: com.example.SimpleContract

注意config下的ceam-wx(服务名)。

到此这篇关于SpringCloud OpenFeign与Ribbon客户端配置详解的文章就介绍到这了,更多相关SpringCloud OpenFeign与Ribbon内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot集成EasyExcel的步骤

    SpringBoot集成EasyExcel的步骤

    EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据量大起来容易OOM,解决了POI并发造成的报错。主要解决方式:通过解压文件的方式加载,一行一行的加载,并且抛弃样式字体等不重要的数据,降低内存的占用。
    2021-06-06
  • 详解Java的内存模型

    详解Java的内存模型

    本文更准确的说法应该是JVM的内存模型,但是这里又牵扯了一些其他的前置知识,主要是想从Java入手,从源头上梳理一遍整个Java底层运行的机制,中间会额外补充一些和题目无关的前置基础,导致主讲内存模型的篇幅所占的比例就不是那么绝对。
    2021-06-06
  • SpringBoot关于List集合的校验方式

    SpringBoot关于List集合的校验方式

    这篇文章主要介绍了SpringBoot关于List集合的校验方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • java定义二维数组的几种写法(小结)

    java定义二维数组的几种写法(小结)

    下面小编就为大家带来一篇java定义二维数组的几种写法(小结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(图文)

    Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(图文)

    这篇文章主要介绍了Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(图文),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 详解如何使用ModelMapper库进行对象之间的属性映射

    详解如何使用ModelMapper库进行对象之间的属性映射

    这篇文章主要介绍了如何使用ModelMapper库进行对象之间的属性映射实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java @Accessors注解图文详解

    Java @Accessors注解图文详解

    @Accessors用于改变@Data生成的getter和setter方法的生成结果,下面这篇文章主要给大家介绍了关于Java @Accessors注解的相关资料,需要的朋友可以参考下
    2023-02-02
  • springboot多文件上传代码实例及解析

    springboot多文件上传代码实例及解析

    这篇文章主要介绍了springboot多文件上传代码实例及解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java 类加载机制和反射详解及实例代码

    java 类加载机制和反射详解及实例代码

    这篇文章主要介绍了java 类加载机制和反射详解及实例代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java 8新时间日期库java.time的使用示例

    Java 8新时间日期库java.time的使用示例

    这篇文章主要给你大家介绍了关于Java 8新时间日期库java.time的使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07

最新评论