Feign和RestTemplate 怎么处理降级的返回?

来源:8-22 扩展Sentinel01-错误页优化

zengchen

2019-08-19

  • 普通spring mvc的资源用UrlBlockHandler
  • @SentinelResourceblockHandlerfallback
  • RestTemplate 的@SentinelRestTemplate也有blockHandlerfallback,但这是个总入口,怎么细分呢?
  • Feign 的@FeignClientfallback对应的是Hystrix,能适用sentinel吗?
写回答

1回答

大目

2019-08-19

1. 普通spring mvc的资源用UrlBlockHandler

是的

2. @SentinelResource 用 blockHandler,fallback

是的

3. RestTemplate 的@SentinelRestTemplate也有blockHandler,fallback,但这是个总入口,怎么细分呢?

对于RestTemplate没法细分哈,你继续往下看,最后一段就可以解释为什么没法细分。

4. Feign 的@FeignClient的fallback对应的是Hystrix,能适用sentinel吗?

FeignClient的fallback并没有对应xxx,你如果使用的是spring-cloud-starter-netflix-hystrix,那么就是Hystrix,如果用的是starter-alibaba-sentinel,那么就是Sentinel。本质的原因,是如果整合了Hystrix,那么用的是HystrixFeign去构建Feign的实例;如果用的是Sentinel,那么用的是SentinelFeign。


----------

您的总结挺好的,不过可以深化一下,不用把blockHandler、fallback想地太复杂。会很累的。你就想象成是个try...catch...就OK了。

发生xxx异常,就进入fallback/blockHandler。只不过,fallback/blockHandler处理的异常不一样,另外对于fallback,不同的版本处理的异常也不大一样而已。

而RestTemplate的调用,使用的是相同API去调用的,你很难根据请求目标地址不同,去指定不同的blockHandler处理。当然,理论上,在blockHandler里面,使用反射,可以拿到this,然后拿到请求的目标地址,然后做区分处理也是可以的。不过这种方式我没试过,而且想想都感觉复杂,可读性比较差。

1
1
zengchen
非常感谢!
2019-08-19
共1条回复

Spring Cloud Alibaba微服务从入门到进阶

面向未来微服务:熟练掌握Spring Cloud Alibaba

3085 学习 · 1324 问题

查看课程