一、feign超时配置失效

最近项目上遇见feign超时配置总是失效。导致feign调用超过2s之后就会超时,会进行自动重试,重复调用两次服务,并且还是指定接口。这就更加奇怪。最后通过观察以及源码调试,发现问题所在。在这里先说下原因。

原因:同一个服务feign组件做了拆分,使用contextId对feign拆分后的feign做了声明。配置超时配置的时候,不能再使用feign组件注解 @FeignClient里的name去做配置了,而应该是contextId里的名称

示例代码:

//A服务的基础业务接口
@FeignClient(contextId = "AServer", name = "AServer", configuration = FeignConfiguration.class)
public interface ABaseServer { } //A服务的个性化业务接口
@FeignClient(contextId = "ASpecialServiceServer", name = "AServer", configuration = FeignConfiguration.class)
public interface ASpecialServer { } //上面是对feign拆分后的声明
//错误的yml配置
feign:
client:
config:
#这里仍然使用了name作为超时配置,那么只有ABaseServer 里面声明的接口才会使用以下的配置,因为恰巧ABaseServer的contextId名称是AServer。
AServer:
connectTimeout: 60000
readTimeout: 60000 //正确的yml配置,手段一:配置上以contextId为声明来配置
feign:
client:
config:
#基础业务接口的超时配置
AServer:
connectTimeout: 60000
readTimeout: 60000
#个性化业务接口的超时配置
ASpecialServiceServer:
connectTimeout: 50000
readTimeout: 50000 //正确的yml配置,手段二:A服务全部使用default全局配置,Bserver单独声明,并不会使用全局配置
feign:
client:
config:
default:
connectTimeout: 60000
readTimeout: 60000
BServer:
connectTimeout: 30000
readTimeout: 30000

feign内部集成了ribbon做为了负载均衡的组件,ribbon也有相关超时配置,feign的超时配置不当也会造成超时失效,关于如何配置可以参考之前的一篇博客:https://www.cnblogs.com/wa1l-E/p/13994240.html

这次feign的超时不生效,主要原因是,项目上做了一次feign的拆分,即A服务调用B服务的接口由于过多,接口从功能模块和业务上做了feign组件的拆分,也就是spring容器中会有两个feign针对同一个服务。

问题1:拆分后,springboot在启动时,会报错,原因是针对同一个服务有多个feign 实例,而spring容器又默认是单例加载。

解决这个问题有两个方案:

1、

2、在feign注解定义上加上contextId来避免启动报错。示例代码如下:

@FeignClient(name = "A", contextId = "ABaseServiceServer", configuration = FeignConfiguration.class)
public interface AServer { } @FeignClient(name = "A", contextId = "ACustomServiceServer", configuration = FeignConfiguration.class)
public interface AServer { }

都是同一个服务的feign组件,但是contextId不同,解决了问题。

项目上采用了第二种解决手段,但也正是因为对解决问题没有做到追根刨底的精神,导致引入了feign超时失效的原因。

问题2:使用ContextId对feign做声明后,导致部分接口超时失效。

结论:在开篇时,结论已经说过,这里就不再赘述。主要说下原因以及定位问题的过程和解决方法。

定位过程:发现该问题时,首先发现是部分接口失效,当然是测试并观察,发现只有未使用contextId配置的feign组件的接口会超时。但是当时并不知道是contextId的声明影响。所以果断开撕源码。定位问题

首先Feign有一个内部类Builder,听名字就知道使用了建造者是设计模式,建造者适合创造属性多变的对象, 而Feign恰好具备这种特性,使用建造者设计模式在适合不过了。

