springcloud-gateway-源码之降级篇
发布网友
发布时间:2022-12-08 18:52
我来回答
共1个回答
热心网友
时间:2023-09-21 18:07
这篇文章主要从源码的角度剖析gateway是这么对我们的请求进行降级的
springcloud-gateway 熔断降级也是基于hystrix实现的
Hystrix是Netflix开源的一个限流熔断的项目、主要有以下功能:
隔离(线程池隔离和信号量隔离):*调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
优雅的降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
先来看一张图回顾下Hystrix熔断处理的过程
熟悉Hystrix的同学对这张图是不是很熟悉?
好了,回顾了Hystrix的流程之后,我们再正式探索下springcloud-gateway的熔断原理
首先springcloud-gateway的熔断是依赖filter实现的,给我们提供了一个名为HystrixGatewayFilterFactory的工厂类,这个类的apply方法返回一个GatewayFilter类的匿名对象来处理请求,我们来看下这个类的apply方法内容
这里红框出构建了RouteHystrixCommand对象,而HystrixObservableCommand的继承关系
可见它继承了HystrixObservableCommand这个类,是不是和上图完美契合呢?
源码中这个匿名的过滤器中调用了这个command.toObservable方法并监听其事件,最终调用的是AbstractCommand的toObservable方法
我们看下
跟进去发现调用了 applyHystrixSemantics方法如图
继续,发现调用OnError方法
再进入调用如下
不多说继续
最后回到RouteHystrixCommand的resumeWithFallback方法
留意红框处获取DispatcherHandler对象并调用其handle方法,
遍历handlerMappiing这里匹配的mapping为RouterFunctionMapping返回HandlerFunction对象,我这里是HystrixFallbackHandler对象
根据HystrixFallbackHandler对象匹配到HandlerFunctionAdapter并调用其handle方法跟进去最终调用的是HystrixFallbackHandler的handle方法
最后返回HandlerResult对象给DispatcherHandler,完成整个降级的过程。