
Feign组件默认使用Ribbon的重试机制并增加了根据状态码判断重试机制,默认情况下是不启用的。Feign使用的是Spring Retry组件,需要引入依赖才能启用。
eureka-client 是自己的serverId, MaxAutoRetries 同一台服务器上的最大重试次数(不包括第一次尝试), MaxAutoRetriesNextServer 要重试的下一个服务器的最大数量(不包括第一个服务器), retryableStatusCodes 可以根据接口返回的状态码判断是否重试其他服务, OkToRetryOnAllOperations 只对所有的超时请求重试
注意 : Ribbon的重试机制只有对GET请求或者设置了OkToRetryOnAllOperations生效 详情请查看源码:
Feign对返回状态码做了重试判断RetryableFeignLoadBalancer
重试机制用的是Spring Retry组件当抛出异常时进行重试!
GET请求指的是feign client 请求其他client时声明的那个interface中mapping注解类型,RequestMapping不设置method默认为GET请求
首先看Contract这个接口类中只有一个parseAndValidatateMetadata方法,其余两个都是子类,我们可以打个断点逐步跟一下。
其中BaseContract这个类主要是做数据验证的功能
断点进来之后我们可以看到,实例中是一个IService的类,然后下面有两个checkState方法,checkState方法是做个验证,如果第一个参数true则走过,如果是false则返回异常信息。
其中targetTypegetTypeParameters()是获取类的泛型,在Feign中是不允许有泛型的,如果有则返回Parameterized types unsupported class name的异常
第二个targetTypegetInterfaces()length <= 1的意思就是这个类只能做单继承,否则继续抛出异常。
这个验证如果没问题就尽心下一个验证了:
如果这个类继承了一个类,那么我们就看下继承的类是否又继承了类,如果又继承了,则抛出错误: 该类仅支持单层次的继承。
这个方法就是判断类不能是个对象,也不能有static方法,下面还有个UtilisDefault(method)方法:
这里是判断方法不能仅仅是个pulic方法,且必须是个接口才行,看不懂的可以参见帖子:
>
在一次与前端联调中,发现一个新增接口一直报错:
开始的我以为请求参数序列化异常,或者有特殊字符,通过格式后检查,并不是!
通过对请求参数(参数格式为:application/json)的格式化进行检查,发现并没有特殊字符,最主要的是:我本地请求接口也报了这个错 (! - !)!后面一次偶然的尝试,我发现将请求的json列表参数去掉几个,就成功了~,初步段定:参数过大!
这里需要提一点:我们的项目是使用的微服务架构,采取的DDD模式开发,所有的前端请求必须先通过路由到聚合BFF服务,然后才是将需要的参数请求到后端核心CORE服务。本次的问题:由前端触发,聚合层转发,核心层报错。
通过之前的分析,知道了 Illegal character ((CTRL-CHAR, code 31)) 的问题是因为聚合层往核心层进行过feign调用时参数过大,经过网络传输到达后端服务时数据丢失导致解析失败。所以接下来调整聚合层的feign的压缩配置:
我们项目使用的openfeign,网上有他的官方配置文档: >
Feign是一个>
以上就是关于一文详解Spring Cloud Feign重试机制全部的内容,包括:一文详解Spring Cloud Feign重试机制、SpringCloud系列之Feign-8.深入了解FeignContract协议解析过程、【已解决】Illegal character ((CTRL-CHAR, code 31)) 排查解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)