Builder类有一个属性Options option这个Options类就是feign的超时配置声明。如下图:

    再来看一下UML图

    可以看到真正的配置就是再容器初始话feign的时候,初始化 builder的时候使用的配置就是真正使用的配置。那么接下来就好办了,使用我之前讲过的源码调试大法,开始调试,启动服务,断点开启,最后一路追踪,发现实例化的代码如下:

     不知道启动后怎么调试找到相关代码的同学可以参考另一篇博客:https://www.cnblogs.com/wa1l-E/p/14115042.html   还是一句话,动手多实践。

    

    97行见名其义:初始化Feign.builder,109行是关键代码,看名字就知道,配置feign,那么builder的option一定是在这里初始化的,我们一路追进去看看

到了上面的方法中,我们发现了尤其重要的两行代码,看名字就知道使用configure配置属性,那么在这里一定是使用配置去初始话Feign的超时相关配置,没有的话会使用默认的配置。
这里的方法就不赘述了,有兴趣的同学可以去断点看看,最关键的另一个发现是 在获取配置的时候,使用的是
contextId,这不由得和上面Feign注解 @FeignClient中声明的contextId关联起来,最后通过调试也发现,确实是这样。contextId源码注释是bean的显实声明名称,如果不配置默认使用beanName.到这里就发现问题了。
那么解决手段就简单了

解决手段:

手段一:如果拆分后的接口不需要做特殊的超时配置区分,那么使用default全局配置既可,至于其他的feign客户端,在做配置,便不会使用全局的配置。

手段二:如果拆分后的接口,超时配置是不一样的,那么使用contextId做超时配置才是正确的。

最后建议实际使用手段二,粒度更细。

二、Hystrix配置实战:

首先介绍一下上面Feign超时后,Hystrix配置后,会自动重试的原因,然后再介绍一下Hystrix的主要配置,搭建一个Hstrix-dashboard,然后通过一个接口的测试,通过dashBoard观察Hystrix的配置的。

1、Hystrix的配置

熔断配置:

#hystrix熔断器配置:(接口发生异常,服务调用方直接做熔断处理,返回提示,避免流量过大接口调用引起雪崩。)

#如果接口发生异常,那么会熔断,熔断开启。后面的请求不会再去进行服务远程调用,直接走熔断
#下面配置策略是: 10s滚动窗口期内,大于等于1个线程 失败率超过百分之50,则打开熔断开关.负责关闭熔断开关
#熔断开关打开后,后续请求直接走熔断,不会进行远程调用
hystrix.command.default.circuitBreaker.requestVolumeThreshold=1
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=10000
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
#在5s后,熔断会进入 半开状态,会放入一部分请求进行远程调用,如果成功,则关闭熔断.如果失败,则继续打开熔断
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000

降级配置:

#hystrix降级配置:(接口发生异常,服务调用方直接对接口进行降级处理,返回托底数据。和熔断的区别是一个有托底数据,一个没有。)
#超时打开,设置为70s,这里的超时时间必须大于Ribbon和feign的超时,因为小于Feign正常调用超时时间,直接会熔断.
hystrix.command.default.execution.timeout.enabled=true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=70000

2、配置Hystrix-dashboard调试Hystrix熔断和降级配置

  • 搭建Hystrix-dashboard: 没空的同学可以直接下载我之前搭建的: https://github.com/coffeebabeCGG/spring-cloud 这里就不赘述如何搭建了
  • 启动项目后,需要填如要监控的服务地址:http://ip:port/context-path/actuator/hystrix.stream
  • 从下图可以看到queryByPage接口的熔断目前是关闭状态。关于dashboard的详细参数说明,下面给大家补一张图。

最后:接口postMan的runtest批量调用接口测试,通过dashBoard观察接口的熔断情况,配置是否生效。就可以了解Hystrix的基本使用了。

