当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花
前言
今年主要会做一个比较完整的微服务项目开源出来。目前已经开始了,刚兴趣的先Star一个吧。
项目:https://github.com/yinjihuan/kitty-cloud
基础框架:https://github.com/yinjihuan/kitty
在做的过程中遇到一个问题那就是标题所说的两个框架碰撞了火花。都是S开头的谁都不服谁。
问题描述
既然使用了Sentinel来限流,那么干脆熔断也直接用Sentinel好了,所以就没使用Hystrix了。
Sentinel对Feign做了适配,使用的时候只需要引入spring-cloud-starter-alibaba-sentinel,如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
然后在配置文件打开 Sentinel 对 Feign 的支持:feign.sentinel.enabled=true就可以了。
一开始都很正常,平平淡淡的小日子过得也挺舒坦。
突然有一天,来了一位同姓但不同名的哥们,它叫Sleuth。
Spring Cloud Sleuth为Spring Cloud实现了分布式追踪解决方案。可以配合Zipkin或者Jaeger使用。
自从Sleuth来了之后,Sentinel Feign 的日子就不好过了,莫名其妙熔断回退失效了。
问题排查
Sentinel 对 Feign 的适配入口在SentinelFeignAutoConfiguration中。
主要是构建了Feign 的 Builder类,只要这个类被自动配置了,那么Sentinel 对 Feign 的支持也会生效。突然不生效了,那么肯定是这里有问题。
于是开启debug模式,发现启动的时候这里没有执行。feign.sentinel.enabled已经配置了,剩下就只有@ConditionalOnMissingBean的问题了。
@ConditionalOnMissingBean的作用是如果容器中已经有Builder那么这里就不会执行。
接下来就要看Sleuth的代码了,之所以能马上知道是Sleuth影响了,是因为一开始都是正常的,加了Sleuth后就出问题了。
在Sleuth中Feign相关的配置是在TraceFeignClientAutoConfiguration中。
可以看到,Sleuth中对Feign Builder也有配置,一种是如果开启了Hystrix就用SleuthHystrixFeignBuilder,如果没有开启就用SleuthFeignBuilder。
在这里打个断点,启动时直接就进来了,这边执行完后Builder对象就有了,所以Sentinel中的自然就不会执行了。
解决方案
发生冲突的根本原因在于两个框架都要对Feign进行扩展,Sentinel扩展是为了再调用的时候可以实现限流熔断等功能。Sleuth扩展是为了使用Feign调用接口的时候可以传递链路跟踪的信息。
要想解决这个问题,要么妥协只用一个框架,这样是最简单的。
要么看看Sleuth后面会不会支持Sentinel,目前可以看到已经支持了Hystrix。
最后一种就是自己改源码,将Sentinel融入到Sleuth中。
SleuthFeignBuilder 中只是对Client做了包装。
SentinelFeign 中只是对Builder做了增强。
所以我们只要把两者结合起来就可以了。
PS:没Star的现在接着Star吧!
项目:https://github.com/yinjihuan/kitty-cloud
基础框架:https://github.com/yinjihuan/kitty
当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花的更多相关文章
- Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探
目录 Spring Cloud Alibaba | Sentinel: 分布式系统的流量防卫兵初探 1. Sentinel 是什么? 2. Sentinel 的特征: 3. Sentinel 的开源生 ...
- Spring Cloud Alibaba | Sentinel: 服务限流基础篇
目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...
- Spring Cloud Alibaba | Sentinel: 服务限流高级篇
目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战 Springboot: 2.1.8.RELEASE SpringCloud: Greenwich.SR2 ...
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战 在阅读本文前,建议先阅读<Spring Cloud Alibaba | Sentinel:分布式系 ...
- Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则
Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则 前面几篇文章较为详细的介绍了Sentinel的使用姿势,还没看过的小伙伴可以访问以下链接查看: &l ...
- Spring Cloud Alibaba Sentinel对Feign的支持
Spring Cloud Alibaba Sentinel 除了对 RestTemplate 做了支持,同样对于 Feign 也做了支持,如果我们要从 Hystrix 切换到 Sentinel 是非常 ...
- Spring Cloud Alibaba Sentinel对RestTemplate的支持
Spring Cloud Alibaba Sentinel 支持对 RestTemplate 的服务调用使用 Sentinel 进行保护,在构造 RestTemplate bean的时候需要加上 @S ...
- 0.9.0.RELEASE版本的spring cloud alibaba sentinel+feign降级处理实例
既然用到了feign,那么主要是针对服务消费方的降级处理.我们基于0.9.0.RELEASE版本的spring cloud alibaba nacos+feign实例添油加醋,把sentinel功能加 ...
随机推荐
- 1. postman使用
postman使用教程: https://blog.csdn.net/fxbin123/article/details/80428216 http://bayescafe.com/tools/use- ...
- 远程调试docker构建的weblogic
环境信息 OSType: CentOS Linux 7 (Core) x86_64 3.10.0-957.21.3.el7.x86_64 DockerVersion: 19.03.8 Mirrors: ...
- cmdb采集数据的版本
在局部配置文件中配置MODE=' agent',或者MODE=‘ssh’,或者MODE=‘’saltstack ', 实现只需要修改这个配置,就会使用对应的方案进行采集数据 第一种版本: 启动文件中 ...
- Diagnostics: File file:/private/tmp/spark-d4ebd819-e623-47c3-b008-2a4df8019758/__spark_libs__6824092999244734377.zip does not exist java.io.FileNotFoundException: File file:/private/tmp/spark-d4ebd819
spark伪分布式模式 on-yarn出现一下错误 Diagnostics: File file:/private/tmp/spark-d4ebd819-e623-47c3-b008-2a4df801 ...
- Manjaro更新后 搜狗拼音输入法突然无法正常使用
之前Manjaro已经用了很久了,很多该配置的都已经配置好了,但是搜狗拼音在系统更新后突然无法使用 1检查 如下依赖 2.检查配置文件 3.发现一切配置没问题,此时输入 sogou-qimpanel ...
- c++ 的vector sort遇到栈错误
在做pat乙级1082 射击比赛时 遇到了sort 段错误. 题目链接:https://www.patest.cn/contests/pat-b-practise/1082 感觉写的没啥毛病 但就是段 ...
- 使用scrapy-selenium, chrome-headless抓取动态网页
在使用scrapy抓取网页时, 如果遇到使用js动态渲染的页面, 将无法提取到在浏览器中看到的内容. 针对这个问题scrapy官方给出的方案是scrapy-selenium, 这是一个把sel ...
- 探索学习率设置技巧以提高Keras中模型性能 | 炼丹技巧
学习率是一个控制每次更新模型权重时响应估计误差而调整模型程度的超参数.学习率选取是一项具有挑战性的工作,学习率设置的非常小可能导致训练过程过长甚至训练进程被卡住,而设置的非常大可能会导致过快学习到 ...
- CVPR 2019细粒度图像分类竞赛中国团队DeepBlueAI获冠军 | 技术干货分享
[导读]CVPR 2019细粒度图像分类workshop的挑战赛公布了最终结果:中国团队DeepBlueAI获得冠军.本文带来冠军团队解决方案的技术分享. 近日,在Kaggle上举办的CVPR 201 ...
- 寻找一把进入 Alibaba Sentinel 的钥匙(文末附流程图)
经过前面几篇文章的铺垫,我们正式来探讨 Sentinel 的 entry 方法的实现流程.即探究进入 Alibaba Sentinel 核心的一把钥匙. @ 目录 1.SphU.entry 流程分析 ...