重试功能
gateway 本身是支持重试的(retry ), 只有简单请求会被重试(get)
只会对连接超时进行重试,响应超时不会进行重试
比如: 前一种可能是网络不通
后一种是连接已经建立,接口已经调用到,但是业务方法执行太长,导致超时(504)
2. 快速失败
gateway 默认采用 webflux ,响应式模型
对于客户端的管理采用的是 spring cloud LoadBalancerClient 接口,该接口没有关于快速失败的定义
所以gateway也就不支持ribbon的快速失败功能 (ribbon进入维护阶段,所以gateway的开发者不希望直接依赖ribbon)
需求
不支持快速失败的网关,一旦出现服务异常,只能等待注册中心的过期移除,对系统的稳定性会造成非常大的影响
为了系统的稳定,只能自己实现了,通过下面的组件实现
Hystrix + ribbon
Hystrix 帮我们转换与定义超时(504) 异常是否再重试
ribbon 已经提供了一套快速失败功能,在它的基础上应用
效果
最大超时时间为12s,重试3次(4)
每次最大超时时间 3s
统计服务异常,连续异常超过3次,进入短路保护,30秒之内不再被调用
重试也会统计异常信息
配置
第一个 Hystrix , 全局超时控制 , (官方)
Retry 开启重试, (官方)
RibbonStatsRecorder ribbon异常统计 (自实现)
第二个 Hystrix , 每次超时控制
实现
新增 RibbonStatsRecorder
首先我们在 Retry 之后增加一个相关统计的过滤器 RibbonStatsRecorder
该过滤器会在调用结束后统计服务状态
代码如下:
请注意标红的代码,需要把服务实例信息传过来,所以需要重写LoadBalancerClientFilter
重写 LoadBalancerClientFilter
改变官方 LoadBalancerClientFilter 的逻辑,将 服务实例 暂存起来,让后续的统计过滤器能访问到
增加 Hystrix 异常回调控制
这里对 响应超时(504) 进行异常转换,让其也会进行重试。
如果不想504也进行重试,删除此代码或不配置回调即可