Hystrix配置实战及feign超时配置失效的更多相关文章

  1. Spring cloud 超时配置总结

    基准配置: eureka-server : 注册中心 端口号1000 service-A : 服务A端口号2000 service-B : 服务B 端口号3000 其中,B服务通过feign调用服务A ...

  2. Hystrix 超时配置的N种玩法

    前阵子在我的知识星球中,有位朋友对我提了个问题,问我如何让Hystrix支持对接口级别的超时配置,今天给大家写篇文章,普及下Hystrix配置超时的几种方式. 至于以后你是用阿里的Sentinel还是 ...

  3. Feign 失败降级未生效和超时配置优先级问题

    一.问题: 生产环境服务A 通过feign调用 服务B,服务A报警信息如下: 详细分析发现问题 (1)服务A调用服务B失败,未触发声明的失败降级操作 (2)同时配置ribbon和feign超时时间,优 ...

  4. spring coud Feign常用配置

    Ribbon配置 在Feign中配置Ribbon非常简单,直接在application.properties中配置即可,如: # 设置连接超时时间 ribbon.ConnectTimeout=500 ...

  5. Spring Cloud Feign 自定义配置(重试、拦截与错误码处理) 实践

    Spring Cloud Feign 自定义配置(重试.拦截与错误码处理) 实践 目录 Spring Cloud Feign 自定义配置(重试.拦截与错误码处理) 实践 引子 FeignClient的 ...

  6. redis 集群配置实战

    文章转载自:http://hot66hot.iteye.com/blog/2050676 最近研究Redis-cluster,正好搭建了一个环境,遇到了很多坑,系统的总结下,等到redis3 rele ...

  7. zabbix proxy配置实战案例

    zabbix proxy配置实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.zabbix proxy概述 上一篇博客我们分享了zabbix agent有两种工作模式,即 ...

  8. zabbix java gateway配置实战案例

    zabbix java gateway配置实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.部署tomcat服务 博主推荐阅读: CentOS: https://www. ...

  9. 10 Dubbo 配置实战

    Dubbo 配置实战 快速入门 dubbo 建议看这篇文章是在学习了快速入门 dubbo 那篇文章的基础上来学习 配置说明 文档地址 https://dubbo.apache.org/zh/index ...

随机推荐

  1. LeetCode通关:栈和队列六连,匹配问题有绝招

    刷题路线参考: https://github.com/chefyuan/algorithm-base https://github.com/youngyangyang04/leetcode-maste ...

  2. 一种简易但设计全面的ID生成器思考

    分布式系统中,全局唯一 ID 的生成是一个老生常谈但是非常重要的话题.随着技术的不断成熟,大家的分布式全局唯一 ID 设计与生成方案趋向于趋势递增的 ID,这篇文章将结合我们系统中的 ID 针对实际业 ...

  3. BeautifulSoup4的使用

    一.介绍 Beautiful Soup 主要是用来解析提取 HTML 和 XML 文件中的数据. 现在官网推荐使用 Beautiful Soup 4 ,已经被移植到了BS4中. 安装 Beautifu ...

  4. java对xml节点属性的增删改查实现方法

    package vastsum; import java.io.File; import java.io.FileWriter; import java.util.Iterator; import o ...

  5. ReentrantLock中的Condition(等待和唤醒)

    Condition 类的 awiat 方法和 Object 类的 wait 方法等效 Condition 类的 signal 方法和 Object 类的 notify 方法等效 Condition 类 ...

  6. wpf 中的矩形的歪斜

    <Grid> <Rectangle x:Name="rect12" Width="100" Opacity="1" Hei ...

  7. cookie实现访问时间查看

    package day01.cookies; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEn ...

  8. JDBC中的元数据——1.数据库元数据

    package metadata; import java.sql.Connection; import java.sql.DatabaseMetaData; import javax.sql.Dat ...

  9. ProjectEuler 006题

    题目: The sum of the squares of the first ten natural numbers is, 12 + 22 + ... + 102 = 385 The square ...

  10. 目录-理解ASP.NET Core

    <理解ASP.NET Core>基于.NET5进行整理,旨在帮助大家能够对ASP.NET Core框架有一个清晰的认识. 目录 [01] Startup [02] Middleware [ ...